• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語で五目並べを作成しているのですが…)

学校のC言語の授業で五目並べを作成中の際に行き詰まった点と解決策

このQ&Aのポイント
  • 学校のC言語の授業で5×5マスの五目並べを作っています。行き詰ってしまった点として、すでに置かれているマスには置けないようにすること、縦、横、斜めのどれか5マスが揃うと勝利と表示されてゲームが終了すること、引き分けの表示の仕方があります。基本的な知識しかないので高度なことはできませんが、ヒントがほしいです。
  • C言語で五目並べを作成していますが、行き詰っています。特に、すでに置かれているマスには置けないようにする方法、縦、横、斜めのどれか5マスが揃うと勝利と表示される方法、引き分けの表示の仕方について教えてください。
  • C言語で五目並べを作っていますが、行き詰ってしまいました。すでに置かれているマスには置けないようにする方法、縦、横、斜めのどれか5マスが揃うと勝利と表示される方法、引き分けの表示の仕方について教えてください。初心者のため、基本的な情報がほしいです。

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

  • ベストアンサー
  • hn3110
  • ベストアンサー率100% (1/1)
回答No.4

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; }

noki4235
質問者

お礼

スペシャルサンクス!! ありがとう!!

その他の回答 (4)

回答No.5

勝利条件ならば置いたマスから縦横、斜めx2の4つに5つ並んでるかどうか調べるだけで出来そうですね。

noki4235
質問者

お礼

そうですね。

回答No.3

・すでに置かれているマスには置けないようにすること。 置こうとしたマスが空でないならば、やり直し。 ・縦、横、斜めのどれか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しかないようなので全ての勝利パターンを地道に数えた方が早いかもしれない。 ・引き分けの表示の仕方 置いた回数を数えておいて、 置いた回数がマス目の数ならば、引き分け。

noki4235
質問者

お礼

ありとうございます。 本当に。

回答No.2

>・すでに置かれているマスには置けないようにすること。 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]!=' ')){

noki4235
質問者

お礼

重ね重ねありがとうざいます。 とても役立ちました。

回答No.1

>・すでに置かれているマスには置けないようにすること。 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')){

関連するQ&A