• 締切済み

オセロゲーム 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; }

  • nVIDIA
  • お礼率46% (520/1121)

みんなの回答

  • valvelde
  • ベストアンサー率35% (46/129)
回答No.3

すべて見れてないのでわかりませんがdata配列の範囲外参照が原因でおこっていると思います。 tateおよびyokoが0~GOBAN以外の値になった場合dataを参照しない処理を追加するか、NO1さんがかかれているような処理を行う必要があります。

nVIDIA
質問者

お礼

質問書き直します

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.2

data[]の 入力処理とか他の部分は見せてくれないのか、、。 (==; まあ、いいや。 予想です。、 たぶん、data構造体の初期化忘れが原因。 for (int iCntX =0; iCntX< xxx; iCntX++) { for (int iCntY =0; iCntY< YYY; iCntY++) { data[iCntX][iCntY] = (初期値); } } こんな感じのコードちゃんと書いてますか? 書かないと、メモリ上のゴミデータ読んじゃうよ。

nVIDIA
質問者

お礼

質問書き直します

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 石が置けるかを調べる まず「すでに相手、または自分の石があると不可」 これがクリアされたら 「周囲8個に相手、または自分の石が無いと不可」 ということですよね。 (さらには「相手を挟む石」も必要でしょうけど) 2次元配列は外周1列余計に宣言したほうが、チェックが単純化できます。 オセロの盤面って8×8ですから10×10で宣言して、添字の範囲を絞って、内側の8×8のみを使用。 もちろん初期値セットは外周部も含め「石なし」で。 これならチェック対象は常に周囲8セルになりますので 「周辺で対象外となるセルが意図しない値を返す」ことが回避できます。

nVIDIA
質問者

お礼

質問書き直します

関連する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
  • プログラミングについての質問です

    C言語で詰将棋のプログラミングをしたのですが、実行して答えを入力してもうまくいきません。どこがまちがってるのか教えていただけませんか?なおprintfを使って場を表現した部分が長すぎて4000文字に収まらないので、そこは割愛しています。 #include<stdio.h> int main(int argc, const char * argv[]){ int yoko,tate,yoko2,tate2,yoko3,tate3; char koma,koma2,koma3; printf("詰め将棋をしましょう\n"); ~printf略~ printf("持ち駒:なし\n相手の駒は玉(1二)、歩(1三)、角(1四)、飛(2五)、あなたの駒は龍(3二)、と(3一)、角(2二)です。\n\n残り3手ですが、何を動かしますか?\n"); printf("龍、と、角のいずれかを入力:"); scanf_s("%c\n", &koma); if(koma == '龍'){ printf("どこに動かしますか? (例:「9九」なら「9 9」と入力):"); scanf_s("%d %d\n",&yoko,&tate); if((yoko==2)&&(tate==1)){ ~printf略~ printf("王手です。玉を守りましょう。最長手となるように動かしてください。\n\n残り2手ですが、何を動かしますか?\n"); printf("玉、歩、角、飛のいずれかを入力:"); scanf_s("%c\n",&koma2); if(koma2=='玉'){ printf("どこに動かしますか?:"); scanf_s("%d %d\n",&yoko2,&tate2); if((yoko2==2)&&(tate2==3)){ ~printf略~ printf("残り1手です。この1手で相手を詰みにしてください。何を動かしますか?:"); printf("龍、と、角のいずれかを入力:"); scanf_s("%c\n",&koma3); if(koma3=='角'){ printf("どこに動かしますか?:"); scanf_s("%d %d\n",&yoko3,&tate3); if((yoko3==4)&&(tate3==4)){ ~printf略~ printf("あなたの勝ちです!\n"); } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } return 0; }

  • 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
  • [C言語]三目並べ

    三目並べのプログラムで、以下のようなコンピュータの思考ルーチンを作っている所なのですが、 /* 後手で先手に初めに真ん中に置かれたら角に置く */ /* 後手で先手に初めに角に置かれたら真ん中に置く */ この二つがうまくいかないようで困っています。どこか間違っているのでしょうか? void com( char te ) { int total,kado,aite,a,tate,yoko,ok = 0; /* 0 = 空 te = 1(○) → aite = 2(×) 1 = ○ te = 2(×) → aite = 1(○) 2 = × */ /* 勝てる場所を探す */ for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */ if( brd[tate][0] == 0 && brd[tate][1] == te && brd[tate][2] == te ) { brd[tate][0] = te; return; } if( brd[tate][0] == te && brd[tate][1] == 0 && brd[tate][2] == te ) { brd[tate][1] = te; return; } if( brd[tate][0] == te && brd[tate][1] == te && brd[tate][2] == 0 ) { brd[tate][2] = te; return; } } for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */ if( brd[0][yoko] == 0 && brd[1][yoko] == te && brd[2][yoko] == te ) { brd[0][yoko] = te; return; } if( brd[0][yoko] == te && brd[1][yoko] == 0 && brd[2][yoko] == te ) { brd[1][yoko] = te; return; } if( brd[0][yoko] == te && brd[1][yoko] == te && brd[2][yoko] == 0 ) { brd[2][yoko] = te; return; } } if( brd[0][0] == 0 && brd[1][1] == te && brd[2][2] == te ) { /* 斜め1 */ brd[0][0] = te; return; } if( brd[0][0] == te && brd[1][1] == 0 && brd[2][2] == te ) { brd[1][1] = te; return; } if( brd[0][0] == te && brd[1][1] == te && brd[2][2] == 0 ) { brd[2][2] = te; return; } if( brd[0][2] == 0 && brd[1][1] == te && brd[2][0] == te) { /* 斜め2 */ brd[0][2] = te; return; } if( brd[0][2] == te && brd[1][1] == 0 && brd[2][0] == te) { brd[1][1] = te; return; } if( brd[0][2] == te && brd[1][1] == te && brd[2][0] == 0) { brd[2][0] = te; return; } /* 相手の勝ちを阻止する */ aite = te % 2 + 1; for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */ if( brd[tate][0] == 0 && brd[tate][1] == aite && brd[tate][2] == aite){ brd[tate][0] = te; return; } if( brd[tate][0] == aite && brd[tate][1] == 0 && brd[tate][2] == aite){ brd[tate][1] = te; return; } if( brd[tate][0] == aite && brd[tate][1] == aite && brd[tate][2] == 0){ brd[tate][2] = te; return; } } for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */ if( brd[0][yoko] == 0 && brd[1][yoko] == aite && brd[2][yoko] == aite){ brd[0][yoko] = te; return; } if( brd[0][yoko] == aite && brd[1][yoko] == 0 && brd[2][yoko] == aite){ brd[1][yoko] = te; return; } if( brd[0][yoko] == aite && brd[1][yoko] == aite && brd[2][yoko] == 0){ brd[2][yoko] = te; return; } } if( brd[0][0] == 0 && brd[1][1] == aite && brd[2][2] == aite){ /* 斜め1 */ brd[0][0] = te; return; } if( brd[0][0] == aite && brd[1][1] == 0 && brd[2][2] == aite ) { brd[1][1] = te; return; } if( brd[0][0] == aite && brd[1][1] == aite && brd[2][2] == 0 ) { brd[2][2] = te; return; } if( brd[0][2] == 0 && brd[1][1] == aite && brd[2][0] == aite){ /* 斜め2 */ brd[0][2] = te; return; } if( brd[0][2] == aite && brd[1][1] == 0 && brd[2][0] == aite) { brd[1][1] = te; return; } if( brd[0][2] == aite && brd[1][1] == aite && brd[2][0] == 0) { brd[2][0] = te; return; } /* 後手で先手に初めに角に置かれたら真ん中に置く */ if ( te == 2 ) { for ( a = 0; a < 9; a++ ) { total += brd[a/3][a%3]; } kado = brd[0][0] + brd[0][2] + brd[2][0] + brd[2][2]; if ( total == 1 && kado ==1){ brd[1][1] = te; return; } } /* 後手で先手に初めに真ん中に置かれたら角に置く */ if ( te == 2 ) { for ( a = 0; a < 9; a++ ) { total += brd[a/3][a%3]; } if ( total == 1 && brd[1][1] == aite){ brd[0][0] = te; return; } } /* ランダム */ srandomdev(); do { a = random() % 9; tate = a/3; yoko = a%3; if ( brd[tate][yoko] == 0 ) { ok = 1; } } while ( ok == 0 ); /* 盤面に書き込み */ brd[tate][yoko] = te; }

  • オセロを作成 助言お願いします・・・

    C言語を初めてもうすぐ1ヶ月ぐらいたつんですけど今ある知識の そうまとめとしてオセロを作成しています。 同じオセロでもソースを2つ作ろうと考えています。 まずは関数を使わないで作るオセロ もうひとつは関数を使うオセロです。 関数を使わないほうのオセロで困っています。今1ターンごとに白い 石を置いたり黒い石を置いたりするばしょをつくっていて 変数を1週ごとに1ずつ増やしていき奇数なら黒い石偶数なら白い石 みたいにしようと考え次のようなソースコードを書きました。 ----------------------ソースコード-------------------------- #include<stdio.h> int bord[8][8]; int x,y; int i,j,l,a; int player; int main (void) { //ボードの初期化 for(i=0;i<8;i++){ for(j=0;j<8;j++){ bord[i][j]=0; } } bord[3][3]=1; bord[4][4]=1; bord[3][4]=2; bord[4][3]=2; //bordの表示 player=0; for(;;){ //何度も表示 printf("01234567\n"); for(i=0;i<8;i++){ //繰り返す(1) for(j=0;j<8;j++){ //繰り返す(2) if(bord[i][j] == 0){ //bord[i][j]は初期化により0なので printf("*"); } else if(bord[i][j] == 1){ printf("●"); } else{ printf("○"); } } printf("\n"); } if(player%2==0){ bord[i][j]=1; } else if(player%2==1){ bord[i][j]==0; } printf("y座標を入力してください。(縦軸)"); scanf_s("%d", &y); printf("x座標を入力してください。(横軸)"); scanf_s("%d", &x); //ひっくりかえす //エラー処理// if(bord[y][x]!=0) { printf("\n"); printf("置かれてるよ!\n"); } //ひっくり返す// if(x>=0 && x<8 && y>=0 && y<8 && bord[y][x]==0){ if(bord[y][x] == 0){ bord[y][x]=1; } if(bord[y][x]==1) { bord[y][x]=2; } } //エラー処理// if(x<0 || x>=8 || y<0 || y>=8 ) { printf("許容範囲外です。\n"); } player++; } //無限loop終了地点 return 0; } -------------------------ソース終了-------------------------- 汚いソースで申し訳ありません。これを実行すると いつでも白の石しか置けないのです・・・ なのでヒントでもいいのでどうすればいいのか教えてください!  あともしよければはさまれたら石の色を変える部分も教えてくださると助かります。 ちなみに偶数かどうかの判定の部分は 「if(player%2==0){ bord[i][j]=1; } else if(player%2==1){ bord[i][j]==0; } 」 というところです。 ※質問などありましたらどうぞいってください。 ご回答お待ちしております。

  • コマンドライン引数

    コマンドライン引数で以下のようなプログラムを実行したいのですが どうしたらいいのか分かりません!! みなさんの意見を聞かせてください(lll´Д`lll)    □☆□□□☆□□□☆□□□☆□    ☆★☆☆☆★☆☆☆★☆☆☆★☆    □☆□□□☆□□□☆□□□☆□    □☆□□□☆□□□☆□□□☆□    ☆★☆☆☆★☆☆☆★☆☆☆★☆    □☆□□□☆□□□☆□□□☆□    □☆□□□☆□□□☆□□□☆□    ☆★☆☆☆★☆☆☆★☆☆☆★☆    □☆□□□☆□□□☆□□□☆□    □☆□□□☆□□□☆□□□☆□ プログラムは途中まで作ったのですが、肝心なとこは 全く分りませんっっ #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { printf("\n"); } return(0); } /* end of pat2.c */

  • 迷路作成のプログラミング

    迷路作成のプログラミングを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(); }

  • C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまく

    C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまくいきません。ReverseOthello関数の石を探して裏返す処理がおかしいと思われます。一番裏返せる石が多い位置を裏返すという処理をしています。プログラミング経験が豊富な方よろしくお願いします。 #include "stdafx.h" bool Othello(int (*pBoard)[8] ){ int i; int j; int ans; int k = 0; int num[3] = {0,0,0}; int sum[28][3]; i = 0; while(i < 28){ j = 0; while(j < 3){ sum[i][j] = 0; j++; } i++; } i = 0; while(i < 8){ j= 0; while(j < 8){ if(pBoard[i][j] == 0){ ans = SeachStone(i,j,pBoard); if(ans != 0){ sum[k][0] = i; sum[k][1] = j; sum[k][2] = ans; k++; } } j++; } i++; } i = 0; while(i < 28){ if(num[2] < sum[i][2]){ num[0] = sum[i][0]; num[1] = sum[i][1]; num[2] = sum[i][2]; } i++; } if(num[2] == 0){ return false; } ReverseStone(num[0],num[1],pBoard); return true; } void ReverseStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int y2; int x2; int i; int j; int k; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ k = 0; while(k < cnt + 1){ y2 = y2 + (y1 - i); x2 = x2 + (x1 - j); pBoard[y2][x2] = 1; printf("%d\n",pBoard[y2][x2]); k++; } } j++; } i++; } } int SeachStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int sumCnt = 0; int y2; int x2; int i; int j; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ sumCnt = sumCnt + cnt; } j++; } i++; } return sumCnt; }

  • このプログラムの問題点を教えてください。

    //数独 #include <iostream.h> const int num_Max = 100; //一辺のマス最高値 void input_data( int a, int [num_Max][num_Max] ); //入力関数 void yoko_data( int a, const int [100][100], int & ); //判定 void tate_data( int a, const int [100][100], int & ); void block_data( int a, int b, const int [100][100], int & ); main() { int num; //一辺のマスの数 int m; //一ブロックの一辺にあるマスの数 int okey; //numが正常か判別 int dx, dy, dz; int masu[num_Max][num_Max]; //全部のマス cout << "\n埋められた数独が正しいかどうか判断するプログラムです。\n"; while(1){ cout << "横何マスありますか? (4-100)>>" ; cin >> num ; if( num > num_Max || num < 4){ cout <<"範囲外です。再入力して下さい。" ; }else{ m = sqrt( num ); okey = num - m * m; if(okey != 0) cout << "その数字は数独として成り立ちません。再入力して下さい。"; } } //マスの入力 input_data( num, masu ); //横判定 yoko_data( num, masu, dx ); if(dx = 0){ //縦判定 tate_data( num, masu, dy ); if(dy = 0){ //マス判定 block_data( num, m, masu, dz ); } } if(dx == dy == dz == 0) cout <<"\n大正解♪ おめでっとー。\n"; return 0; } //入力 void input_data( int kazu, const int matrix[num_Max][num_Max]) { cout <<"\nマスの数字の入力を左上から順に、右へと行って下さい。"; for(int i = 0; i < kazu; i++){ for(int j = 0; j < kazu; j++){ cout << i+1 << "行目の" << j+1 << "列目 >>"; cin >> matrix[i][j] ; } } } //横列(行)を順に判定 void yoko_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vx = 0; //かぶっていたと判定されたかどうかを見る用 for(int i = 0; i < kazu; i++){ //横一列取り出しました。 for(int j = 0; j < kazu; j++){ for( int k = 1; j+k < kazu; k++){ kaburi = matrix[i][j] - matrix[i][j+k]; if(kaburi == 0){ //かぶってたらループから抜け出す vx++; break; } } } } if(vx > 0) cout << "\n横列(行)検索時に不適切な部分を発見しました。\n"; return vx; } //縦列(列)を順に判定 void tate_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vy = 0; //かぶっていたと判定されたかどうかを見る用 for(int j = 0; j < kazu; j++){ //縦一列取り出しました。 for(int i = 0; i < kazu; i++){ for( int k = 1; k < kazu-1; k++){ kaburi = matrix[i][j] - matrix[i+k][j]; if(kaburi == 0){ //かぶってたらループから抜け出す vy++; break; } } } } if(vy > 0) cout << "\n縦列(列)検索時に不適切な部分を発見しました。\n"; return vy; } //1ブロックごとに判定 void block_data( int kazu, int ruto, int matrix[num_Max][num_Max]) { int hantei[num_Max][num_Max] ; //判定する部分を切り出す用 int kaburi; int vz; //まずブロックごとに切り出してみる for(int i = 0; i < ruto-1; i++){ for(int j = 0; j < ruto-1; j++){ int h = 0; //何ブロック目か int g = 0; //そのブロックの何個目か (h-1)++; for(int l = 0; l < ruto-1; l++){ for(int k = 0; k < ruto-1; k++){ hantei[h][g++] = matrix[i * m + k][j * m + l]; } } } } //かぶっているか判定する for(int x = 0; x < kazu; x++){ for(int y = 0; y < kazu; y++){ for( int z = 1; z < kazu-1; z++){ kaburi = hantei[x][y] - matrix[x+z][y]; if(kaburi == 0){ //かぶってたらループから抜け出す vz++; break; } } } } return vz; } C++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?

  • 簡単なマインスイーパーを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