HTML部分

style.css

JavaScript部分

グローバル変数と定数を示します。

Cardクラスの定義

Cardクラスを定義します。メンバーはカードのスート(スペードかハートか?)と数字、卓上に存在するカードなのか、0からはじまる通し番号、シャッフルするときにつかわれる乱数です。

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

ページが読み込まれたらカードを初期化してスタートボタンがクリックされたらプレイを開始できるようにイベントリスナを追加します。

カードの初期化

カードを初期化する処理を示します。

最初にカードが表示されている部分にある要素をすべて削除し、生成しなおします。そしてゲーム開始時はカードはすべて裏向きなので裏向きのカードのイメージを生成して追加します。

同時にCardオブジェクトを生成して配列内に格納します。これはどこにどのカードがあるかを管理するためのものです。そして配列momoriesをクリアします。ここにはコンピュータ側が知っているカードの情報が格納されます。ゲーム開始時は当然のことながらどこに何があるかはまったく知らないので空にしておきます。

スコアを表示する処理を示します。

ゲーム開始の処理

ゲームを開始する処理を示します。ゲームはプレイヤーの先攻で始まります。

カードをクリックしたときの処理

プレイヤーの手番のときにカードをクリックするとカードが開きます。その処理を示します。

ゲームが開始される前やコンピュータ側の手番のとき、2枚目を選ぶときに1枚目と同じカードを選んだ場合、卓上に存在しないカードを選んだときは警告音を鳴らします。

カードを開ける処理をしたあと、それが1枚目のカードの場合は対応するオブジェクトをグローバル変数に保存します。2枚目のカードを開けた場合は数字があっているか調べます。

数字があっている場合は引き続きプレイヤーの手番です。合っていない場合はコンピュータ側の手番になります。

カードを開く処理と伏せる処理

カードを開く処理を示します。クリックされたボタンに相当するオブジェクトを参照すればそのカードのスートと番号がわかります。クリックされたボタンの子要素を削除し、スートと番号から生成されたイメージと置き換えます。これでカードが開いたように見せることができます。

また開かれたカードをコンピュータ側に記憶させます。記憶に重複が生まれないようにする方法もあるのですが、あえて重複が発生するようにしています。

カードを伏せる処理を示します。

カードの裏側のイメージを生成し、カードがある位置に存在するボタンの子要素を削除してこれと置き換えます。

カードを取り除く処理を示します。

要素を取り除いてしまうわけではなく、背景色と同じイメージと置き換えることでカードがなくなったように見せかけているだけです。また対応するCardオブジェクトのExistプロパティをfalseに変更しています。

コンピュータ側の着手

コンピュータ側の着手の処理を示します。

コンピュータ側はすでに開かれたカードをすべて覚えていることにします(これではコンピュータ側が強すぎるのでランダムに忘れさせる処理をいれてもいいかも……)。

コンピュータ側のアルゴリズムですが、記憶のなかに番号が同じカードのペアがあればそれを開きます。ない場合はまず記憶にないカードを開き、2枚目のカードとして記憶されているものがあればそれを開きます。ない場合は明らかに番号が合っていないカード以外からランダムに選びます。

ゲーム終了の処理

卓上のカードがなくなったらゲーム終了です。スコアを比較して大きいほうが勝ちです。