盤面は文字で表示します。 使う文字は好きに決めてください。 ○や×を置くときに既に書いた盤面の上に書いていこうとする場合表示位置を指定して表示しなければなりませんが、情報棟の環境でどうやるかは私も知らないので一手ごとに盤面を新しく表示していく方式でいいです。 置く場所の指定はscanfでx座標(0,1,2)、y座標(0,1,2)を入力させます。 左上を原点としてください。
盤面の状態は3×3の配列変数に記憶させます。 空のマスは0、○は1、×は2とでも決めておきましょう。
まずは盤面の配列をつくりましょう。
int ban[3][3]={{0,0,0},{0,0,0},{0,0,0}};
メインの部分ですが必ず9手以内に終わるのでforで9回繰り返すことにして
for(i=0;i<9;i++)
{
printf("%dプレイヤーのターン\n",i%2+1);
盤面の表示
入力
○×を置く
揃った列があるか判定
}
盤面&結果の表示
となります。
どちらのターンかの表示部分分かりにくいと思うので解説するとiが偶数の時は1Pのターン、奇数の時は2Pのターンと表示させたいのでiが偶数なら1に奇数なら2になるような式を考えるとi%2+1となるわけです。
○の時と×の時で場合分けしたくなりますがこのように工夫することでひとまとめにできます。
さてここでせっかく関数を覚えたので使ってみることにしましょう。
関数を使うとこのように枠組みを決めただけでメイン関数は完成していまいます。
for(i=0;i<9;i++)
{
printf("%dプレイヤーのターン\n",i%2+1);
hyouji(ban);
printf("x座標を入力せい:");scanf("%d",&x);
printf("y座標を入力せい:");scanf("%d",&y);
ban[x][y]=i%2+1;
if(hantei(i%2+1,ban)==1) break;
}
if(i==9) printf("引き分け\n");
else printf("%dプレイヤーの勝ち\n",i%2+1);
hyouji(ban);
hyoujiは盤面の配列を渡すとそれを表示する関数です。
(関数に配列を渡す時は添え字の[ ]なしで配列名だけ書きます。)
hanteiはどちらのターンか(i%2+1)と盤面の配列を渡すとそのプレイヤーが勝っている場合には1を揃った列がない場合は0を返す関数です。
ていうかそういうふうにこれからつくるということです。
表示からつくります。
void hyouji(int ban[3][3])
{
int x,y;
char ch[3]={' ','O','X'};
for(y=0;y<3;y++)
{
for(x=0;x<3;x++)
{
printf("%c",ch[ban[x][y]]);
}
printf("\n");
}
}
えらく適当です。
凝りたい人は凝ってみてください。
#を表示したりとか。
次は判定です。
int hantei(int turn,int ban[3][3])
{
if(ban[0][0]==turn && ban[0][1]==turn && ban[0][2]==turn) return 1;
if(ban[1][0]==turn && ban[1][1]==turn && ban[1][2]==turn) return 1;
if(ban[2][0]==turn && ban[2][1]==turn && ban[2][2]==turn) return 1;
if(ban[0][0]==turn && ban[1][0]==turn && ban[2][0]==turn) return 1;
if(ban[0][1]==turn && ban[1][1]==turn && ban[2][1]==turn) return 1;
if(ban[0][2]==turn && ban[1][2]==turn && ban[2][2]==turn) return 1;
if(ban[0][0]==turn && ban[1][1]==turn && ban[2][2]==turn) return 1;
if(ban[0][2]==turn && ban[1][1]==turn && ban[2][0]==turn) return 1;
return 0;
}
ちょっと汚いですがifの羅列ですましてしまいました。
もっとすっきりかける方法を思いついた人は教えてください。
というわけで解答です。
入力時の例外処理を付け足しました。
#include <stdio.h>
void hyouji(int ban[3][3]);
int hantei(int turn,int ban[3][3]);
int main(void)
{
int i,x,y;
int ban[3][3]={{0,0,0},{0,0,0},{0,0,0}};
for(i=0;i<9;i++)
{
printf("%dプレイヤーのターン\n",i%2+1);
hyouji(ban);
while(1)
{
printf("x座標を入力せい:");scanf("%d",&x);
printf("y座標を入力せい:");scanf("%d",&y);
if(x<0 || x>2 || y<0 || y>2){printf("まじめに入力せい!\n");continue;}
if(ban[x][y]!=0){printf("もう置いてあるだろ!\n");continue;}
break;
}
ban[x][y]=i%2+1;
if(hantei(i%2+1,ban)==1) break;
}
if(i==9) printf("引き分け\n");
else printf("%dプレイヤーの勝ち\n",i%2+1);
hyouji(ban);
return 0;
}
void hyouji(int ban[3][3])
{
int x,y;
char ch[3]={' ','O','X'};
for(y=0;y<3;y++)
{
for(x=0;x<3;x++)
{
printf("%c",ch[ban[x][y]]);
}
printf("\n");
}
}
int hantei(int turn,int ban[3][3])
{
if(ban[0][0]==turn && ban[0][1]==turn && ban[0][2]==turn) return 1;
if(ban[1][0]==turn && ban[1][1]==turn && ban[1][2]==turn) return 1;
if(ban[2][0]==turn && ban[2][1]==turn && ban[2][2]==turn) return 1;
if(ban[0][0]==turn && ban[1][0]==turn && ban[2][0]==turn) return 1;
if(ban[0][1]==turn && ban[1][1]==turn && ban[2][1]==turn) return 1;
if(ban[0][2]==turn && ban[1][2]==turn && ban[2][2]==turn) return 1;
if(ban[0][0]==turn && ban[1][1]==turn && ban[2][2]==turn) return 1;
if(ban[0][2]==turn && ban[1][1]==turn && ban[2][0]==turn) return 1;
return 0;
}