井字棋(五子棋)代码实现

#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");
}