へっぽこリバーシ
Table of Contents
1 なんすか?これ?
リバーシです。商標的に色々あるらしいのでオセロではありません。一人遊び用です。
2 遊び方
動作確認はWindowsXP SP3と Windows7 SP1 64bit で行いました。W系APIを使用していますのでWindows98 とかでは動かないかも。以下の7zファイルを適当なディレクトリに展開します。
7zファイルを展開して、reversi.exeを実行するとウインドが開くと思います。 マウスの左ボタンを押せばなんとなく始まるので、やってればなんとなく判ると思います。 終了するにはウインドを閉じてください。
パスできるか否かは自動判定されます。パスできる場合は適当な場所でクリックすれば CPUに手番が移ります。1個以上 石が取れる場合はパスはできません。必ずどこかに 置ける場所がありますので、よーく見て探して下さい(バグってたらゴメン)。
2ベキじゃないサイズのテクスチャを使っているのでOpenGL 2.x以上専用です。
ディレクトリ3d_objとimg_dataを展開しなかったり名前を変えたりすると 起動できません。
3 プログラムソース
D言語(2.0)で書かれています。
Windows API プロジェクトのWinAPIバインディングを少し手を入れて利用させていただいています。 D言語はコンパイラバージョンが変わると、すぐにコンパイルが通らなくなりますので、 現時点でコンパイルできるセットをwin32-r391c.tar.xzとして勝手に固めさせてもらいました。 そんな訳で、Windowsでしか動きません(^^;
zlib , libpng , libjpeg を、mingw用に野良ビルドしたものをスタティックリンク しています。また、乱数生成関数である メルセンヌ・ツイスタ をD用に野良ポートしています。
コンパイラは2012/12時点でgithubでメンテされている GDC を使用しました。 ただし、メインラインのtrunkはMinGW向けにビルドできません。 このため、MinGW向けに venix1さんがforkしているDMD2.060対応されたバージョンに少し手を入れて 使用しています(ビルドの参考)。
$ gdc -v Using built-in specs. COLLECT_GCC=C:\MinGW\gdc031_2060_463\bin\gdc.exe COLLECT_LTO_WRAPPER=c:/mingw/gdc031_2060_463/bin/../libexec/gcc/mingw32/4.6.3/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.6.3/configure --build=mingw32 --with-arch=i686 --enable-languages=c,d --prefix=/mingw/gdc031_2060_463 --enable-threads --enable-fully-dynamic-string --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-nls --disable-win32-registry --disable-symvers --disable-werror --enable-sjlj-exceptions --with-bugurl=https://bitbucket.org/goshawk/gdc/issue --disable-bootstrap --disable-shared --disable-libgomp --disable-libmudflap Thread model: win32 gcc version 4.6.3 (GCC)
ビルド方法は以下の通り。~/download/ の下にZIPアーカイブをダウンロードしたとします。作業ディレクトリは適当な場所だとします。
xz -dc ~/download/reversi_v001_src.tar.xz | tar xvf -
cd reversi_v001_src
xz -dc ~/download/win32-r391c.tar.xz | tar xvf -
./mk.sh -a
どちらかと言うとコンパイル環境を整えるのにかなり手間がかかりますが、それをいとわないという方 ならば適当に改造するなどして遊んでみてください。
4 制作メモ
TANEが厨坊だったその昔、任天堂のファミリーコンピュータ(*1)の周辺機器の一つに ファミリーBASIC(*2)なるものがありました。 この通称「ファミベ」を使えば、ゲーム機のファミコンでプログラムが作れるという (極めて一部の人にとって)夢のようなデバイスでした。 そして、BASICと言えばマイコンBASICマガジン(*3)。ファミベ向けにリストが 載っている数少ない雑誌でした。その後ファミベのプログラムだけを集めた別冊雑誌が発売されます。 この中に、コンピュータオセロが掲載されていました (2015/06/08追記: こちら に動画がありました)。 今にして思えば、たった2KBのメモリ容量の中に、思考時間は少し長かったですがちゃんと相手になる 思考ルーチンが入っていたのは驚きです。当時はどういうアルゴリズムで石を置く場所を 決定しているのかは判りませんでしたが、今ならそれっぽい物が作れるかも?いや、作れる ようになっているといいなぁ? と思い作ってみたという訳です。
最近のコンピュータリバーシだと、人が全く勝てないくらい強いらしいのですが、そもそも リバーシが強い訳でもなんでもないTANEには、どうやって最適な石の位置を決めるのか さっぱり見当が付きません。Webを検索してみてもアカデミックな方法はムズカシくって 理解もさっぱりです。そんな感じなので「とりあえず置ける場所に一通り置いてみて、 一番取れる数が多い場所にする」という、単純過ぎるアルゴリズムを実装してみました。 デバッグはCUIベースで COM vs COM 戦ができるようにしておき、変な位置に置いたり カウントを間違えたりしないかをザックリ確認してみました。
でも、同じアルゴリズムのCOM同士の対戦では毎回同じ結果で勝負が付く (因みにCPU時間で0.015秒で勝負が付きます)ので、強いのか弱いのかもさっぱり判りません。 そこで対人戦できるようにする訳ですが、OpenGLを使った3D表示にしたりとどうでも 良い所が面倒臭く、色々とハマリながらどうにかゲームとして成立する感じになりました。 ゲームを作るのって大変だなぁと思います。
で、肝心の強さですが少なくともTANEとはいい勝負になってます(^^;;;;;; あまり強くても デバッグできないのと、負けるとなんとなく腹が立つ気もするので、これでいいやって事にしました(^^;
そんな感じなので、もっと強い思考ルーチンにしたり音楽を付けたりするなど、適当に改造して 遊んでみてください。
(*1) ファミリーコンピュータ :1983年に発売されたゲーム機。じいちゃんばあちゃんがゲーム機の代名詞として使うファミコンとはこれを指す。
(*2) ファミリーBASIC :現在のプログラム言語に比べると随分と厳しい制限がありましたが、 それでも「そういうものだ」と思って使うには全然問題無しでした。
(*3) マイコンBASICマガジン :通称ベーマガ。TANEごときが説明する事も無いでしょう。