という方、初学者向けの解説記事です。
この記事を読んでできること
・オセロの作り方を理解することができる
・簡単なCPUを実装することができる
対象読者様
②コードの意味・作り方を理解したい方
上記のような読者様を想定しております。
当記事では javascriptで初めて何かを作りたい方 を想定している為
4つのパートに分けて解説をしていきます。
今回はその第2回
クリックすると石が置けて、挟めたら石をひっくり返す(の準備)
まで解説していきます。
概要説明
今回は次回の準備となります。
画面に動きがなく、物足りないかもしれませんが、とても重要な箇所です。
今回と次回まで完了すれば、下記が完成しますので頑張りましょうm(__)m
◆ポイント
②関数 kousin() に追記する
③関数 touch()を完成させる
③のみ少し長めの関数になりますが、
②は簡単なif文の組み合わせ
③は基本的な配列とparseInt()/charAt()が分かれば大丈夫
ポイントを1行毎に解説していきますので、少しづつ作っていきましょう!
解説①alert を理解しよう!
if (countWhite > countBlack) {
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 について
その為、今時点では、「白/黒の石を置くことができるか判定したもの」とだけご認識いただくだけで大丈夫です。
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行づつ解説!③