def Win(self, color): legal_moves = GoBoardUtil.generate_current_color(self.board, color) shuai = [] for point in legal_moves: rt_moves = self.detect_immediate_win_for_a_point(point, color) if len(rt_moves) != 0: shuai.append(rt_moves[0]) if len(shuai) > 0: # print("shuai:", shuai) return shuai return False
def detect_immediate_win_for_a_point(self, current, color): # BLACK or WHITE, aka 1 or 2 occu = GoBoardUtil.generate_current_color(self.board, color) # # i_win_list = [] # print(current, color) check = self.four_in_5(current, occu) #print(check) upper = (self.board.size + 1)**2 if (0 < check) and (check < upper): # print("pass") if check not in i_win_list: i_win_list.append(check) # print(i_win_list) return i_win_list #the list with points that fits
def OpenFour_my(self, color): nodes_of_a_color = GoBoardUtil.generate_current_color( self.board, color) # print("nodes_of_a_color: ", nodes_of_a_color) i_win_list = [] for node in nodes_of_a_color: good = self.board.check_win_in_two_for_a_node_my(node, color) if good: for each in good: if each not in i_win_list: i_win_list.append(each) if len(i_win_list) != False: return i_win_list return False
def firstsixteen(self, board, color): game_end, win = self.board.check_game_end_gomoku() checkpoint = "killer mode" if self.Win(color): checkpoint = "Win" moves = self.Win(color) elif self.BlockWin(): checkpoint = "BlockWin" moves = self.BlockWin() elif self.OpenFour(color): checkpoint = "OpenFour" moves = self.OpenFour(color) elif self.BlockOpenFour(color): checkpoint = "BlockOpenFour" moves = self.BlockOpenFour(color) else: moves = GoBoardUtil.generate_legal_moves_gomoku(board) cur = GoBoardUtil.generate_current_color(board, color) if len(cur) == 0: #first step to go move = 35 #print(type(move)) print(1) return int(move) seikiro = [] #a list for ranking of best points xianfengsi = [] for i in moves: length, point = self.findlongestsequence(i, cur) if length != False: seikiro.append([length, point]) print(seikiro) for i in seikiro: if i[1] in moves: xianfengsi.append(i) print(moves) geili = sorted(xianfengsi, key=lambda x: x[0], reverse=True) print(geili) return geili[0][1] #return the best point return moves[0] #return
def genmove_cmd(self, args): """ Generate a move for the color args[0] in {'b', 'w'}, for the game of gomoku. """ board_color = args[0].lower() color = color_to_int(board_color) game_end, winner = self.board.check_game_end_gomoku() self.start_time = time.time() if game_end: if winner == color: self.respond("pass") else: self.respond("resign") return move = GoBoardUtil.generate_legal_moves_gomoku(self.board) if (self.policytype == "random"): best = None cur_max = 0 for i in move: if best == None: best = i gmax = 0 for _ in range(10): result = self.random(self.board, color, color) gmax += result if (gmax / 10) > cur_max: best = i cur_max = (gmax / 10) elif (self.policytype == "rule_based"): print(len(GoBoardUtil.generate_current_color(self.board, color))) if len(GoBoardUtil.generate_current_color( self.board, color)) <= 12: #how many moves we have played best = self.firstsixteen(self.board, color) move_coord = point_to_coord(best, self.board.size) move_as_string = format_point(move_coord) self.board.play_move_gomoku(best, color) self.respond(move_as_string) return best = None cur_max = 0 for i in move: if best == None: best = i gmax = 0 self.board.play_move_gomoku(i, color) for _ in range(10): result = self.rules(self.board, color, GoBoardUtil.opponent(color)) if result == "out": self.board.reset_point_gomoku(i, color) break else: gmax += result #print(wins) if (gmax / 10) > cur_max: best = i #print(best_move) cur_max = (gmax / 10) self.board.reset_point_gomoku(i, color) if best == PASS: self.respond("pass") return move_coord = point_to_coord(best, self.board.size) move_as_string = format_point(move_coord) if self.board.is_legal_gomoku(best, color): self.board.play_move_gomoku(best, color) self.respond(move_as_string) else: self.respond("illegal move: {}".format(move_as_string))