プログラミング奮闘記

python勉強の記録 ビットボードを使ったオセロ

投稿日:

前々から勉強しようと思っていた、ビットボードについて勉強しました。

参考にしたのはこの記事

https://qiita.com/sensuikan1973/items/459b3e11d91f3cb37e43

勉強がてらpythonでコードを書いてみたので、今回はそのコードの公開と参考にした記事(ほぼ丸コピ)との変更点などを書いていきます。

この記事の目的は相変わらず以下の三つ。

  • 詳しい方に添削して欲しい
  • 気になる方へのコードの開示
  • 自分の理解を深める

想定読者はpythonがある程度できて、オセロのビットボード実装に興味がある方です。

ビットボードとは

ビットボードとは「盤面をビットで表したもの」です。

盤面:

ビットボード:

黒:1111110000111000000000001000000011000100110000001111110000000000

白:0000001111000111111111110111111100111011001111110000001111111111

左上から右下に、64マスの情報を64bitに

 

コンピューターは0と1の情報(bit)で動くので、ビットボードで実装するのが効率がいいのです。

詳しい解説は参考にした記事を見てください。(丸投げ)

 

どんなプログラムを作ったん?

棋譜(F5D6形式)を受け取って、終局までの「盤面」と終局時の「結果(石数、勝者)」を返すプログラムです。

基本的に棋譜は「正しい棋譜」を想定しています。

このプログラムは何かに役立つものというよりは、実際に動いていることを確認するものです。

 

作った目的

先述の通り、勉強がてら。

参考にした記事ではSwift4でコードが書かれていたので、ほぼ丸コピでpythonで書きました。

 

コード

早速、書いたコード紹介。

 

主な変更点、追記箇所

変更点

プログラミング言語の違いがあるので細かい部分を変更しました。

  • var,Uint64などの定義は不要なので消去
  • 関数の定義の仕方(func→def)
  • pythonにはswitch関数がないのでif,elifで代用
  • グローバル変数とローカル変数の扱いが違う(理解しきれてない)
  • クラスの扱いも微妙に違う(63〜67行目の右辺にselfを追加)

追記箇所

正常に動くか視覚的に確認できるようコードを追記しました。

実際に動かした様子がこちら。

棋譜を入力すると、石を返していきます。

(0は空きマス、4は打った側の石、7は打たれた側の石)

パスになると、ちゃんと「isPass」と表示されていました。

実際の棋譜と終局図、石差、勝者全て一致しています。

このように動かすために以下のように追記しました。

  • BitTOBoardメソッドで盤面を表示
  • main関数を定義

BitTOBoardメソッド

コード

Boardクラスのメソッドです。

ごちゃごちゃと変換していきビットボードを盤面情報に変換してprintで表示します。

次のように変換していきます。(気になる方は表示をクリック)

表示

 

main関数

コード

Boardクラスのメソッドや関数をうまく使って動かします。

順番を考えるのに多少頭を使いました。

感想

あまりビットボードに関わる部分は変更しませんでしたが、pythonの勉強にはなりました。

ちゃんとコード全体を理解するように努めたので、ビットボードのおおよその使い方は理解できました。

合法手ボードの生成(makeLegalBoard関数)を理解するのが一番難しかったですが、なんとか理解できました。

実は棋譜を受け取って盤面を表示させるのは以前完全自作プログラムを作りました。(pythonで棋譜変換プログラムを自作しました)

しかし、ビットボードで実装した方がより直感的に、シンプルに書けて、また様々な応用が効きやすいと感じました。

今後機会があれば、ビットボードを使用して何かオセロのプログラムを作っていきたいです。

 

では、今回はつらつらと書きたいことだけ書く自己中記事でしたが、これで終わりにします。

またね!

広告

広告

-プログラミング奮闘記

Copyright© おせろく , 2024 All Rights Reserved Powered by AFFINGER4.