示例#1
0
 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
示例#2
0
 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
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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))