pythonでオセロを頑張る 3

今週もオセロを進めます

  • atomのパッケージ

atomにはパッケージをインストールし、様々な機能を追加することができるそうです。

atomを開いたときに出るWelcome guideからInstall a Package->Open Installerを選択
検索窓が出ると思うので、そこにパッケージ名を打ち込んでpackageを押せば、検索結果が出ます。

以下、一先ずダウンロードしたものです

japanese-menu
日本語化対応。

Script
Pythonatomで実行できる。
(Ctrl+Shift+Bとかで実行)
※日本語が入っていると上手く行かないようなので、今回は使用を諦めます。

autocomplete-paths
プロジェクト内のファイルパスをオートコンプリートに追加。

highlight-selected
選択したテキストと同じテキストをハイライトする。

indent-guide-improved
インデントをわかりやすく表示。
縦線がスーッとでます。pythonはインデントで動きが変わるため、かなり助かります。


atomは色々機能が多そうですね...。

  • 複数ファイルの実行

import XXX (.pyは付けない)
としてファイルを読み込めば大丈夫です。

#オセロのボードを定義する
class Board:

    #初期化関数
    #ボードが作られたときに呼ばれる
    def __init__(self):

......

上記のBoard.pyをメインで動くgame.pyと一緒に動かす場合は、
game.pyに

import Board

#テストコード
test1=Board.Board()
test1.print_board()

.........

とimportして、python3 game.pyなどと実行すれば大丈夫です

atomからgit/githubへのコミットができます

(GitやGit Hubが立ち上がっていないなら)
パッケージ->Git Hub->Toggle GitとToggle Git Hub
からGitとGitHubのサブ画面を起動します

多分、プロジェクト内に.gitのフォルダがあれば、Gitが勝手に読み込んでくれます。
リポジトリを作成していない場合は、Create〜〜から作ります・・・

・Gitへのコミット
Staged Changesにコミットするファイルを入れて
Commit messageにコメントを入力して
Commit to XXXX でコミットOKです。

GitHubへのpush
GitHubのウィンドウでStepにしたがい、Tokenを取得して登録します。
URLにはリポジトリのURLを入れます。

右下の矢印を選択。
Pushを選択します。

エラーが出るときもあると思いますが、落ち着いて英語を読んで指示に従えば何とかなります。

多分、pythonでオセロを頑張る 2のgitやgithubの設定をコマンドラインでする必要があります。

  • 今回の成果

Ai(ランダム)同士のオセロ対戦ができるようになりました。

    #着手可能数の検索
    def putnum(self,player):
        num=0
        for y in range(1,9,1):
            for x in range(1,9,1):
                #一個でもひっくり返せるならカウントする
                if self.reverse(player,y,x,False)>=1:num+=1
        return num

    #石の数を数える
    def stonenum(self,player):
        num=0
        for y in range(1,9,1):
            for x in range(1,9,1):
                if self.stone[y][x]==player:num+=1
        return num

ボードクラスに、着手可能数と石の数を数える関数を追加
パス処理や、勝敗判定に使います。

またボードクラスのreverseメソッドにboolの引数を追加しました。
bool=falseの時はひっくり返さずに、ひっくり返せる石の数だけ返却します。
bool=trueの時はひっくり返します。

#手番を格納するクラスを作成
class player:
    #初期化
    def __init__(self):
        #手番の色に変数を定義
        tmpBoard=Board.Board()
        self.black=tmpBoard.black
        self.white=tmpBoard.white
        #初手は黒から
        self.turn=self.black

    #手番を変更する
    def change(self):
        if self.turn==self.black:self.turn=self.white
        else :self.turn=self.black

    #手番を出力する
    def print_player(self):
        if self.turn==self.black:print("Black")
        else :print("White")

新たにプレイヤークラスを作りました。
これらで手番を管理します。

ランダムAIは以下としました

    while 1:
        x=random.randint(1,8)
        y=random.randint(1,8)
        if test1.reverse(test2.turn,y,x,False)>0:break

randintは第一引数<=x<=第二引数のランダムな値を返します。

パス判定等を追加して実行したのが以下です。

........
........
........
...WB...
...BW...
........
........
........
turn->Black
x?3
y?4
reverse=2
........
........
........
..BBB...
...BW...
........
........
........
turn->White
x?3
y?3
reverse=2
........
........
..W.....
..BWB...
...BW...
........
........
........

〜〜〜〜〜〜〜〜

BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
WWBWBWWW
.WWWWBWB
WWWWB.B.
turn->White
x?8
y?8
reverse=2
BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
WWBWBWWW
.WWWWBWW
WWWWB.BW
turn->Black
x?6
y?8
reverse=3
BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
WWBBBWWW
.WWWBBWW
WWWWBBBW
PASS!!
turn->Black
x?1
y?7
reverse=6
BBBBBBBB
BWWWWBBW
BBBBBWWW
BBBWBWWW
BBBBWWWW
BBBBBWWW
BBBBBBWW
WWWWBBBW
PASS!!
PASS!!
B=38VS26=W
Win!! Black

ちゃんと動きました。
今は両方の手番でランダムAIを使っていますが、片方の手番をinput()で受け取るようにすれば
AI vs Playerの対戦が完成します!!

  • 次回の予定

・Min-MaxによるAIの導入