質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

1766閲覧

JavaScript 挙動する順番を変えたい ブラックジャック

hichu

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/19 16:57

編集2021/07/19 17:01

初学者です。
基本的な事かもしれませんが、詰まってしまったので教えていただけると嬉しいです。

作成しているもの
トランプのブラックジャックを作成しています。
基本的な挙動は実装できていると思います。

実現したいこと
勝負ボタンを押す→相手の裏になっているカードが表になってから、判定結果(アラート)を出したい。

詰まっているところ
勝負ボタンを押す→相手の裏になっているカードが表になる(相手の数字がわかる)前に
スコア計算され、判定結果のアラートが出てしまいます。

試したこと
・コードの順番を変えてみる。(アラートのコードを一番下にする)
・window.onload = function() {// 完全読み込み後に実行する処理}をはさんでみる。
を試しましたが、思うように挙動してくれませんでした。

聞きたいこと
なぜ今の順番になってしまうのか。
実現したいことをかなえるにはどうコードを追加すればいいか教えていただきたいです。

イメージ説明

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>ブラックジャック</title> 6 <link rel="stylesheet" href="../css/style.css"> 7</head> 8<body> 9 <main class="displayCenter"> 10 <div style="margin-bottom: 20px;"> 11 <button id="startBtn" onclick="start()">スタート</button> 12 <button id="drowBtn" onclick="drow()" disabled>カードを引く</button> 13 <button id="gameEndBtn" onclick="gameEnd()" disabled>勝負</button> 14 </div> 15 <div id="opponent" style="width:1000px;overflow:hidden;"> 16 </div> 17 <br/> 18 <div id="player" style="width:1000px;overflow:hidden;"> 19 </div> 20 <div id="cardblock"></div> 21 </main> 22 <script src="../js/test.js"></script> 23</body> 24</html>

JavaScript

1class Card { 2 //コンストラクタ 3 // "絵柄" suit 4 // "番号" no 5 constructor(suit, no) { 6 this.suit = suit; 7 this.no = no; 8 } 9 } 10//Cardクラスのインスタンスを保持する配列 11let arr = []; 12 13//プレイヤーのカード 14var playerCardList = []; 15 16//コンピューターのカード 17var opponentCardList = []; 18 19//ゲーム終了フラグ 20var gameEndFlg = false; 21 22//ゲームスタート 23function start() { 24// 初期化 25 init(); 26// 画面からカードを削除する 27//htmlのidから要素を取得して子要素をすべて削除 28 let opponentElement = document.getElementById("opponent"); 29 let playerElement = document.getElementById("player"); 30 opponentElement.innerHTML = ''; 31 playerElement.innerHTML = ''; 32 33//配列にnewを使ってオブジェクトのインスタンスを追加(ハートの1から13まで) 34for (let i = 1; i <= 13; i++) { 35 arr.push(new Card("h", i)); 36} 37 38//配列にnewを使ってオブジェクトのインスタンスを追加(スペードの1から13まで) 39for (let i = 1; i <= 13; i++) { 40 arr.push(new Card("s", i)); 41} 42 43//配列にnewを使ってオブジェクトのインスタンスを追加(クローバーの1から13まで) 44for (let i = 1; i <= 13; i++) { 45 arr.push(new Card("c", i)); 46} 47 48//配列にnewを使ってオブジェクトのインスタンスを追加(ダイヤの1から13まで) 49for (let i = 1; i <= 13; i++) { 50 arr.push(new Card("d", i)); 51} 52 53//配列をシャッフル 54arr = shuffle(arr); 55 56// シャッフルしたカードから二枚引く 57// ディーラー1回目 58var opponentCard1 = document.createElement("div"); 59opponentCard1.classList.add("card", "ura"); 60opponentElement.appendChild(opponentCard1) 61opponentCardList.push(arr.pop()); 62 63// ディーラー2回目 64var opponentCard2 = document.createElement("div"); 65const targetCard = arr.pop(); 66let cardClassNm = targetCard.suit + targetCard.no; 67//2枚目はカードを表で表示したので絵柄と数字からトランプの画像ファイルを表示するクラスを要素に設定 68opponentCard2.classList.add("card", cardClassNm); 69opponentElement.appendChild(opponentCard2); 70opponentCardList.push(targetCard); 71 72// プレイヤーのカードを引く 73for (let i = 0; i < 2; i++) { 74// カードを1枚引く 75 playerDrow(); 76} 77 78// スコアのチェックをする。 79scoreCheck(); 80//カードを配り終えた時点でスコアチェックを行う 81} 82 83//初期設定 84function init() { 85//ゲーム状況でボタン制御を行う 86 if (!gameEndFlg) { 87 // スタートボタンを非活性にする 88 let startBtnElement = document.getElementById("startBtn"); 89 startBtnElement.setAttribute("disabled", true); 90 91 // カードを引くボタンを活性にする 92 let drowBtnElement = document.getElementById("drowBtn"); 93 drowBtnElement.removeAttribute("disabled"); 94 95 // 勝負ボタンを活性にする 96 let gameEndBtnElement = document.getElementById("gameEndBtn"); 97 gameEndBtnElement.removeAttribute("disabled"); 98 } else { 99 // スタートボタンを活性にする 100 let startBtnElement = document.getElementById("startBtn"); 101 startBtnElement.removeAttribute("disabled"); 102 103 // カードを引くボタンを非活性にする 104 let drowBtnElement = document.getElementById("drowBtn"); 105 drowBtnElement.setAttribute("disabled", true); 106 107 // 勝負ボタンを非活性にする 108 let gameEndBtnElement = document.getElementById("gameEndBtn"); 109 gameEndBtnElement.setAttribute("disabled", true); 110 } 111 112 // カード情報を初期化する 113 playerCardList = []; 114 opponentCardList = []; 115 116 //ゲーム終了フラグをオフにする 117 gameEndFlg = false; 118} 119 120//プレイヤーのカードを引く処理 121function playerDrow() { 122 let playerElement = document.getElementById("player"); 123 var playerCard = document.createElement("div"); 124 const targetCard = arr.pop(); 125 cardClassNm = targetCard.suit + targetCard.no; 126 playerCard.classList.add("card", cardClassNm); 127 playerElement.appendChild(playerCard); 128 //ゲーム開始処理と同じ要領でdiv要素にカードクラスを付与してカード画像を表示 129 playerCardList.push(targetCard); 130 //引いたカード情報はプレイヤーのカード保持配列に保持しておく 131} 132 133/** 134 * カードシャフル 135 * @param {"カード情報"} array 136 * @returns 137 */ 138function shuffle(array) { 139 var currentIndex = array.length, temporaryValue, randomIndex; 140 while (0 !== currentIndex) { 141 randomIndex = Math.floor(Math.random() * currentIndex); 142 currentIndex -= 1; 143 temporaryValue = array[currentIndex]; 144 array[currentIndex] = array[randomIndex]; 145 array[randomIndex] = temporaryValue; 146 } 147 return array; 148} 149 150//カードを引く 151function drow() { 152 //カードを1枚引く 153 playerDrow(); 154//カードを引く関数とスコアチェック関数を呼び出し画面を更新 155 //スコアチェック 156 scoreCheck(); 157} 158 159//ゲーム終了 160function gameEnd() { 161 //ゲーム終了フラグを立ててスコアチェックを行う 162 gameEndFlg = true; 163 //スコアチェック時にコンピューターのスコアの確認とボタン制御変更のためのフラグ変更 164 165 //相手の1枚目のカードを表にする 166 const opponentElement = document.getElementById("opponent"); 167 let opponentCard = opponentElement.getElementsByClassName("card")[0]; 168 let cardClassNm = opponentCardList[0].suit + opponentCardList[0].no; 169 opponentCard.classList.remove("ura"); 170 opponentCard.classList.add(cardClassNm); 171 //トランプ裏表示するクラスを削除してコンピューターの1枚目の絵柄と数値からトランプ画像クラスを設定 172 //スコアチェック 173 scoreCheck(); 174} 175 176//スコアチェック 177function scoreCheck() { 178 let playerScore = 0; 179 let opponentScore = 0; 180 181 // プレイヤーのスコア計算 182 //引いたカードから現在のスコアを計算する 183 playerCardList.forEach(x => { 184 if(x.no >= 10) { 185 playerScore += 10; 186 } else if (x.no > 1) { 187 playerScore += x.no; 188 } else if (x.no === 1 && playerScore < 10) { 189 playerScore += 11; 190 } else { 191 playerScore += 1; 192 } 193 }); 194 195//スコアから勝敗を判定する 196 if (playerScore === 21 || opponentScore > 21) { 197 alert("あなたの勝ちです"); 198 gameEndFlg = true; 199 init(); 200 } else if (playerScore > 21) { 201 alert("あなたの負けです。"); 202 gameEndFlg = true; 203 init(); 204 } 205 206//ゲーム終了の場合コンピューターのスコアを計算して勝敗を判定する 207 if (gameEndFlg) { 208 opponentCardList.forEach(x => { 209 if(x.no >= 10) { 210 opponentScore += 10; 211 } else if (x.no > 1) { 212 opponentScore += x.no; 213 } else if (x.no === 1 && opponentScore < 10) { 214 opponentScore += 11; 215 } else { 216 opponentScore += 1; 217 } 218 }); 219 220 if (playerScore > opponentScore) { 221 alert("あなたの勝ちです。"); 222 gameEndFlg = true; 223 init(); 224 } else { 225 alert("あなたの負けです。"); 226 gameEndFlg = true; 227 init(); 228 } 229 } 230} 231

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

async/await や promise を使ってカードオープン処理の結果を待ってから次のステップに進むようにすればよいかと

投稿2021/07/20 00:48

YTani0317

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

alert()は他の処理より優先されるので
setTimeoutで時差をつけるとうまく行きます。
もしくはalertを使わずポップアップを自作するなど

投稿2021/07/19 17:35

編集2021/07/19 17:36
Jon_do

総合スコア1373

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問