オセロをつくる 先読みさせてコンピューターをもっと強くするで作成したオセロをJavaScriptで作ってみました。実際にはTypeScriptで書いたものをコンパイルしてJavaScriptに変換しています。やっぱりデスクトップアプリよりもwebで遊べるもののほうが見る側としてはいいですよね。

↓クリックすれば遊べます。ためしにどうぞ。

ではコードを示します。といってもアルゴリズムはC#と同じで書き方が違うだけです。

以下はセルの場所と色を管理するクラスです。IsEmpty関数は石が置かれていないかどうかを調べます。Colorプロパティが”green”であれば石は置かれていないと判断します。Draw関数が呼び出されたら背景を緑で塗りつぶし、石を色付きの円で表示します。

以下はコンピュータの次の手の候補の情報を管理するクラスです。

以下はグローバル変数です。

本体部分になるMain()関数を示します。

最初に盤面を表示するためのセルをつくります。そしてクリックされたときに対応できるようにEventListenerを追加してクリックされたら着手できるようにします。

ShowString関数は盤の下側に「そこには打てません」などの文字列を表示するためのものです。

CreateCells関数は最初に1回だけ実行されるセルオブジェクトの配列を生成する関数です。

GetCell関数はセルの配列から指定した位置のセルを取得するためのものです。

GameStart関数は名前のとおりゲームを開始するときによばれる関数です。GetCell関数で初期配置の位置に石をセットします。そして後述のDrawCells関数を呼び出してCanvasを再描画をします。

DrawCells関数はセルの状態が変化したときに全体を再描画するときに呼び出す関数です。セルを描画したあと境界線を描画します。

OnCellClicked関数は盤上をクリックしたときに呼び出されます。クリックされた部分に石を置くことができるか調べて不適切なクリックに対してメッセージを表示します。適切なクリックであれば石を配置して挟んだ石をひっくり返します。着手してから実際に石がひっくり返されるまで0.5秒の間をおいています。

GetRevarseStones関数はその位置に石を置くと相手の石を挟めるか調べるためのものです。8方向それぞれについて調べています。

Reverse関数は実際に相手の石をひっくり返すためのものです。1秒あいだをあけてコンピュータが着手をおこないます。

EnemyThink関数はコンピュータの着手に関する処理をおこなう関数です。コンピュータは角をとれるときは角をとり、そうでないときはコンピュータの着手の直後とその1ターン後にプレイヤーに角を取られない場所を探します。そのような場所が見つからないときは乱数で次の一手を決め、次の手が存在しないときはパスをします。

GetRevarsePlace関数はコンピュータが次の手を考えるときに、石が置かれていない場所でプレイヤーの石を挟むことができる場所を探すためのものです。

PutStoneTentative関数はコンピュータが次の手を考えるときに、ためしに石を置いたときのセルの配列を取得するための関数です。

CanDepriveCorner関数は自分の手番なら角を奪えるかを調べるためのものです。

GetCanDepriveCornerMax関数は角に置いたときにひっくり返すことができる石がどれだけあるか調べるためのものです。

SearchEnemyHandNotDepriveCorner関数は、コンピュータが次の手を考えるときにプレーヤーに角を取られない場所を探すための関数です。

EnemyReverse関数は、実際にコンピュータが着手したときに石をひっくり返す処理をする関数です。

コンピュータが着手したらプレイヤーの手番になるが、そのときにプレイヤーの次の手は存在するのかを調べて、存在しない場合はパスの処理をおこなわなければなりません。ChangePlayerTurn関数はそのための関数です。コンピュータもパスしたらゲーム終了です。

ゲームが終了したら双方の石を数えて結果を表示することになりますが、そのためにEnd関数が呼び出されます。