pythonでオセロを頑張る 3
今週もオセロを進めます
- atomのパッケージ
atomにはパッケージをインストールし、様々な機能を追加することができるそうです。
atomを開いたときに出るWelcome guideからInstall a Package->Open Installerを選択
検索窓が出ると思うので、そこにパッケージ名を打ち込んでpackageを押せば、検索結果が出ます。
以下、一先ずダウンロードしたものです
japanese-menu
日本語化対応。
Script
Pythonがatomで実行できる。
(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
(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の導入