ナイト配置ゲームとは、8×8のチェス盤のうえにふたりで交互にナイトを置いていくゲームです。すでに置かれているナイトに取られる位置には置けません。置くことができなくなったほうが負けです。

まずはとりあえず動くものをつくります。

HTML部分

style.css

BitBoardクラスの定義

8×8のチェス盤を二次元配列で扱ってもよいのですが、ここでは2つの整数で表します。JavaScript の最大整数値は Number. MAX_SAFE_INTEGER という定数で定義されており、その値は 9007199254740991 です。2の64乗-1まで扱うことができればいいのですが、ちょっと足りないのでふたつの整数を使います。

着手があれば対応する位置(+着手禁止点)のbitを立て、bitが立っているかどうかでその位置に着手することができるかどうかを判定するという感じです。

index.js

Stateクラスの定義

盤上の状態を管理するためにStateクラスを定義します。ゲームの進行上、問題になるのは、そこに駒は置かれているか?その地点は着手可能か?のふたつです。このふたつを occupied と forbidden で表します。

Gameクラスの定義

Gameクラスを定義します。

コンストラクタ

コンストラクタを示します。

合法手の全取得

すべての合法手を取得する処理を示します。

着手後の盤面の状態の取得

着手後の盤面の状態を取得する処理を示します。

着手した地点に駒をおき、その地点とそこからナイトが移動できるすべての地点を着手禁止点に変更します。

コンピュータ側の処理

コンピュータ側が着手する処理を示します。今回は着手可能な地点をランダムに選んで着手するだけにしています。はっきり言って弱いです。

更新処理と描画

更新処理と描画の処理を示します。

以下は開始時と着手完了時に現在を盤面を表示する処理です。

リセット時の処理

ゲーム開始時や終局後に再挑戦するために現在の状態をリセットする処理を示します。

引数が true なら先手、false なら後手です。

ページが読み込まれたときの処理

ページが読み込まれたときの処理を示します。

以下はレンジスライダーでボリュームを調整するための定番の処理です。