【解決方法求む】javaの配列でエラーが出る問題

このQ&Aのポイント
  • javaの配列を使用している際にエラーが発生しています。マインスイーパーを作成しているのですが、周囲の爆弾の数を数えるところで問題が発生しています。
  • エラーはUncaught exception java/lang/ArrayIndexOutOfBoundsExceptionです。正確な原因を特定するため、周囲の部分を再確認していますが、足りていない部分があればご指摘いただければ幸いです。
  • 解決策がわからず、質問をさせていただいているので、何かアドバイスやお知恵をいただければ幸いです。どうかよろしくお願いいたします。
回答を見る
  • ベストアンサー

javaの配列でエラーが出ます。

javaの配列でエラーが出ます。 先ほどもjavaの配列で質問させていただいたんですが、 また同じようなところでエラーが出ました。。。 マインスイーパーを作ろうとしているんですが、 周りにある爆弾の数を数えるところでエラーが出ます。 たびたび頼ってばかりで申し訳ありません。 一応自分なりに考えたのを以下に。。 爆弾があるというのはmine[][]==10であらわしています。 //フィールド int[][] mine=new int[9][9]; Random rnd=new Random(); //スレッド public void run(){ //爆弾生成 int yoko,tate; for(int i=0;i<=9;i++){ yoko=(rnd.nextInt()>>>1)%9; tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; else i-- } kazugime(); }//本当はこの後に描画のループが続きます。 //数を代入するメソッド public void kazugime(){ int kazu=0; for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++){ kazu=0; if(mine[i][j]!=10){ //上の段 if(i>=1&&j>=1){if(mine[i-1][j-1]==10)kazu++;} if(i>=1){if(mine[i-1][j]==10)kazu++;} if(i>=1&&j<=7){if(mine[i-1][j+1]==10)kazu++;} //真ん中の段 if(j>=1){if(mine[i][j-1]==10)kazu++;} if(j<=7){if(mine[i][j+1]==10)kazu++;} //下の段 if(i<=7&&j>=1){if(mine[i+1][j+1]==10)kazu++;} if(i<=7){if(mine[i+1][j]==10)kazu++;} if(i<=7&&j<=7){if(mine[i+1][j+1]==10)kazu++;} mine[i][j]=kazu; } } } エラーは Uncaught exception java/lang/ArrayIndexOutOfBoundsException です。 足らない部分があればご指摘お願いします。 どうかよろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.1

> Uncaught exception java/lang/ArrayIndexOutOfBoundsException だから配列の範囲を超えた要素にアクセスしようとして例外が起こっているのですから 要素数を越えてそうな場所を調べればよい。 怪しいのはココかな? //下の段 if(i<=7&&j>=1){if(mine[i+1][j+1]==10)kazu++;} j=8のときにmine[xx][9]にアクセスすると思われます。

ainobakuda
質問者

お礼

回答ありがとうございます。 確認が足りませんでした。。 おかげで先に進めそうです。 本当にありがとうございました。

その他の回答 (1)

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.2

宣言は > int[][] mine=new int[9][9]; になっています。 じゃあ、 > for(int j=0;j<=8;j++){ で、j=8のとき、 > if(i<=7&&j>=1){if(mine[i+1][j+1]==10)kazu++;} mine[i+1][j+1] は何処を参照していると思いますか?

ainobakuda
質問者

お礼

範囲を超えてしまいますね・・ 確認が足りませんでした。 今回はお忙しい中本当にありがとうございました。

関連するQ&A

  • javaの配列部分ででエラーがでます。

    javaの配列部分ででエラーがでます。 マインスイーパを作っており爆弾の位置を決めるところでエラーの原因がわからず困っています。 9×9で、 ランダムでかぶらないように10個の爆弾を置くプログラムを作りたいです。 Random rnd=new Random(); int[][] mine=new int[8][8]; for(int i=0;i<=9;i++){ int yoko=(rnd.nextInt()>>>1)%9; int tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; //爆弾があるところは10 else i--; } よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaで数独の自動解法プログラム

    Javaで次のようなプログラムを作りました。 次に、ここから実行で得られた数独を自動解法プログラムによって、解が「1つ or 複数」かを調べるようにしたいのですが、その自動解法プログラムは新しく作らなければいけないのでしょうか。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, m, n, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; Random rnd1 = new Random(); int ran1; Random rnd2 = new Random(); int ran2; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ )  //横列に入る数字をチェック if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ )  //縦列に入る数字をチェック if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ )  //ボックスに入る数字をチェック for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; } } for ( i=0; i<30; i++ ) {    //0を入れる回数 ran1 = rnd1.nextInt(9); m = ran1; ran2 = rnd2.nextInt(9); n = ran2; if ( a[m][n] == 0 ) {  //0にしようとした場所が既に0だったら直前に戻る i--; } a[m][n] = 0; } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを(最初に入れる0の数を30個として)実行すると、次のようになります。 0 7 6 9 4 1 8 2 5 2 0 5 3 7 0 9 4 0 9 0 4 8 2 5 0 3 7 1 0 2 0 0 0 5 0 6 6 9 3 1 0 0 0 8 2 7 0 8 0 0 0 0 1 4 0 0 0 0 0 0 0 0 3 4 3 0 5 6 8 2 7 9 5 2 9 4 3 7 0 0 8 皆さんの回答の程宜しくお願いします。

  • 九九のプログラム

    public class kuku{ public static void main(String[] args){ int[][] hyou=new int[10][10]; System.out.print(" "); int i; int yoko; for(i=1;i<hyou.length;i++){ yoko=(int)(Math.random()*10); hyou[i][0]=yoko; System.out.print(" "+hyou[i][0]); } System.out.println(); int j; int tate; for(j=1;j<hyou[0].length;j++){ tate=(int)(Math.random()*10); masu[0][j]=tate; System.out.println(hyou[0][j]); }}} これを実行すると乱数がダブって表示されてしまうのですが、ダブらないようにし、appletで実行できるようにしたいのですがどのように直したらいいのでしょうか。どなたかアドバイスください。

  • Javaで数独の自動問題作成プログラム

    Javaで次のようなプログラムを作りました。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; }       } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを実行すると、次のようになります。 2 5 3 6 8 4 9 1 7 4 7 9 1 3 5 2 6 8 8 1 6 9 2 7 3 4 5 7 3 5 4 1 6 8 9 2 9 2 1 8 5 3 6 7 4 6 4 8 7 9 2 5 3 1 1 9 4 2 6 8 7 5 3 5 6 2 3 7 1 4 8 9 3 8 7 5 4 9 1 2 6 あとは、ここからランダムに50個数字を抜いて数独の問題にしたいのですが、 どうやったらランダムに数字を抜くことが出来るでしょうか? プログラムソースを提示していただくとありがたいのですが。宜しくお願いします。

  • 簡単なマインスイーパーをJavaで作りたいです。

    Javaの勉強をしたいと思い下のソースのマインスイーパーを ウィンドウ上で実行できるようにしたいです。 そのときに他のソースから呼び出す形にしたいです。 どのようにしたら良いでしょうか?教えてください。 出来ればソースがあるとありがたいです。 import java.util.Scanner; public class MineSweeper extends MinePrinter { public static void main(String[] args) { Scanner sc = new Scanner(System.in); MineSweeper game = new MineSweeper(); game.displayStrblock(); while (!game.dead) { System.out.println("\n:爆弾数・・・" + game.mines); System.out.println("\n:場所を選んでください"); System.out.println("縦の場所の数字を入力"); int tate = Integer.parseInt(sc.next()); System.out.println("横の場所の数字を入力"); int yoko = Integer.parseInt(sc.next()); game.mineClick(tate, yoko); game.displayStrblock(); } } } class MinePrinter { String[][] strblock = new String[5][5]; int[][] blocks = new int[5][5]; int mines = 0; boolean dead = false; public MinePrinter() { mineSet(); } void mineClick(int i, int j) { if (aroundManyMines(i, j) == 99) { System.out.println("burst!!!"); System.out.println("You Dead!!\n"); strblock[i][j] = "*"; dead = true; } else { strblock[i][j] = Integer.toString(aroundManyMines(i, j)); } } void mineSet() { for (int i = 0; i < blocks.length; i++) { for (int j = 0; j < blocks[i].length; j++) { if (Math.random() < 0.2) { blocks[i][j] = 99; mines += 1; } else { blocks[i][j] = 0; } } } for (int i = 0; i < strblock.length; i++) { for (int j = 0; j < strblock.length; j++) { strblock[i][j] = "#"; } } } void displayStrblock() { for (int i = 0; i < strblock.length; i++) { for (int j = 0; j < strblock.length; j++) { System.out.print(strblock[i][j] + " "); } System.out.println(":" + i); } } int aroundManyMines(int i, int j) { if (blocks[i][j] == 99) { return 99; } int ans = 0; for (int r = -1; r <= 1; r++) for (int c = -1; c <= 1; c++) { try { if (blocks[i + r][j + c] == 99) { ans += 1; } } catch (ArrayIndexOutOfBoundsException e) { continue; } } return ans; } }

    • ベストアンサー
    • Java
  • javaの二次元配列について質問です

    配列上にあるただ一つの1を入力に応じて移動させるプログラムを作っています。 たとえば0が入力されたら 0, 0, 0 0, 1, 0 0, 1, 0 → 0, 0, 0 0, 0, 0 0, 0, 0 という風に移動させ、端に行ったら移動できないようにしたいです。 今書いたプログラムだと、最初にある1が残ったままになってしまいます。 int[] p = {-1, -1}; int[][] im = new int[3][3]; Scanner scn = new Scanner(System.in); for (int i = 0; i < p.length; i++) { p[i] = 1; } im[p[0]][p[1]] = 1; for (int i = 0; i < im.length; i++) { for (int j = 0; j < im[i].length; j++) { System.out.print(im[i][j] + ","); } System.out.println(); } int n = 0; n = scn.nextInt(); if (n == 0) { p[0] -= 1; } else if (n == 1) { p[1] += 1; } else if (n == 2) { p[0] += 1; } else if (n == 3) { p[1] -= 1; } im[p[0]][p[1]] = 1; for (int i = 0; i < im.length; i++) { for (int j = 0; j < im[i].length; j++) { System.out.print(im[i][j] + ","); } System.out.println(); }

  • JAVAで配列を使って * を縦向きのグラフで表示したいです。

    JAVAの勉強をしています。 このプログラムは配列に乱数を生成して * を 横向きにするプログラムです。 練習問題で、以下のプログラムを書き換えて、* を縦向きのグラフで表示する問題なのですが、解く方法がわかりません。 どなたか答えもしくはヒントを下さい。 よろしくお願いします。 import java.util.Random; import java.util.Scanner; public class Test06_04 { public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数 : "); int n = stdIn.nextInt(); //要素数を読み込む int[] a = new int[n]; //配列を生成 for (int i = 0; i < n; i++) { a[i] = 1+ rand.nextInt(10); } for (int i = 0; i < n; i++) { System.out.print("a[" + i + "] : "); for (int j = 0; j < a[i]; j++) System.out.print('*'); System.out.println(); } } }

    • ベストアンサー
    • Java
  • オセロゲーム 2次元配列で困ってます。

    オセロゲームを作ってますが、オセロの石はただ置けばよいものではなく、他の石と接触している場所でないといけないですよね。だから、いきなり角に石を置く事ができないわけです。 隣に石があるか調べるには基本的には、左・右・上・下・左上・右上・左下・右下と8箇所ですが、端だと5箇所箇所となり、更に角になると3箇所となるわけです。 それぞれ石が置けるかを調べるために関数の一部にこのようなもの作って見ました。 でも、端に接触するマスの座標を指定しても、置けないはずなのに、いしが置けてしまいます。 動解決すればよいかおしえてください。 NGだと0を返し、OKだと1を返します。 #defien OTHELLO_NON 0 int Contact(int data[][GOBAN], int tate, int yoko ) { int signal = 0; if(data[tate][yoko - 1] != OTHELLO_NON){ signal = 1; } if(data[tate][yoko + 1] != OTHELLO_NON){ signal = 1; } if(data[tate - 1][yoko - 1] != OTHELLO_NON){ signal = 1; } if(data[tate - 1][yoko] != OTHELLO_NON){ signal = 1; } if(data[tate - 1][yoko + 1] != OTHELLO_NON){ signal = 1; } if(data[tate + 1][yoko - 1] != OTHELLO_NON){ signal = 1; } if(data[tate + 1][yoko] != OTHELLO_NON){ signal = 1; } if(data[tate + 1][yoko + 1] != OTHELLO_NON){ signal = 1; } return signal; }

  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • 迷路作成のプログラミング

    迷路作成のプログラミングをC++で作ったのですが、エラーが出ます。 どのように直せば良いか教えてください。 エラー内容は 'randoomize': 識別子が見つかりませんでした。 16 進型定数には、少なくとも 1 桁の 16 進数が必要です。 'kbhit': 識別子が見つかりませんでした 'getch': 識別子が見つかりませんでした です、、お願いします。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define YOKO_MAX 200 #define ESC '\xlb' int n; int map[YOKO_MAX],count[YOKO_MAX]; int rr() { return rand() % 10>3; } void tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) if(map[i]!=map[i+1] && rr()) { k=map[i+1]; count[k]=0; for(j=0; j<n; j++) if(map[j]==k) { map[j]=map[i]; count[map[i]]++; } printf(" "); } else printf("■"); printf("■\n"); } void last_tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) { if(map[i]==map[i+1]) printf("■"); else { k=map[i+1]; for (j=0; j<n; j++) if (map[j]==k) map[j]=map[i]; printf(" ",map[i]); } } printf("■\n"); } void yoko() { int i,j; for (i=0; i<n; i++) if (count[i]>1 && rr()) { printf("■■"); for(i=0; i<n; i++) { if (count[j]==0) { count[j]=1; count[map[i]]--; map[i]=j;break; } } } else { printf("■"); } printf("■\n"); } void enter() { int i,k; k=rand() % n; for (i=0; i<n; i++) if(i==k) { printf("■"); } else { printf("■■"); } printf("■\n"); } void initialize() { int i; for (i=0; i<n; i++) { map[i]=i; count[i]=1; } randoomize(); } int main() { printf("無限に大きな迷路\n"); do { printf("\n迷路の横幅(2~200)?"); scanf("%d",&n); } while (n<2||n>=YOKO_MAX); printf("\n ESCキーを押すと止まる。\n"); initialize(); enter(); do { tate(); yoko(); } while (!kbhit()||getch()!=ESC); last_tate(); enter(); }

専門家に質問してみよう