#include<stdio.h>
#define N 7
int table[N][N] = {0};
void printtable()//打印棋盘
{
int i, j;
printf("\tTic Tac Toe\n");
printf("Player 1 (X) - Player 2 (O)\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf(" |");
printf("\n");
for (j = 0; j < N; j++)
{
if (table[i][j] == 1)
{
printf(" X |");
}
else if (table[i][j] == -1)
{
printf(" O |");
}
else
{
if (i * N + j + 1 < 10)
printf(" %d |", i * N + j + 1);
else
printf(" %d |", i * N + j + 1);
}
}
printf("\n");
for (j = 0; j < N; j++)
printf("_____|");
printf("\n");
}
}
int wincheck()//输赢检查
{
int i, j, m, n;
int flag = 0;
for (m = 0; m <= N - 5; m++)//井字棋每次选取5×5的网格进行判断
{
for (n = 0; n <= N - 5; n++)
{
for (i = m; i <= m + 4; i++)//进行行检查
{
for (j = n; j <= n + 4; j++)
{
flag += table[i][j];
}
if (flag == 5)//对每一行的数值加和进行检查
{
return 1;//玩家一获胜
}
else if (flag == -5)
{
return 2;//玩家二获胜
}
flag = 0;
}//行检查结束
for (j = n; j <= n + 4; j++)//进行列检查
{
for (i = m; i <= m + 4; i++)
{
flag += table[i][j];
}
if (flag == 5)//对每一列的数值加和进行检查
{
return 1;//玩家一获胜
}
else if (flag == -5)
{
return 2;//玩家二获胜
}
flag = 0;
}//列检查结束
for (i = m, j = n + 4; i <= m + 4 && j >= n; i++,j --)//进行副对角线检查
{
flag += table[i][j];
}
if (flag == 5)//对每一对角线的数值加和进行检查
{
return 1;//玩家一获胜
}
else if (flag == -5)
{
return 2;//玩家二获胜
}
flag = 0;//副对角线检查结束
for (i = m,j = n; i <= m + 4 && j <= n + 4; i++,j ++)//正对角线检查
{
flag += table[i][j];
}
if (flag == 5)//对每一正对角线的数值加和进行检查
{
return 1;//玩家一获胜
}
else if (flag == -5)
{
return 2;//玩家二获胜
}
flag = 0;//正对角线判断结束
}
}//玩家1,2都没有胜利
for (i = 0; i < N; i++)//判断棋盘是否被下满
{
for (j = 0; j < N; j++)
{
if (table[i][j] == 0)
{
return -1;//如果棋盘上还有空,则返回-1;
}
}
}
return -2;//平局则返回-2
}
int playerinput(int x)
{
int location;
printf("Player %d enter a number :",x);
scanf_s("%d", &location);
while (table[location / N][location % N - 1] != 0)
{
printf("Player %d enter a right number again:",x);
scanf_s("%d", &location);
}
printf("\n");
if (x == 1)
{
table[location / N][location % N - 1] = 1;
}
else
{
table[location / N][location % N - 1] = -1;
}
}
int main()
{
while (1)
{
int temp = wincheck();
while (temp == -1)
{
printtable();
playerinput(1);
temp = wincheck();
if (temp == 1)
{
system("cls");
printtable();
printf("Player 1 win!");
return 0;
}
else if (temp == -2)
{
system("cls");
printtable();
printf("Player 1 tied with Player 2!");
return 0;
}
system("cls");
printtable();
playerinput(2);
temp = wincheck();
printtable();
if (temp == 2)
{
system("cls");
printtable();
printf("Player 2 win!");
return 0;
}
else if (temp == -2)
{
system("cls");
printtable();
printf("Player 1 tied with Player 2!");
return 0;
}
system("cls");
}
}
system("pause");
}