- ベストアンサー
学校のC言語の授業で五目並べを作成中の際に行き詰まった点と解決策
- 学校のC言語の授業で5×5マスの五目並べを作っています。行き詰ってしまった点として、すでに置かれているマスには置けないようにすること、縦、横、斜めのどれか5マスが揃うと勝利と表示されてゲームが終了すること、引き分けの表示の仕方があります。基本的な知識しかないので高度なことはできませんが、ヒントがほしいです。
- C言語で五目並べを作成していますが、行き詰っています。特に、すでに置かれているマスには置けないようにする方法、縦、横、斜めのどれか5マスが揃うと勝利と表示される方法、引き分けの表示の仕方について教えてください。
- C言語で五目並べを作っていますが、行き詰ってしまいました。すでに置かれているマスには置けないようにする方法、縦、横、斜めのどれか5マスが揃うと勝利と表示される方法、引き分けの表示の仕方について教えてください。初心者のため、基本的な情報がほしいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
nokyonへ これあげる #include<stdio.h> int main(void){ static char a[6][6]={{' ','1','2','3','4','5'}, {'1',' ',' ',' ',' ',' '}, {'2',' ',' ',' ',' ',' '}, {'3',' ',' ',' ',' ',' '}, {'4',' ',' ',' ',' ',' '}, {'5',' ',' ',' ',' ',' '}}; int count=0,judge=0; int i,j; for(;;){ //盤の表示 for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } //先手 for(;;){ for(;;){ printf("行\n"); scanf("%d",&i); if(i==0) continue; if(i<6) break; printf("置けません\n"); } for(;;){ printf("列\n"); scanf("%d",&j); if(j==0) continue; if(j<6) break; printf("置けません\n"); } if(a[i][j]!=' '){ printf("置けません\n"); continue;} else if(a[i][j]=' '){ a[i][j]='X'; count++; break; } } //先手終了 //縦判定 for(j=1;j<6;j++){ judge=0; for(i=1;i<6;i++){ if(a[i][j]=='X') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;} } //横判定 for(j=1;j<6;j++){ judge=0; for(i=1;i<6;i++){ if(a[j][i]=='X') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;} } //斜め(右下がり)判定 judge=0;{ for(j=1;j<6;j++){ if(a[j][j]=='X') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;}} //斜め(右上がり)判定 judge=0; for(i=1;i<6;i++){ if(a[i][6-i]=='X') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;} if(count==25){ printf("引き分け"); } //盤の表示 for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } //後手 for(;;){ for(;;){ printf("行\n"); scanf("%d",&i); if(i==0) continue; if(i<6) break; printf("置けません\n"); } for(;;){ printf("列\n"); scanf("%d",&j); if(j==0) continue; if(j<6) break; printf("置けません\n"); } if(a[i][j]!=' '){ printf("置けません\n"); continue;} else if(a[i][j]=' '){ a[i][j]='O'; count++; break; } } //縦判定 for(j=1;j<6;j++){ judge=0; for(i=1;i<6;i++){ if(a[i][j]=='O') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;} } //横判定 for(j=1;j<6;j++){ judge=0; for(i=1;i<6;i++){ if(a[j][i]=='O') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;} } //斜め(右下がり)判定 judge=0;{ for(j=1;j<6;j++){ if(a[j][j]=='O') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;}} //斜め(右上がり)判定 judge=0; for(i=1;i<6;i++){ if(a[i][6-i]=='O') judge++; } if(judge==5){ for(i=0;i<6;i++){ for(j=0;j<6;j++){ printf("%c",a[i][j]); } printf("\n"); } printf("you win!!"); return 0;} if(count==25){ printf("引き分け"); } //判定群終了 } return 0; }
その他の回答 (4)
- smily_k_c
- ベストアンサー率0% (0/2)
勝利条件ならば置いたマスから縦横、斜めx2の4つに5つ並んでるかどうか調べるだけで出来そうですね。
お礼
そうですね。
- SortaNerd_
- ベストアンサー率59% (309/522)
・すでに置かれているマスには置けないようにすること。 置こうとしたマスが空でないならば、やり直し。 ・縦、横、斜めのどれか5マス揃うと、勝利と表示されてゲームが終 了すること。 勝利判定(x,y){ i=0,j=0,n=0; while{ i+=x;j+=y; iマス右、jマス下が範囲外でなく、かつそのマスが自分の色ならば{ n++; nが4ならば、return 勝ち;} さもなくば、break; } i=0,j=0; while{ i-=x;j-=y; iマス右、jマス下が範囲外でなく、かつそのマスが自分の色ならば{ n++; nが4ならば、return 勝ち;} さもなくば、break; } return 未決着; } 勝利判定(1,0); 勝利判定(1,1); 勝利判定(0,1); 勝利判定(1,-1); とするか、あるいはマスの数が5×5しかないようなので全ての勝利パターンを地道に数えた方が早いかもしれない。 ・引き分けの表示の仕方 置いた回数を数えておいて、 置いた回数がマス目の数ならば、引き分け。
お礼
ありとうございます。 本当に。
- n2201makita
- ベストアンサー率30% (8/26)
>・すでに置かれているマスには置けないようにすること。 0から5以外の数値を入力した場合のエラーはANDでなくORです。 if((gyou>0)&&(gyou<6)&&(retsu>0)&&(retsu<6)&&(a[gyou][retsu]=' ')){ は、 if((gyou>0)||(gyou<6)||(retsu>0)||(retsu<6)||(a[gyou][retsu]!=' ')){
お礼
重ね重ねありがとうざいます。 とても役立ちました。
- n2201makita
- ベストアンサー率30% (8/26)
>・すでに置かれているマスには置けないようにすること。 C言語での数値比較は=ではなく、==です。 等しく無いは、!=です。 例えば、 if((gyou>0)&&(gyou<6)&&(retsu>0)&&(retsu<6)&&(a[gyou][retsu]=' ')){ は、 if((gyou>0)&&(gyou<6)&&(retsu>0)&&(retsu<6)&&(a[gyou][retsu]==' ')){ //先手、横マスの5つの勝ちパターン if((a[1][1]='X')&&(a[1][2]='X')&&(a[1][3]='X')&&(a[1][4]='X')&&(a[1][5]='X')){ は、 if((a[1][1]=='X')&&(a[1][2]=='X')&&(a[1][3]=='X')&&(a[1][4]=='X')&&(a[1][5]=='X')){
お礼
スペシャルサンクス!! ありがとう!!