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

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

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

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

Q&A

解決済

1回答

3289閲覧

ゲームクリアの実装

chaim

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2017/04/26 14:47

編集2017/04/27 04:35

現在javascriptでマインスイーパーを作成しています。
左クリックで地雷がないマスを全て開けたらポップで「ゲームクリア」表示をさせたい=ゲームクリアにさせたいのですが、現状全てを開けてもクリア条件にならないのが現状です。(ゲームクリアのポップが表示されません)

どなたかお助けをください。よろしくお願いします。
countb,countc,countdなど変更してもらっても平気です。

javascript

1 size = 10; // 値:1 ~ 10 2 ar = new Array(10); //爆弾の個数 3 var countb = 0; //爆弾の上のフラグ 4 var countc = 0; //全フラグの数 5 var countd = 0; 6 7 //左クリック 8 function onClick(event) { 9 var btn = event.target; // クリックされたボタン 10 var id = btn.id; // クリックされたボタンのid 11 var cou = 0; 12 var op = []; 13 // 左クリックした際の実装 14 15 if (btn.style.backgroundColor === "pink") { //フラグがあり、左クリックした場合 16 countc--; 17 } 18 19 btn.style.backgroundColor = "skyblue"; //左クリック押下時に色変化 20 btn.disabled = true; //2度目の左クリック禁止 21 id2 = parseInt(id.slice(3)); 22 x = parseInt(id.slice(3, -1)); //j=10;の位 23 y = parseInt(id.slice(4)); //i=1の位 24 25 if (ar.indexOf(id2) >= 0) { //押下したボタンと爆弾に設定したボタンが一致したら以下を表示 26 window.alert("Game Over"); 27 for (var i = 0; i < 10; i += 1) { 28 if (ar[i] >= 10) { //2桁の場合 29 var btn = document.getElementById('btn' + ar[i]); //btn + 設定した爆弾の番号 30 } else { //1桁の場合 31 var btn = document.getElementById('btn' + '0' + ar[i]); //btn + 0 + 設定した爆弾の番号 32 }// end if 33 btn.style.backgroundColor = "red"; //爆弾を赤色に変える 34 for (var j = 0; j < 10; j++) { 35 btn3 = document.getElementById('btn' + i + j); 36 btn3.disabled = true; //全てのボタンをロックする 37 } 38 } 39 } else { //爆弾 40 var count = hantei(x, y); 41 42 if (x !== 0 && y !== 0) { 43 var op = [('' + (x - 1) + (y - 1))]; 44 cou++; 45 } 46 if (x !== 0) { 47 op.push(('' + (x - 1) + y)); 48 cou++; 49 } 50 if (x !== 0 && y !== 9) { 51 op.push(('' + (x - 1) + (y + 1))); 52 cou++; 53 } 54 if (y !== 0) { 55 op.push(('' + x + (y - 1))); 56 cou++; 57 } 58 if (y !== 9) { 59 op.push(('' + x + (y + 1))); 60 cou++; 61 } 62 if (x !== 9 && y !== 0) { 63 op.push(('' + (x + 1) + (y - 1))); 64 cou++; 65 } 66 if (x !== 9) { 67 op.push(('' + (x + 1) + y)); 68 cou++; 69 } 70 if (x !== 9 && y !== 9) { 71 op.push(('' + (x + 1) + (y + 1))); 72 cou++; 73 } 74 btn.innerHTML = count; 75 76 if (count === 0) { //押下したボタンのカウント数が0だった場合 77 for (i = 0; i < cou; i++) { //再帰関数 78 var btn = document.getElementById('btn' + op[i]); 79 var e = document.createEvent("MouseEvents"); 80 e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 81 btn.dispatchEvent(e); 82 } 83 } 84 if (countb === ar.length && countc === 10) { //ar.length=爆弾のフラグの数と全フラグの数が一致した場合 85 countd++; 86 if (countd === 1) { 87 window.alert("clear!!"); 88 } 89 for (var i = 0; i < 10; i += 1) { 90 for (var j = 0; j <= 10; j++) { 91 btn3 = document.getElementById('btn' + i + j); 92 btn3.disabled = true; 93 } 94 } 95 } 96 } 97 }

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

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

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

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

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

kei344

2017/04/26 14:52

「上手くできなく」とはどのような状況でしょうか。HTML及び出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。また、質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
chaim

2017/04/26 16:03

質問を少し修正させていただきました。説明が下手くそなので理解してもらえると幸いです。よろしくお願いします。
kei344

2017/04/26 16:17

HTMLも提示されてはいかがでしょうか。
chaim

2017/04/27 00:15

文字数の関係上HTML部分までの追加ができませんでした。すいません。
guest

回答1

0

ベストアンサー

現状、クリア判定にフラグを立てた数を入れていますが、
全体のマス目の数 - 爆弾の数を目標数値にして、
マスを開けたカウントが目標数値と一致するか判定してはいかがでしょうか。
(フラグ無しプレイをする人もいますので、クリア判定には向かないと思います)

投稿2017/04/26 23:52

namimon

総合スコア726

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

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

chaim

2017/04/27 00:58

マス全体の数と爆弾(地雷)の数をそれぞれ用意した方がよいとことでしょうか?
chaim

2017/04/27 01:49

プログラムで書くとどんな関じになりますか?
namimon

2017/04/27 02:21

>>マス全体の数と爆弾(地雷)の数をそれぞれ用意した方がよいとことでしょうか? そうです、このゲームがどのように爆弾とマスを用意しているのかわかりませんが、 openedCount // 初期値は 0、色を変えるごとにインクリメント clearTarget //全マスの数から、爆弾の数を引いたもの を用意して、再帰関数が終わった時点で if(openedCount === clearTarget ){ alert("game clear") ; //...クリア処理 } という感じです。 ちなみに、countbとかcountcという名前は
chaim

2017/04/27 04:37

countcが全フラグで、countbのフラグですね そこらへんは変更してもらっても大丈夫です。
namimon

2017/04/27 05:42

申し訳ありませんが、都合上私の方からは詳細なコードを書きません。 考え方は理解いただけたでしょうか。 ここまでコードをかけたなら、上記の変数を作り、 if (countb === ar.length && countc === 10) { //ar.length=爆弾のフラグの数と全フラグの数が一致した場合 この行以降を修正してみてください。
chaim

2017/04/27 06:57

挑戦してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問