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

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

C言語で五目並べを作成しているのですが…

学校のC言語の授業で5×5マスの五目並べを作っています。 教科書を見ながら、がんばっていましたが行き詰ってしまったので、ヒントを下さい。 基本的なことしか習っていないので、あまり高度なことはできません。 行き詰った点 ・すでに置かれているマスには置けないようにすること。 ・縦、横、斜めのどれか5マス揃うと、勝利と表示されてゲームが終 了すること。 ・引き分けの表示の仕方 面倒とは思いますが、どうかよろしくお願いします。 ↓CPPファイル ttp://sugar310.dip.jp/cgi/upload/source/up21525.jpg ttp://sugar310.dip.jp/cgi/upload/source/up21527.zip

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

  • ベストアンサー
  • 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

  • 教えてください、1976年頃のDiscoミュージックです

    Discoに通っていた時代の曲なんですけど  曲名 アーティスト名を失念してしまいました     ご存じの方がいらっしゃいましたら御教示を御願い致します   http://sugar310.dip.jp/cgi/upload/source/up21264.mp3   http://sugar310.dip.jp/cgi/upload/source/up21265.mp3    

  • この曲のタイトルを教えてください

    この曲のタイトルとアーティスト名をご存じの方、教えてください。 http://sugar310.dip.jp/cgi/upload/source/up13432.mpg

  • 音感の良い方、この音程が分かりますでしょうか?

    音感に自信のあるという方に この曲のボーカルの出だしと最も低いところの音程を教えて いただきたいのです。 http://sugar310.dip.jp/cgi/upload/source/up22194.wma G2かG3だと思うのですが、正確に分かりません。 どうかよろしくお願いします。

  • どのようにしたら、こんな写真が撮れるのでしょうか?

    カメラ初心者です。 次の2枚の写真が凄く好きなのですが、どのような技術を使って撮影したのか分かりません。 2枚とも雰囲気は異なっていますが、ぜひこんな写真を撮れるようになりたいのです。 どのようなカメラで撮影されたのかも予想の範囲で構いませんので教えていただけると嬉しいです。 詳しい方よろしくお願いします。 http://2sen.dip.jp/cgi-bin/upgun/up1/source/up34121.jpg http://2sen.dip.jp/cgi-bin/upgun/up1/source/up34122.jpg

  • 男です。

    男です。 こういうかっこいい髪型にしたいんですが、どうやればなるんですか? 今髪の長さはこれよりちょっと短いんですが、この位伸ばすと、汚らしい感じになっちゃうし、こんなかっこよくならないんです。 この人たちはワックスとかつけてる感じでもないのに、オシャレな髪型だし、こういう風にするにはどうすればいいでしょうか。 http://2sen.dip.jp/cgi-bin/upgun/up1/source/up46349.jpg http://2sen.dip.jp/cgi-bin/upgun/up1/source/up46348.jpg

  • ウェブページの表示がおかしくなります。データ転送の異常でしょうか?

    異常:http://2sen.dip.jp/cgi-bin/upgun/up1/source/up21149.jpg 正常:http://2sen.dip.jp/cgi-bin/upgun/up1/source/up21150.jpg この画像のような感じでウェブ上で表示される画像が乱れる症状が起こっています。 必ずこうなるわけではなく、ブラウザのキャッシュを削除して再読込をすると直ります。(または別の乱れ方をする) また画像以外にも http://2sen.dip.jp/cgi-bin/upgun/up1/source/up21151.jpg のような感じで文章自体が壊れてしまうこともあります。 使用しているブラウザはFirefoxですが、IEに切り替えても発生するのでブラウザの問題ではないように思えます。 どのサイトでも発生するので、参照しているページに問題があるわけでもありません。 どの部分に問題が起きているのか心当たりのある方がおられましたら、是非ともご回答をお願いします。 環境ですが、 Lenovo Thinkpad T61, Windows Vista,Firefox 3.04,ESET Smart Security, Corega製の無線LANルータを挟んでCATVの回線を使用しています。

  • タスクバー・デスクトップで困っています

    いろいろなVSのサイトを歩いていて、パッチを当ててビジュアルスタイルを使っていたのですが、今 ttp://kuraba-web.hp.infoseek.co.jp/cgi-bin/upload/source/up1417.jpg のようにタスクバーだけがおかしいんです。 システムの復元をしてみましたが変化はなしです。 どなたか解決策をお願いします

  • Outlook2003のデザイン変更

    Outlook 2003を使用しています。 PCを買い換えたのでOfficeを入れ直したのですが、Outlookの外観が変わってしまいました。 (前) http://2sen.dip.jp:81/cgi-bin/upgun/up1/source/up15247.jpg (後) http://2sen.dip.jp:81/cgi-bin/upgun/up1/source/up15248.jpg 「画面のプロパティ」のデザインは以前と同じままですが、基本色やメールを区切る線の濃さなどが異なっており、以前と同じ設定にしたいと思っております。 Outlookのデザインを変更する方法をご存知の方は、ご教示頂けますでしょうか。 或いは、以前のHDDはまだ残っているので、Outlookのデザインなどの設定が書き込まれているファイルがありましたら、場所かファイル名を教えて下さい。

  • この花の名前を教えて下さい。

    この木の名前を教えて下さい。 http://2sen.dip.jp:81/cgi-bin/upgun/up1/source/up14613.jpg 割と最近、ピンクの花が満開になったような気がします。ちなみに九州南部です。 ネットなどで調べてみたのですが、うまく見つけられませんでした。 どうかお暇があればお教え下さい。

  • アップローダーについて

    ttp://sugachan.dip.jp/download/uploader.php ここのサイト様のアップローダーって どういう風に作るのですか?? もうちょっと詳しく説明してくれるとありがたいです。