C语言:三子棋小游戏

简介:

目标很简单:实现一个 三子棋小游戏。三子棋大家都玩过,规则就不提及了。本博文中实现的三子棋在对局中,电脑落子是随机的,不具有智能性,玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一个简单的三子棋游戏。

步骤一:制定框架

想要实现一个小游戏,第一件事就是制定框架,那么制定框架是什么意思?怎么制定框架?

#include"chess.h"
int main()
{
	int n = 0;
	do
	{
		menu();
		printf("input:\n");
		scanf("%d", &n);
		switch(n)
		{
		case 1:
			game();
			break;
		case 0:
			printf("exit\n");
			break;
		default:
			printf("input error,input again:\n");
			break;
		}
	} while(n);
	return 0;
}

这里的menu函数只是一个打印函数,定义如下:

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

将main函数写全就是制定了一个完整的框架,只要我们输入1,就会进入game函数(之后实现)进行游戏,输入0就会退出游戏,结束程序,输入其他数会让我们重新输入。整个过程就是这么简单。我们只需要实现了game的过程,整个游戏就制作完成了。

那么game函数怎么实现呢?

步骤二:实现game函数

 我们在做一个项目的时候,需要把函数的声明放在头文件里,函数的定义放在源文件里,但是具体情况可以根据个人偏好来,我个人是喜欢把主函数里会用到的函数声明放进头文件里,定义放在源文件里。如果在函数的定义中需要实现另外一个函数,就在另外一个函数的声明和定义就都放在源文件里。

要实现game函数,我们需要先将game的流程想清楚:

我们默认玩家先下棋,玩家输入一个合法坐标,然后电脑在下棋。并且每当玩家或者电脑下棋之后需要判断对局是否结束,如果结束,那么最后落子的一方胜利。另外,在玩家或者电脑下棋之后我们需要将棋盘和棋子打印出来。

void game()
{
	char pieces[ROW][COL] = { 0 };
	piecesInit(pieces, ROW, COL);
	board(pieces, ROW, COL);
	while (1)
	{
		system("cls");
		board(pieces, ROW, COL);
		printf("player move!\n");
		playerMove(pieces, ROW, COL);
		system("cls");
		board(pieces,ROW,COL);
		if (judge(pieces, ROW, COL))
		{
			printf("you win\n");
			break;
		}
		printf("computer move!\n");
		computerMove(pieces, ROW, COL);
		Sleep(1000);
		system("cls");
		board(pieces, ROW, COL);
		if (judge(pieces, ROW, COL))
		{
			printf("you lose\n");
			break;
		}
	}
}

pieces二维数组是用来储存棋子位置信息的,玩家的棋子是星号,电脑的棋子是井号

下面对game函数中用到的函数进行解释:

piecesInit:将pieces初始化,使得每一个元素都是空格,这样初始状态就不会打印出棋子

board:传入pieces数组,将棋盘和棋子一并打印

playerMove:玩家下棋,将pieces中的一个空格元素变为星号

computerMoe:电脑下棋,将pieces中的一个空格元素变为井号

judge:返回值是int,如果对局结束了就返回1,未结束返回0

这样整个game的流程就形成了

步骤三:实现game函数中的各个函数

void board(char pieces[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n",pieces[i][0],pieces[i][1],pieces[i][2]);
		if (i < row - 1)
		{
			printf("---|---|---\n");
		}
	}
}//如果不理解,可以在自己的电脑上把棋盘敲出来,就会明白board函数的原理,不敲出来不可能搞明白
void playerMove(char pieces[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("x:\n");
		scanf("%d", &x);
		printf("y:\n");
		scanf("%d", &y);
		x--;//用户输入的起始位置是1,而数组下标起始位置是0
		y--;
		if (x < 0 || x>2 || y < 0 || y>2 || pieces[x][y] != ' ')//判断是否非法
			printf("error,again\n");
		else
		break;//正确输入,退出循环
	}
	pieces[x][y] = '*';
}
void computerMove(char pieces[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % 3;//取0到2的一个数
		y = rand() % 3;
		if (x >= 0 && x <= 2 && y >= 0 && y <= 2 && pieces[x][y] == ' ')//如果位置合法
		{
			pieces[x][y] = '#';
			break;
		}
	}
}
int judge(char pieces[ROW][COL], int row, int col)
{
	//判断是否有一行三个棋子一样
	for (int i = 0; i < row; i++)
	{
		int sum = pieces[i][0] + pieces[i][1] + pieces[i][2];
		if (sum == 3 * '*' || sum == 3 * '#')
			return 1;
	}
	//判断是否有一列三个棋子一样
	for (int j = 0; j < col; j++)
	{
		int sum = pieces[0][j] + pieces[1][j] + pieces[2][j];
		if (sum == 3 * '*' || sum == 3 * '#')
			return 1;
	}
    //判断两个对角线是否有三个棋子一样
	int sum1 = pieces[0][0] + pieces[1][1] + pieces[2][2];
	int sum2 = pieces[0][2] + pieces[1][1] + pieces[2][0];
	if (sum1 == 3 * '*' || sum1 == 3 * '#' || sum2 == 3 * '*' || sum2 == 3 * '#')
		return 1;
	return 0;
}

这样就实现了一个简单的三子棋,看看效果如何:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷梦y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值