スポンサーリンク

【JavaScript】リバーシ(オセロ)の作り方を初学者向けに1行づつ解説!②【ゲーム】

javascript
勉強の為にJavaScriptでリバーシ(オセロ)を作りたい!
簡単なCPUを実装したい!

という方、初学者向けの解説記事です。

この記事を読んでできること

オセロの作り方を理解することができる
簡単なCPUを実装することができる

対象読者様

javascriptだけで簡単なゲームを作りたい方
コードの意味作り方を理解したい方

上記のような読者様を想定しております。

当記事では javascriptで初めて何かを作りたい方 を想定している為
4つのパートに分けて解説をしていきます。

今回はその第2回
クリックすると石が置けて、挟めたら石をひっくり返す(の準備)
まで解説していきます。

概要説明

今回は次回の準備となります。

画面に動きがなく、物足りないかもしれませんが、とても重要な箇所です。
今回と次回まで完了すれば、下記が完成しますので頑張りましょうm(__)m

◆ポイント

①alert を理解する
②関数 kousin() に追記する
③関数 touch()を完成させる

③のみ少し長めの関数になりますが、

①はたった1行のメソッド
②は簡単なif文の組み合わせ
③は基本的な配列とparseInt()/charAt()が分かれば大丈夫

ポイントを1行毎に解説していきますので、少しづつ作っていきましょう!

解説①alert を理解しよう!

 if (countWhite > countBlack) {
   alert("白の勝ち")
 }

alert()とは、下記のようにメッセージをブラウザに表示することができます。

使い方は極めて単純で
「alert(●●)●●に入れた言葉をアラートメッセージで表示しなさい
となります。

どんな文字列を表示させるか考えよう

ゲームをしていると色々なメッセージが表示されます。
「敵と出会いました」「GameOver」「アイテムを使いますか?」などなど

では、オセロのゲームをする時に出てきてほしいメッセージを考えてみると…

「白/黒が勝ちました!」
「引き分けです」

(石を置けないので)スキップします」

ざっくりこんなものでしょう。
これを別の関数で判定し、if文でメッセージを個別に用意すればゲームになりそうです。

では、早速メッセージ毎の条件を入力していきましょう。

解説②kousin() に追記しよう

let turnSIRO = canReverce(SIRO);
let turnKURO = canReverce(KURO);


if (countWhite + countBlack === 64 || (turnKURO === false && turnSIRO === false)) {
  if (countWhite > countBlack) {
  alert("白の勝ち");
  } else if (countWhite < countBlack) {
  alert("黒の勝ち");
  } else {
  alert("引き分け");
  }
return;
}


if (turnSIRO === false) {
alert("白スキップ");
myTurn = false;
} else if (turnKURO === false) {
alert("黒スキップ");
myTurn = true;
} else {
myTurn = !myTurn;
}
かなり長いですね…!
しかし、分けて考えれば難しくありませんので、順番に解説致します。

let =  turnSIRO/turnKURO について

この変数の理解には、紐づいている4つの関数を全て解説する必要があります。
その為、今時点では、「白/黒の石を置くことができるか判定したもの」とだけご認識いただくだけで大丈夫です。

true
なら 黒を置ける
falseなら  白は置けない

といった具合です。

白/黒の勝ち or 引き分け を判定しよう

まず、勝敗について考えましょう。
オセロでゲームが終了するのはこの2パターン

・8×8マス全てに石が置かれる
・白も黒も石を置けない

if (countWhite + countBlack === 64 || (turnKURO === false && turnSIRO===false )) {
   ーーーーーーここに処理してほしいことを書くーーーーーーー
 return;}

コードにおこしてみると↑のようになります。

全ての石とはcountWhite + countBlack の合計値
白も黒も石を置けないとはturnKURO === false && turnKURO=== falseの状態です。

そして一度でもこの条件に合致した場合は処理を抜ければよいので
returnを設置して完成です。

if文で条件を分けよう!

白の数の方が多い場合:if (countWhite > countBlack) ⇒ alert(“白の勝ち”)
黒の数の方が多い場合:if (countWhite < countBlack) ⇒ alert(“黒の勝ち”)
白と黒の方が同じ場合:if (countWhite = countBlack) ⇒ alert(“引き分け”)

このように条件を分けて、登録すればゲームっぽくなりますね。

手番がスキップされるか 判定しよう

if (turnSIRO=== false) {
   alert("白スキップ");
   myTurn = false;
   } else if (turnKURO === false) {
   alert("黒スキップ");
   myTurn = true;
   } else {
   myTurn = !myTurn;    
   }

続いては、どちらかの手番が飛ばされるかです。

 

白が置けないとはif (turnSIRO === false)を指します。
alert("白スキップ")を表示させて
自分のターンを飛ばすためにmyTurn = falseと設定して完了です。これの黒バージョンが青色の部分、どちらでもない場合が緑色の部分となります。

解説③touch() を作成しよう!

これで今回は終わりです!もう少し頑張りましょう!

function touch(a) {
    if (!myTurn) {
    return;
    }
let id = masu.target.id;
let tate = parseInt(id.charAt(4));
let yoko = parseInt(id.charAt(5));
let canReverseMasu = canReverceMasu(tate, yoko, SIRO);

if (canReverseMasu.length > 0) {
    for (let k = 0; k < canReverseMasu.length; k++) {
    put(canReverseMasu[k][0], canReverseMasu[k][1], SIRO);
    }

  put(tate, yoko, SIRO);
  kousin();
  }
}

押したマス目を特定して ひっくり返せるか調べ 白にひっくり返して 白の石を置く」

がこの関数を作成する理由です。
色分けした部分を順に解説します。

押したマス目を特定しよう

let id = masu.target.id;
let tate = parseInt(id.charAt(4));
let yoko = parseInt(id.charAt(5));
let canReverseMasu= canReverseMasu(tate, yoko, SIRO);

クリックした要素をlet id = masu.target.idで取得します。
このidは何か思い出してみましょう。

⇒の画像を見てみましょう。
これはタテ:3マス目/ヨコ:5マス目をクリックした時のidを確認したものです。

id = [masu24] という結果でした。
つまり、クリックした箇所のマス目を特定できるのです。

これを関数にいれてと…できればよいのですが
この方法には問題があります。

parseInt と charAt()

id = [masu24] ですが、これは数字ではなく文字として判定されてしまいます。
さらに[masu24]は文字列ですので、ピンポイントで24をそれぞれ抜き出す必要があるのです。

これを実現できるのが「parseInt()」「charAt()」です。

let tate = parseInt(id.charAt(4))

parseInt(●●)
■■.charAt(△△)

parseInt「●●を整数値に変換しなさい
■■.charAt(△△):「■■の△△番目の文字を抜き出しなさい

これを組み合わせると

「idの4番目の文字を抜き出して整数値に変換しなさい

となり、欲しかった24を抜き出して、変数に格納することができるのです。

ひっくり返せるマス目の色を変えよう

if (canReverseMasu.length > 0) {
    for (let k = 0; k < canReverseMasu.length; k++) {
    put(canReverseMasu[k][0], canReverseMasu[k][1], SIRO);
    }
  put(tate, yoko, SIRO);
  kousin();
  }
}
今回の最後になります。
canReverseMasu.lengthひっくり返せる方向の数を表します。
詳しくは③での解説しますが、
ひっくり返せる方向の数ひっくり返せる座標を白石にすることで
オセロゲームの「はさむ」を実現しています。

まとめ

ここまでで白黒の石をはさむ準備編終了です!
お疲れさまでした!

このパートをある程度分かっていると最も難しい次回の「ひっくり返す判定」の理解がグッと楽になります。

前:【JavaScript】リバーシ(オセロ)の作り方を初学者向けに1行づつ解説!①
次:【JavaScript】リバーシ(オセロ)の作り方を初学者向けに1行づつ解説!③