#! /usr/bin/python3 # ================================================================== # 3D Matrix Gane - Define Classes, etc, # ================================================================== import random import game_matrix_config as cfg import game_matrix_menu as mnu # ---- set the random number generator seed. ----------------------- # ---- this is to insure that during testing the the same ---------- # ---- random numbers will be generated ---------------------------- random.seed(a=101) # ---- global data ------------------------------------------------- # CurrentNode matrix current (working) node # Debug flag - print debug messages # EndNode matrix path end node # MatrixEdge nodes per matrix dimensions (x,y,z) # StartNode matrix path start node # Verbose flag - print verbose messages # ------------------------------------------------------------------ global CurrentNode global Debug global EndNode global MatrixEdge global StartNode global Verbose # ---- matrix node class ------------------------------------------- class Node: ''' The node at each cell in the 3D matrix. Attributes: x node's x coordinate y node's y coordinate z node's z coordinate up y axis (y+1) adjacent node, if any down y axis (y-1) adjacent node, if any forward z axis (z+1) adjecent node, if any backward z axis (z-1) adjecent node, if any left x axis (x-1) adjecent node, if any right x axis (x+1) adjecent node, if any wormhole wormhole node, if any id node's ID (integer) ''' def __init__(self,x,y,z,id): ''' Initialize a matrix node. ''' self.x = x self.y = y self.z = z self.up = None self.down = None self.forward = None self.backward = None self.left = None self.right = None self.wormhole = None self.id = id def get_id(self): ''' Return a Node's id. ''' return self.id def get_coords(self): ''' Return a node's coordinates as a tuple (x,y,z). ''' return (self.x,self.y,self.z) def get_nav_info(self): ''' Return a node's navigation information as a list of tuples. The returned navigation tuples are (x,y,z) coordinates of the destination node or 'None' if there is no destination. The order of the list is [ up, down, forward, backward, left, right, wormhole ]. ''' navup = \ 'None' if not self.up else self.up.get_coords() navdown = \ 'None' if not self.down else self.down.get_coords() navforward = \ 'None' if not self.forward else self.forward.get_coords() navbackward = \ 'None' if not self.backward else self.backward.get_coords() navleft = \ 'None' if not self.left else self.left.get_coords() navright = \ 'None' if not self.right else self.right.get_coords() navwormhole = \ 'None' if not self.wormhole else self.wormhole.get_coords() return [ navup,navdown,navforward,navbackward,navleft, navright,navwormhole ] def set_up(self,node): ''' Set the up link. ''' self.up = node def set_down(self,node): ''' Set the down link. ''' self.down = node def set_forward(self,node): ''' Set the forward link. ''' self.forward = node def set_backward(self,node): ''' Set the backward link. ''' self.backward = node def set_left(self,node): ''' Set the left link. ''' self.left = node def set_right(self,node): ''' Set the right link. ''' self.right = node def set_wormhole(self,node): ''' Set the wormhole link. ''' self.wormhole = node def minimum_display(self): ''' Display basic node information (x, y, z, and id) ''' print('node: {},{},{} - {}'. format(self.x,self.y,self.z,self.id)) # ---- create_matrix def create_matrix(mtrxedge,id=100): ''' Return a matrix of unconnected nodes. (A cube mtrxedge by mtrxedge by mtrxedge) ''' mtrx = [] for x in range(0,mtrxedge): mtrx.append([]) for y in range(0,mtrxedge): mtrx[x].append([]) for z in range(0,mtrxedge): mtrx[x][y].append(Node(x,y,z,id)) id += 1 return mtrx # ---- reset 3D matrix of nodes def reset(mtrx,mtrxedge): ''' Reset all of the matrix nodes movement links. (up, down, forward, backward, left, right, wormhole = None) ''' for x in range(0,mtrxedge): for y in range(0,mtrxedge): for z in range(0,mtrixedge): mtrx[x][y][z].up = None mtrx[x][y][z].down = None mtrx[x][y][z].forward = None mtrx[x][y][z].backward = None mtrx[x][y][z].left = None mtrx[x][y][z].right = None mtrx[x][y][z].wormhole = None # ---- calculate the path start and end nodes def start_end_nodes(mtrxedge): ''' Calculate the coordinates of randomly selected start and end nodes for the path through the matrix. Return the coordinates as a tuple. (start_x,start_y,0,end_x,end_y,mtrxedge-1) Note the hard Z coordinate. ''' sx = random.randrange(0,mtrxedge) # start x sy = random.randrange(0,mtrxedge) # start y ex = random.randrange(0,mtrxedge) # end x ey = random.randrange(0,mtrxedge) # end y return (sx,sy,0,ex,ey,mtrxedge-1) # ---- display 3D matrix of nodes def display_matrix(mtrx,mtrxedge): ''' Display the minimum information about every node in the matrix. ''' for x in range(0,mtrxedge): for y in range(0,mtrxedge): for z in range(0,mtrxedge): mtrx[x][y][z].minimum_display() # ---- display a node's navigation information def display_node_nav_info(node): ''' Display a node's navigation information. Display: Available move directions Blocked move directions Wormhole available or not available ''' print('\nCoords: x={},y={},z={}'.format(node.x,node.y,node.z)) print('\nAvailable Move Directions:') if node.up: print(' up') if node.down: print(' down') if node.forward: print(' forward') if node.backward: print(' backward') if node.left: print(' left') if node.right: print(' right') print('\nBlocked Move Directions:') if not node.up: print(' up') if not node.down: print(' down') if not node.forward: print(' forward') if not node.backward: print(' backward') if not node.left: print(' left') if not node.right: print(' right') print('\nWormhole:') if node.wormhole: print(' available') else: print(' not available') # ---- display matrix information def display_matrix_info(): ''' Display matrix information. ''' print('Current Node: {}'.format( 'None' if not cfg.CurrentNode else cfg.CurrentNode.get_coords())) print('Start Node : {}'.format( 'None' if not cfg.StartNode else cfg.StartNode.get_coords())) print('End Node : {}'.format( 'None' if not cfg.EndNode else cfg.EndNode.get_coords())) print('MatrixEdge : {}'.format(cfg.MatrixEdge))