C语言实现三子棋(详解附源码)

目录

1.准备工作

2.基本思路

1.菜单打印

2.棋盘打印

3.玩家移动

4.判断输赢

5.电脑移动

6.判断满格

3测试结果

4.源码


1.准备工作

我们创建三个分文件:game.c,game.h,text.c。

game.c:游戏内部函数的实现

game.h:游戏内部函数定义

text.c:测试入口

注意:基本思路里的游戏主体函数在game.c中实现并在game.h中定义,后面不再赘述。

2.基本思路

1.菜单打印

具体的菜单如何打印请看我的博客:猜数字游戏

void menu()
{
	printf("*********************\n");
	printf("*****   1.play  *****\n");
	printf("*****   0.exit  *****\n");
	printf("*********************\n");

}
void text()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择 1 或 0\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋开始\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);
}
int main()
{
	text();
	return 0;
}

我们便获得了菜单

2.棋盘打印

首先我们要得到一个3*3棋盘中并且其中可以下子,自然就想到的数组一个3*3的棋盘只需要一个三行三列的二维数组arr[ROW][COL]

注意:我们定义ROW和COL来代替行和列,这里行和列都为3。

在打印棋盘前我们需要将棋盘初始化,自定义函数Initboard(),将数组每个元素都修改成空格,我们便得到了一个空棋盘。

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

接下来我们用自定义函数Displayboard()来实现棋盘的打印。简易版的打印方法就是直接printf()打印五行(三行数组元素两行分界线),但是为了方便改变行数列数,我们利用循环加判断的方式实现

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

                                                               棋盘便显示出来了 

3.玩家移动

我们不妨规定玩家的棋子用一个星号*表示。接下来我们需要实现一个函数Playmove()来使玩家落子,其本质就是玩家输入一个坐标将其对应的数组元素修改成*。这里我们要考虑玩家输入坐标不在范围内和坐标处已经有棋子两种状况,并且注意玩家输入的坐标范围为1~3,但是数组访问坐标范围是0~2,因此要将玩家输入的坐标(x,y)改成(x-1,y-1)再输入数组下标。

void Playermove(char arr[ROW][COL], int row, int col)
{
	int x, y;
	while (1)
	{
		printf("请输入落子坐标 (行和列间加空格)");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row&&y >= 1 && y <= col)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该处已经落子,请重新输入\n");
			}
		}
		else
		{
			printf("输入坐标超出范围,请重新输入\n");
		}
	}
}

 玩家可以落子了

4.判断输赢

三子棋的胜利条件为:先三个棋子连成一线的一方为胜,横向、竖向、斜向均可。这便给了我们明确的思路:分别判断同一列,同一行,两条对角线是否有三个相同的棋子。有就返回这种棋子进而判断哪方获胜。

char Iswin(char arr[ROW][COL], int row, int col)
{
	int i,j;
	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];
		}
		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] != ' ') || (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' '))
		{
			return arr[1][1];
		}

	}

5.电脑移动

电脑移动比玩家移动简单(不存在超出范围的情况),我们生成两个随机数x y(具体看我的博客:猜数字游戏)再修改坐标处元素即可。

void Computermove(char arr[ROW][COL], int row, int col)
{
	srand((unsigned int)time(0));
	int x, y;
	printf("电脑走\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}

  电脑可以落子了

6.判断满格

三子棋存在平局的情况:满格并且没有一方获胜,判断满格非常简单,只要有一个空格就未满格,反之,所有元素都非空格就可以判断满格,直接平局了。

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

3测试结果

 后面有的源码,一起来试试吧!

4.源码

源码链接:github源码

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值