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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

9428閲覧

javaでマインスイーパーを作成しています

baby_wing

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/02/27 13:47

プログラム初心者です。
javaでマインスイーパーを作成しているのですが、
爆弾、数字がないところをクリックすると爆弾の隣の数字まで自動で開く
という動作ができません。
上下、左右だけならできたのですが、
ほかの部分をどう組み込めばいいのかがわかりません。

わかりづらい説明で申し訳ないのですが、教えていただけないでしょうか。
お願いいたします。

###該当のソースコード

private void OpenButton(int i, int j) { // TODO 自動生成されたメソッド・スタブ if(num[i][j] == 0){ //ボタンの座標 for(int h = i - 1; h >= 0; h--){ //真上を開ける if(num[h][j] == 2){ //開いた場所が数字だったら btn[h][j].setContentAreaFilled(false); //ボタンを透明化 label[h][j].setVisible(true); // 数字の画像を可視化する break; } else if(num[h][j] == 0) { //開いた場所になにもなかったら btn[h][j].setContentAreaFilled(false); label[h][j].setVisible(true); } } for(int h = i + 1; h < hight; h++){ //真下を開ける if(num[h][j] == 2){ btn[h][j].setContentAreaFilled(false); label[h][j].setVisible(true); break; } else if(num[h][j] == 0) { btn[h][j].setContentAreaFilled(false); label[h][j].setVisible(true); } } for(int w = j - 1; w >= 0; w--){ //左を開ける if(num[i][w] == 2){ btn[i][w].setContentAreaFilled(false); label[i][w].setVisible(true); break; } else if(num[i][w] == 0) { btn[i][w].setContentAreaFilled(false); label[i][w].setVisible(true); } } for(int w = j + 1; w < width; w++){ //右を開ける if(num[i][w] == 2){ btn[i][w].setContentAreaFilled(false); label[i][w].setVisible(true); break; } else if(num[i][w] == 0) { btn[i][w].setContentAreaFilled(false); label[i][w].setVisible(true); } } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードでは何もない場所P1に隣接したセルP2を開けたらそこも「何もない」ときP2を新たな基準と考えてその周りの8セルを開けるというのがうまく表現できていないと思います。

この例の場合は再帰アルゴリズムを使うと素直にやりたいことが表現できる気がします。

java

1void openCell(int x, int y) { 2 if (x < 0 || w >= width || y < 0 || y >= height) 3 //範囲外の時は何もしない 4 return; 5 if (isOpened(x, y)) 6 //既に開かれていたら何もしない 7 return; 8 if (isBomb(x, y)) 9 throw new BombException("残念でした"); 10 if (getCellNumber(x, y) == 0) { 11 // まわりに爆弾が一つもなかったら・・・ 12 for (int ny = y - 1; ny <= y + 1; ny++) { 13 for (int nx = x - 1; nx <= x + 1; nx++) { 14 openCell(nx, ny); // 再帰呼び出し 15 } 16 } 17 } 18}

追記:肝心の再帰呼び出しのところの引数が間違ってたので訂正しました。

投稿2017/02/27 14:34

編集2017/02/27 15:36
KSwordOfHaste

総合スコア18394

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

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

baby_wing

2017/02/27 15:11

回答ありがとうございます。 起点をずらして考えればよかったのですね。 早速試してみたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問