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)
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
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
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