リバーシをプログラミングしてみた

2020年12月22日

phina.jsの基礎も学んだのでリバーシを作ってみた。弱い。

誰が弱いって?

phina.js

GUIはphina.jsで作ってみた。Unityではブラウザでうまく動かせなかったが、phina.jsはPCでもスマホでも動くところが嬉しい。スマホだと升を正確にタッチできないかもしれないので戻れるようにした。

リバーシの升目をGridクラスで表現した。升目ボードゲームにぴったりだ。

main.jsは1200行くらいになった。強くするにはもっとコードが必要そうだ。

コンピュータターンのときに表示が人側にあった。tweenerのcallを使うことで、ターン表示が変わった後にコンピュータの自動ターン処理が動くようになった。はじめsetTimeoutを使っていたが、これで時間を指定せずに済んだ。

bitboard

8×8のボードを64bitで表現するbitboardを使ってみた。将棋や囲碁は64bitでは足りないが、リバーシはぴったりだ。JavaScriptだとBigIntで使える。数字の最後にnを付けると数字もBigIntとして使える。ボードの状態のコピーが簡単で省メモリなのが嬉しい。配列とかだと深いコピーが面倒だ。ただ、人が見るにはわかりにくい。A1を上位bitにしたので16進数が分かる人なら配置がなんとなくわかる。16進数で二桁が一行に相当する。処理するにはシフト演算必須だ。斜め方向も7bitシフトや9bitシフトで表現するところがなんとなく面白い。最適化すると速くなるのだろうが、分かりにくくなるのでそこまでしていない。

AI

αβ探索、評価関数等を試してみたが、なかなか思ったように動かず、すぐ角を取れてしまう。コードが間違っている可能性大だ。正しくコードを書けているか検証も難しかったので、諦めた。結局モンテカルロ法にした。でもすぐ角を取れてしまうので、候補手から角の方を外してみた。反応は速くしたいので最強でなくともいいが、自分より強くしたかったな。