Ejemplo n.º 1
0
    def apply_move(self, vertex, colour):
        """ apply move to engine (and players). """
        captures = []

        self.validity_test_last_result = Utils.valid_coord(vertex, self.board.size)

        # check the validity of the move and determine any resulting captures
        self.validity_test_last_result = self.validity_test_last_result and Utils.check_move(
            self._board, vertex, colour, captures
        )

        if not self.validity_test_last_result:
            raise Exception("you played an invalid move: " + str(colour) + " " + str(vertex))

        self._moves.append(Move(vertex, colour, captures))

        # place the stone
        self._board.set_stone(vertex, colour)

        # apply any resulting captures
        self._board.remove_stones(captures)

        # apply influence values to board squares
        Utils.calc_influence(self._board)

        self._players[0].play(vertex, colour)
        self._players[1].play(vertex, colour)
Ejemplo n.º 2
0
 def genmove(self):
     b = self.engine.board
     size = b.size
     
     # check the corner blobs
     for blob in self.corners(b, 3):
         influence = self.influence_in_blob(blob)
         dominator = (1 if influence > 0 else 2)
         
         # enemy dominates it
         if dominator != self._colour:
             for coord in blob:
                 if b[coord].colour == 3 and Utils.check_move(b, coord, self.colour, []):
                     return coord
            
         # no one owns it yet    
         elif influence == 0:
             random.shuffle(blob)
             blob.sort()
             return blob[int(len(blob)/2)]
         
         # I dominate it ...
         else:   
             pass
     
     # nothing to do at the corners ...
     
     possible = [k for k in itertools.product(range(1, size+1), repeat=2) if b[k].colour == 3]
     random.shuffle(possible)
                 
     last_valid = None
     for v in possible:
         if Utils.check_move(b, v, self.colour, []):   
             last_valid = v  
             if random.choice(range(10)) == 1:
                 break
         
     return last_valid
             
     
Ejemplo n.º 3
0
 def genmove(self):
     ''' generate a move, return coordinates (tuple) or where i want to move.'''
     ''' coordinates are 1-based.'''
     # default behaviour: return first valid move
     b = self.engine.board
     size = b.size
     empty = []
     
     for c in range(1, size+1):
         for r in range(1, size+1):
             if b[c,r].colour == 3:
                 empty.append((c,r))
     for p in empty:
         if Utils.check_move(b, p, self.colour, []):
             return p   
     return None 
Ejemplo n.º 4
0
 def genmove(self):
     ''' politely ask user for a move. '''
     
     size = self.engine.board.size
     move = None
     while True:
         print("move:")
         move = sys.stdin.readline()
         if move.strip().lower() == "quit":
             sys.exit(0)
         
         move = Utils.parse_vertex(move, size)
         if Utils.valid_coord(move, size) and Utils.check_move(self.engine.board, move, self.colour, []):
             break
         else:
             print("invalid move")
     return move