dポイントプレゼントキャンペーン実施中!

学校のC言語の授業で5×5マスの五目並べを作っています。
教科書を見ながら、がんばっていましたが行き詰ってしまったので、ヒントを下さい。
基本的なことしか習っていないので、あまり高度なことはできません。

行き詰った点
・すでに置かれているマスには置けないようにすること。
・縦、横、斜めのどれか5マス揃うと、勝利と表示されてゲームが終 了すること。
・引き分けの表示の仕方

面倒とは思いますが、どうかよろしくお願いします。

↓CPPファイル
ttp://sugar310.dip.jp/cgi/upload/source/up21525.jpg
ttp://sugar310.dip.jp/cgi/upload/source/up21527.zip

A 回答 (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;
}
    • good
    • 6
この回答へのお礼

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

お礼日時:2010/02/25 21:38

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

    • good
    • 2
この回答へのお礼

そうですね。

お礼日時:2010/02/25 21:39

・すでに置かれているマスには置けないようにすること。


置こうとしたマスが空でないならば、やり直し。

・縦、横、斜めのどれか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しかないようなので全ての勝利パターンを地道に数えた方が早いかもしれない。

・引き分けの表示の仕方
置いた回数を数えておいて、
置いた回数がマス目の数ならば、引き分け。
    • good
    • 4
この回答へのお礼

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

お礼日時:2010/02/25 21:38

>・すでに置かれているマスには置けないようにすること。


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]!=' ')){
    • good
    • 3
この回答へのお礼

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

お礼日時:2010/02/25 21:39

>・すでに置かれているマスには置けないようにすること。


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')){
    • good
    • 3

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!