読者です 読者をやめる 読者になる 読者になる

Python3.5.2でオセロを作る③

プログラミング

引き続き、オセロを作っています。

今回は四隅と、辺に位置する座標を優先的に取るAIです。

四隅の優先度を999とすることで実現しています。

勝率は、1000回中

BLACK_WIN:737 # 四隅を優先するAI WHITE_WIN:239 # 最大値を取るAI DRAW:24

となりました。四隅パワー凄し。

standard_move_ai.py

from ai import Ai


class StandardMoveAi(Ai):
    def turn(self, map, color):
        # ターンを管理する関数
        grid = self.grid(map, color)
        # 全ての候補座標
        grid = self.max_grid(grid, map, color)
        # 評価が最大の座標
        if grid == 0:
            return
        else:
            y = int(grid[0])
            x = int(grid[1])
            map[y][x] = color
            self.up_scan(map, color, y, x)
            self.right_scan(map, color, y, x)
            self.down_scan(map, color, y, x)
            self.left_scan(map, color, y, x)
            self.upper_left_scan(map, color, y, x)
            self.lower_left_scan(map, color, y, x)
            self.upper_right_scan(map, color, y, x)
            self.lower_right_scan(map, color, y, x)

    def max_grid(self, grid, map, color):
        # 四隅
        standard = [[1, 1], [8, 1], [1, 8], [8, 8]]
        # 四隅の隣以外の、壁の部分
        side = [[1, 3], [1, 4], [1, 5], [1, 6],
                [3, 1], [4, 1], [5, 1], [6, 1],
                [8, 3], [8, 4], [8, 5], [8, 6],
                [3, 8], [4, 8], [5, 8], [6, 8]]
        score = 0
        max_score = 0
        grid_list = 0
        for x in grid:
            score = self.grid_evaluation(x, map, color)
            if x in standard:
                max_score = 999
                grid_list = x
            elif x in side:
                max_score = 500
                grid_list = x
            elif max_score <= score:
                max_score = score
                grid_list = x
            # print("max_score:" + str(max_score))
            # print("score:" + str(score))

        return grid_list