首先,定义一个二维数组,这个数组用来储存玩家的棋子,在玩之前,我们初始化这个棋盘,让棋盘的每个位置为一个空格,

为了棋盘的美观,我们用来分割线来画好棋子的每个位置加以区分。

初始化棋盘并打印棋盘

void InitBoard(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i=0;i<row;i++)
	{
		for (j=0;j<col;j++)
		{
		arr[i][j] = ' ';
		}
	}
}


void Display(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i=0;i<row;i++)
	{
		printf(" %c | %c | %c \n",arr[i][0],arr[i][1],arr[i][2]);
		if (i != row-1)
		{
			printf("---|---|---\n");
		}
	}
	printf("*****************\n");
}  

玩家先走还是电脑先走

void WhoFirstMove()
{
	printf("****************************\n");
	printf("*** 1.Player First Move ****\n");
	printf("*** 2.Computer First Move***\n");
	printf("****************************\n");
}  

接下来就是玩家和电脑玩

我们用产生的随机数来确定电脑放置棋子的位置

而玩家通过输入坐标来放置棋子

void ComputerPlay(char arr[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand()%row;
		y = rand()%col;
		if (arr[x][y]==' ')
		{
			arr[x][y] = '0';
			return;	
		}
	}
}


void PlayerMove(char arr[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	while(1)
	{
		printf("input a address(x y)>>>");
		scanf("%d %d",&x,&y);
		x--;
		y--;
		if (((x>=0)&&(x<=2))&&((y>=0)&&(y<=2)))
		{
			if (arr[x][y]==' ')
			{
				arr[x][y] = 'x';
				return;
			}
		}
		printf("address is default\n");
	}
}

接下来就开始玩游戏

void game()
{
	int choice  = 0;
	char arr[ROW][COL];
	char ret = 0;
	InitBoard(arr,ROW,COL);
	WhoFirstMove();
	printf("Who First Move>>>");
	scanf("%d",&choice);
	
	switch(choice)
	{
		case 1:
			do 
			{
				PlayerMove(arr,ROW,COL);
				Display(arr,ROW,COL);

				ComputerPlay(arr,ROW,COL);
				Display(arr,ROW,COL);
				ret = IsWon(arr,ROW,COL);
				if (ret =='x')
				{
					printf("********Player Win**********\n");
					break;
				}
				if (ret =='0')
				{
					printf("********Computer Win********\n");
					break;
				}
				if (ret =='q')
				{
					printf("平局\n");
					break;
				}
			  } while (ret == ' ');
			break;
		case 2:
			do 
			{
				ComputerPlay(arr,ROW,COL);
				Display(arr,ROW,COL);

				PlayerMove(arr,ROW,COL);
				Display(arr,ROW,COL);

				ret = IsWon(arr,ROW,COL);
				if (ret =='x')
				{
					printf("********Player Win**********\n");
					break;
				}
				if (ret =='0')
				{
					printf("********Computer Win********\n");
					break;
				}
				if (ret =='q')
				{
					printf("平局\n");
					break;
				}
			} while (ret == ' ');
			break;
	}
}

当然玩游戏时,我们需要判断谁赢谁输,因此

char IsWon(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	
	//判断行是否相等
	for (i=0;i<row;i++)
	{
		if (((arr[i][0]==arr[i][1])&&(arr[i][1]==arr[i][2]))&&(arr[i][0]!=' '))
		{
			return arr[i][0];
		}
	}
	//判断列是否相等
	for (i=0;i<col;i++)
	{
		if (((arr[0][i]==arr[1][i])&&(arr[1][i]==arr[2][i]))&&(arr[0][i]!=' '))
		{
			return arr[0][i];
		}
	}
	//判断对角线是否相等
	if (((arr[0][0]==arr[1][1])&&(arr[1][1]==arr[2][2]))&&(arr[0][0]!=' '))
	{
		return arr[0][0];
	}
	if (((arr[0][2]==arr[1][1])&&(arr[1][1]==arr[2][0]))&&(arr[1][1]!=' '))
	{
		return arr[0][2];
	}
	//判断棋盘是否已满
	if (IsFull(arr,row,col))
	{
		return 'q';
	}
	return ' ';
	
}

那么没有上面谁赢谁输的情况呢?那就是平局了,所以我们还需要判断是否是平局

在这里我们判断棋盘是否已经下满,如果下满却没有判断谁赢谁输,则判断为平局

int IsFull(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i=0;i<ROW;i++)
	{
		for (j=0;j<COL;j++)
		{
			if (arr[i][j] ==' ')
			{
				return 0;
			}
		}
	}
	return 1;
}  

主函数

#include "game.h"
void menu()
{
	printf("****************************\n");
	printf("************1.play**********\n");
	printf("************2.exit**********\n");
	printf("****************************\n");
}

void WhoFirstMove()
{
	printf("****************************\n");
	printf("*** 1.Player First Move ****\n");
	printf("*** 2.Computer First Move***\n");
	printf("****************************\n");
}

void game()
{
	int choice  = 0;
	char arr[ROW][COL];
	char ret = 0;
	InitBoard(arr,ROW,COL);
	WhoFirstMove();
	printf("Who First Move>>>");
	scanf("%d",&choice);
	
	switch(choice)
	{
		case 1:
			do 
			{
				PlayerMove(arr,ROW,COL);
				Display(arr,ROW,COL);

				ComputerPlay(arr,ROW,COL);
				Display(arr,ROW,COL);
				ret = IsWon(arr,ROW,COL);
				if (ret =='x')
				{
					printf("********Player Win**********\n");
					break;
				}
				if (ret =='0')
				{
					printf("********Computer Win********\n");
					break;
				}
				if (ret =='q')
				{
					printf("平局\n");
					break;
				}
			  } while (ret == ' ');
			break;
		case 2:
			do 
			{
				ComputerPlay(arr,ROW,COL);
				Display(arr,ROW,COL);

				PlayerMove(arr,ROW,COL);
				Display(arr,ROW,COL);

				ret = IsWon(arr,ROW,COL);
				if (ret =='x')
				{
					printf("********Player Win**********\n");
					break;
				}
				if (ret =='0')
				{
					printf("********Computer Win********\n");
					break;
				}
				if (ret =='q')
				{
					printf("平局\n");
					break;
				}
			} while (ret == ' ');
			break;
	}
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do 
	{	
		menu();
		printf("input a chice>>>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			game();
			//break;
		case 2:
			break;
		default:
			printf("chice default\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
}

这里是所以函数的头文件,我们将其统一写入game.h里

#ifndef   __GAME_H__
#define  __GAME_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define ROW  3
#define COL  3

void InitBoard(char arr[ROW][COL],int row,int col);

void Display(char arr[ROW][COL],int row,int col);

void ComputerPlay(char arr[ROW][COL],int row,int col);

void PlayerMove(char arr[ROW][COL],int row,int col);

char IsWon(char arr[ROW][COL],int row,int col);

#endif  //__GAME_H__