動作イメージ
再生ボタンを押すと動作イメージが見れる。
HTML構造
<body> <!---------------------------------------------------------> <!-- header --> <!---------------------------------------------------------> <header> <h1>じゃんけんゲーム</h1> </header> <!---------------------------------------------------------> <!-- main --> <!---------------------------------------------------------> <main> <div class="flex"> <div class="box"> <p>PC</p> <div class="imgarea"> <img id="pc" src="paa.png" alt="PCが出す手の画像"> </div> </div> <div class="vs"> <p>VS</p> </div> <div class="box"> <p>貴方</p> <div class="flex column"> <img id="guu" class="you" src="goo.png" alt="グ-の画像"> <img id="choki" class="you" src="choki.png" alt="チョキの画像"> <img id="paa" class="you" src="paa.png" alt="パーの画像"> </div> </div> </div> <p id="msg">貴方の手を選ぶと始まります。</p> </main> <!---------------------------------------------------------> <!-- footer --> <!---------------------------------------------------------> <footer> <p>Copyright SSSPRODUCT All Rights Reserved.</p> </footer> <!---------------------------------------------------------> <!-- JavaScript --> <!---------------------------------------------------------> <script src="sample.js"></script> </body>
ヘッダーに段落としてゲーム名称。
メインにPCがの出力するじゃんけんの手を表示する領域。
ユーザーがグー、チョキ、パーを選ぶ領域。
何等かのメッセージを表示する領域。
ボディーの終了直前にJavaScriptふぁいるを読み込む。
CSS
@charset "UTF-8"; * { margin: 0; padding: 0; } body { width: 100%; } h1 { margin-top: 5px; text-align: center; margin-bottom: 5px; } .flex { justify-content: center; display: flex; } .column { flex-direction: column; align-items: center; } img { width: 150px; height: 150px; } .box { width: 300px; height: 500px; border-style: solid; border-width: 1px; } .imgarea { text-align: center; line-height: 550px; } main p { font-size: 30px; } .vs { width: 200px; height: 500px; text-align: center; line-height: 500px; } #msg { margin-top: 5px; text-align: center; } footer p { margin-top: 5px; text-align: center; }
display:flexを使い
横方向と縦方向の
スタイルを整える。
ブラウザーで表示
起動すると最初はこのように表示される。
JavaScript
グー・チョキ・パーのエレメント取得
var elmguu = document.getElementById("guu"); var elmchoki = document.getElementById("choki"); var elmpaa = document.getElementById("paa");
ユーザーが選ぶ、グー、チョキ、パーのエレメントをグローバルで取得。
グー・チョキ・パーのクリックイベント監視
elmguu.addEventListener("click",goo,false); elmchoki.addEventListener("click",choki,false); elmpaa.addEventListener("click",paa,false);
グー、チョキ、パーがクリックされた時のイベントハンドラーを設置。
グー :関数goo
チョキ:関数choki
パー :関数paa
それぞれ呼び出す。
グー・チョキ・パーのマウスオーバーイベント監視
elmguu.addEventListener("mouseover",gooover,false); elmchoki.addEventListener("mouseover",chokiover,false); elmpaa.addEventListener("mouseover",paaover,false);
グー、チョキ、パーにマウスカーソルが乗った時のイベントハンドラーを設置。
グー :関数gooover
チョキ:関数chokiover
パー :関数paaover
夫々を呼び出す。
グー・チョキ・パー マウスオーバー
function gooover() { msout(); setbdr(elmguu.style); } function chokiover() { msout(); setbdr(elmchoki.style); } function paaover() { msout(); setbdr(elmpaa.style); }
夫々、似たような処理なので
更に関数を呼び出す。
関数:msout()
グー、チョキ、パーのborderを消す。
関数:setbdr()
グー、チョキ、パーの何れかを罫線で囲む。
グー・チョキ・パー全てのborderを消す
function msout() { elmguu.style.borderStyle = "none"; elmchoki.style.borderStyle = "none"; elmpaa.style.borderStyle = "none"; }
borderstyle=”none”を代入して
borderを消す。
グー・チョキ・パー 選択した手をboderで囲む
function setbdr(elmstyle) { elmstyle.borderStyle = "solid"; elmstyle.borderWidth = "2px"; elmstyle.borderColor = "red"; }
選択したエレメントを引数で受け取りboderを設定。
グー・チョキ・パー クリック
保守性等を考慮してコードで利用する定数をグローバルに定義。
定数定義
const CONSTchoki = 1;
const CONSTpaa = 2;
グローバルに
グー・チョキ・パーの定数を定義。
ファンクション
function goo() { janstr(CONSTgoo); } function choki() { janstr(CONSTchoki); } function paa() { janstr(CONSTpaa); }
夫々、似た処理なので
更に関数を呼び出す。
グー・チョキ・パー クリック 共通
グローバル変数定義
var intervalid; var pcstop = true;
intervalid
setInterval関数のidを格納。
pcstop
pcが手を選択中:false
pcの手が決定 :true
ファンクション
function janstr(hand) { var v0; message(" "); // メッセージクリア if ( pcstop == true ) { intval(); message("もう一度、手を選ぶと止まります。"); pcstop = false; return; } clearInterval(intervalid); pcstop = true; v0 = rand(); // 乱数取得 dsphand(v0); // 乱数によりグー・チョキ・パーを表示 v0 = judge(v0,hand); // PCと人間のジャンケン判定 dspjudge(v0); // 勝敗を判定して表示
メッセージをクリア。
PCの手が決定していたら
PCの手を選択中にする。
PCの手を決定させる。
乱数を取得。
乱数で得た数値をもとに、PCの手を表示。
PCの手とユーザーが選んだ手の勝敗を判定。
判定結果を表示。
PCの手 グー・チョキ・パーを繰り返し表示
function intval() { var i = 0; intervalid = setInterval(function () { dsphand(i); i++; if ( i > 2 ) { i = 0; } },100); }
100msおきにグー、チョキ、パーを順番に表示する。
乱数生成
function rand() { var randnum; randnum = Math.floor(Math.random() * 3); return(randnum); }
0~2までの乱数を生成。
PCの手を表示
function dsphand(hand) { var elm = document.getElementById("pc"); switch ( hand ) { case CONSTgoo : elm.src = "goo.png"; break; case CONSTchoki : elm.src = "choki.png"; break; case CONSTpaa : elm.src = "paa.png" break; } }
引数で受け取った値に応じた
ジャンケンの手、画像を表示する。
PCとユーザーの勝敗を判定
定数を定義
const CONSTwin = 1; const CONSTloss = -1; const CONSTdrow = 0;
勝ち
負け
引き分け
ファンクション
function judge(pc,you) { if ( ( pc == CONSTgoo ) && you == CONSTgoo ) return(CONSTdrow); if ( ( pc == CONSTgoo ) && you == CONSTchoki ) return(CONSTloss); if ( ( pc == CONSTgoo ) && you == CONSTpaa ) return(CONSTwin); if ( ( pc == CONSTchoki ) && you == CONSTgoo ) return(CONSTwin); if ( ( pc == CONSTchoki ) && you == CONSTchoki ) return(CONSTdrow); if ( ( pc == CONSTchoki ) && you == CONSTpaa ) return(CONSTloss); if ( ( pc == CONSTpaa ) && you == CONSTgoo ) return(CONSTloss); if ( ( pc == CONSTpaa ) && you == CONSTchoki ) return(CONSTwin); if ( ( pc == CONSTpaa ) && you == CONSTpaa ) return(CONSTdrow); }
PCの手と
ユーザーの手を
引数で受け取って
勝敗の判定結果を返す。
勝敗結果を表示
function dspjudge(jge) { if ( jge == CONSTdrow ) { message("あいこです。 もう一度、手を選ぶと始まります。"); return; } if ( jge == CONSTwin ) { message("あなたの勝ちです。 もう一度、手を選ぶと始まります。"); return; } if ( jge == CONSTloss ) { message("あなたの負けです。 もう一度、手を選ぶと始まります。"); return; } }
勝敗結果を引数で受け取って
勝敗結果をメッセージとして表示する。
メッセージ表示
function message(text) { var elm; elm = document.getElementById("msg"); elm.innerHTML = text; }
引数で受け取ったテキストを表示。
JavaScript全コード
// ******************************************************* // 定数定義 // ******************************************************* const CONSTgoo = 0; const CONSTchoki = 1; const CONSTpaa = 2; const CONSTwin = 1; const CONSTloss = -1; const CONSTdrow = 0; // ******************************************************* // グローバル変数 // ******************************************************* var intervalid; var pcstop = true; // ******************************************************* // グー・チョキ・パーのエレメント取得 // ******************************************************* var elmguu = document.getElementById("guu"); var elmchoki = document.getElementById("choki"); var elmpaa = document.getElementById("paa"); // ******************************************************* // クリックイベントリスナー // ******************************************************* elmguu.addEventListener("click",goo,false); elmchoki.addEventListener("click",choki,false); elmpaa.addEventListener("click",paa,false); // ******************************************************* // マウスオーバーベントリスナー // ******************************************************* elmguu.addEventListener("mouseover",gooover,false); elmchoki.addEventListener("mouseover",chokiover,false); elmpaa.addEventListener("mouseover",paaover,false); // ******************************************************* // グー マウスオーバァー // ******************************************************* function gooover() { msout(); setbdr(elmguu.style); } // ******************************************************* // チョキ マウスオーバァー // ******************************************************* function chokiover() { msout(); setbdr(elmchoki.style); } // ******************************************************* // パー マウスオーバーァー // ******************************************************* function paaover() { msout(); setbdr(elmpaa.style); } // ******************************************************* // グー・チョキ・パーのBorderを消す // ******************************************************* function msout() { elmguu.style.borderStyle = "none"; elmchoki.style.borderStyle = "none"; elmpaa.style.borderStyle = "none"; } // ******************************************************* // 変数で渡されたエレメントを罫線で囲む // ******************************************************* function setbdr(elmstyle) { elmstyle.borderStyle = "solid"; elmstyle.borderWidth = "2px"; elmstyle.borderColor = "red"; } // ******************************************************* // グーを選択 // ******************************************************* function goo() { janstr(CONSTgoo); } // ******************************************************* // チョキを選択 // ******************************************************* function choki() { janstr(CONSTchoki); } // ******************************************************* // パーを選択 // ******************************************************* function paa() { janstr(CONSTpaa); } // ******************************************************* // グー・チョキ・パー共通 // ******************************************************* function janstr(hand) { var v0; message(" "); // メッセージクリア if ( pcstop == true ) { intval(); message("もう一度、手を選ぶと止まります。"); pcstop = false; return; } clearInterval(intervalid); pcstop = true; v0 = rand(); // 乱数取得 dsphand(v0); // 乱数によりグー・チョキ・パーを表示 v0 = judge(v0,hand); // PCと人間のジャンケン判定 dspjudge(v0); // 勝敗を判定して表示 } // ******************************************************* // インターバル処理 // ******************************************************* function intval() { var i = 0; intervalid = setInterval(function () { dsphand(i); i++; if ( i > 2 ) { i = 0; } },100); } // ******************************************************* // 0~2の乱数を返す // ******************************************************* function rand() { var randnum; randnum = Math.floor(Math.random() * 3); return(randnum); } // ******************************************************* // 変数に一致する手を表示 // ******************************************************* function dsphand(hand) { var elm = document.getElementById("pc"); switch ( hand ) { case CONSTgoo : elm.src = "goo.png"; break; case CONSTchoki : elm.src = "choki.png"; break; case CONSTpaa : elm.src = "paa.png" break; } } // ******************************************************* // ジャンケンの結果を判定して返す // ******************************************************* function judge(pc,you) { if ( ( pc == CONSTgoo ) && you == CONSTgoo ) return(CONSTdrow); if ( ( pc == CONSTgoo ) && you == CONSTchoki ) return(CONSTloss); if ( ( pc == CONSTgoo ) && you == CONSTpaa ) return(CONSTwin); if ( ( pc == CONSTchoki ) && you == CONSTgoo ) return(CONSTwin); if ( ( pc == CONSTchoki ) && you == CONSTchoki ) return(CONSTdrow); if ( ( pc == CONSTchoki ) && you == CONSTpaa ) return(CONSTloss); if ( ( pc == CONSTpaa ) && you == CONSTgoo ) return(CONSTloss); if ( ( pc == CONSTpaa ) && you == CONSTchoki ) return(CONSTwin); if ( ( pc == CONSTpaa ) && you == CONSTpaa ) return(CONSTdrow); } // ******************************************************* // 引数で判定し結果を表示 // ******************************************************* function dspjudge(jge) { if ( jge == CONSTdrow ) { message("あいこです。 もう一度、手を選ぶと始まります。"); return; } if ( jge == CONSTwin ) { message("あなたの勝ちです。 もう一度、手を選ぶと始まります。"); return; } if ( jge == CONSTloss ) { message("あなたの負けです。 もう一度、手を選ぶと始まります。"); return; } } // ******************************************************* // メッセージを表示 // ******************************************************* function message(text) { var elm; elm = document.getElementById("msg"); elm.innerHTML = text; }
コメント