C语言入门级小游戏——三子棋


今天我们写一个小游戏——三子棋来增加我们对编程的兴趣,
希望这篇文章对友友们有帮助!在这里插入图片描述

游戏文件的创建

这里我们需要是三个文件
test.c —— 游戏的测试
game.h —— 游戏函数的声明
game.c —— 游戏函数的实现

游戏菜单

游戏菜单,就像名字一样,是为了方便我们对游戏进行选择。
这里我们创建一个 函数menu 来引导我们开始游戏。
menu函数的功能
1.游戏的开始
2.游戏的退出
3.当选择错误时,重新选择

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

重头戏,游戏正式开始

棋盘的创建

数据清空

1.游戏在运行的过程中需要存储数据,因此我们可以创建3*3的二维数组
数组a[3][3]来存储数据。
2.这个棋盘刚打印出来的时候什么都没有,因此没下棋之前数组中存放空格。
这里我们创建一个 Initboard 函数 来把空格放到我们的数组中去。在这里插入图片描述

`//初始化棋盘为空格
void Initboard(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{
		for (j = 0; j < Y; j++)
		{
			a[i][j] = ' ';
		}
	}
}

`

打印棋盘

然后我们需要把棋盘给打印出来,给玩家进一步游戏。
这里我们创建一个 Displayboad****函数 把我们的棋盘打印出来。

 void Displayboad(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{ 
		//打印数据
		for (j = 0; j < Y; j++)
		{
			printf(" %c ", a[i][j]);
			if (j < Y-1)
				printf("|");
		}
		printf("\n");
		//打印分割线
		if (i < X-1)
			printf("-----------\n");
	}
}

在这里插入图片描述
注:如果未来我们的数组要变成 55,88 的呢,我们发现代码到处都要改,因此我们发现
这里我们可以定义宏,在头文件game.h 中进行宏定义。行用 m 表示,列用 n 表示
在这里插入图片描述

玩家下棋

玩家下棋时我们需要注意:
1.玩家的落子位置-1是我们数组的下标。
2.判读玩家输入的位置是否已有落子。
3.判断玩家输入的位置是否正确。
这里我们创建一个Playermove*函数来实现我们的玩家下棋
在这里插入图片描述

  void Playermove(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("玩家下棋>\n");
	 printf("请输入下棋坐标,中间使用空格>\n");
	 while (1)
	 {
		 scanf("%d %d", &i, &j);
		 if (i > 0 && i <= X   && j>0 && j <=Y)
		 {
			 if (a[i - 1][j - 1] == ' ')
			 {
				 a[i-1][j-1] = '*';
				 break;
			 }
			 else
				 printf("坐标被占用,不能落子,请重新输入\n");
		 }
		 else
		 {
			 printf("输入错误,请重新输入\n");
		 }
	 }
 }

在这里插入图片描述

电脑下棋

想要完成电脑下棋,我们需要生成随机数。
生成随机数我们需要调用 rand() 函数,而使用rand函数我们又要调用函数 srand((unsignedint)time(NULL)) 这个函数只需要调用一次,我们可以把他放到主函数中
这里我们需要调用这两个头文件
1.<stdlib.h>
2.<time.h>

电脑下棋时需要注意:
1.生成的随机数小于m,n
i = rand() % X;
j = rand() % Y;

2.判断电脑下的位置是否为空
这里我们创建一个Computermovie
函数
来实现我们的玩家下棋
在这里插入图片描述

 void Computermovie(char a[m][n], int X, int  Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("电脑下棋\n");
	 while (1)
	 {
		 i = rand() % X;
		 j = rand() % Y;
         if (a[i][j] == ' ')
		 {
			 a[i][j] = '#';
			 break;
		 }
		 
	 }
 }
 int Isfull(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < X; i++)
	 {
		 for (j = 0; j < Y; j++)
		 {
			 if (a[i][j] != ' ')
				 return  1;
		 }

	 }
	 return 0;

 }

在这里插入图片描述

输赢的判断

在我们下棋过程中,每下一次棋我们都要进行输赢的判断。
判断要返回四种不同的状态
玩家赢 --> ’ * ’
电脑赢 --> ‘#’
平局 --> ‘Q’
游戏继续 --> ‘C’
这里我们创建一个Iswin函数来实现我们的输赢判断
因为每下一次棋我们就要进行输赢的判断,所以函数的位置如下
在这里插入图片描述
在这里插入图片描述
在输赢判断的时候可能出现以下三种情况

1.赢

在赢的时候我们需要注意
1.判断行
2.判断列
3.判断对角线

char  Iswin(char a[m][n], int X, int  Y)
 {
	 int i = 0;
	 for (i = 0; i < X; i++)
	 {
		 if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][1]!=' ')
			 return a[i][0];
		 
	 }
	 for (i = 0; i < X; i++)
	 {
		 if (a[0][i] == a[1][i] && a[1][i] == a[2][i] && a[2][i] != ' ')
			 return a[1][i];
	 }
	 if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] != ' ')
		 return a[0][0];
	 if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[1][1] != ' ')
		 return a[1][1];
}

2.平局,游戏继续

平局判断的时候我们创建一个函数Isfull,
如果棋盘满了,又没有分出输赢,则为平局
如果棋盘没满,又没有分出输赢,则继续游戏

int Isfull(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < X; i++)
	 {
		 for (j = 0; j < Y; j++)
		 {
			 if (a[i][j] == ' ')
				 return  0}

	 }
	 return 1;

 }

注:函数返回1,则为平局,向game函数返回Q
函数返回0,则继续游戏,向game函数返回C在这里插入图片描述

 if (Isfull(a, m,n ) == 1)
	{
		 return 'Q';
	 }
	 else
		 return 'C';

代码展示

game.h —— 游戏函数的声明

#define  _CRT_SECURE_NO_WARNINGS
#define m 3
#define n 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void Initboard(char a[m][n], int X, int Y);
void Displayboad(char a[m][n], int X, int Y);
void Playermove(char a[m][n], int X, int Y);
void Computermovie(char a[m][n], int X, int  Y);

game.c —— 游戏函数的实现

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"
//数据清空
void Initboard(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{
		for (j = 0; j < Y; j++)
		{
			a[i][j] = ' ';
		}
	}
}
//打印棋盘
 void Displayboad(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{ 
		//打印数据
		for (j = 0; j < Y; j++)
		{
			printf(" %c ", a[i][j]);
			if (j < Y-1)
				printf("|");
		}
		printf("\n");
		//打印分割线
		if (i < X-1)
			printf("-----------\n");
	}
}
 //玩家下棋
 void Playermove(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("玩家下棋>\n");
	 printf("请输入下棋坐标,中间使用空格>\n");
	 while (1)
	 {
		 scanf("%d %d", &i, &j);
		 if (i > 0 && i <= X   && j>0 && j <=Y)
		 {
			 if (a[i - 1][j - 1] == ' ')
			 {
				 a[i-1][j-1] = '*';
				 break;
			 }
			 else
				 printf("坐标被占用,不能落子,请重新输入\n");
		 }
		 else
		 {
			 printf("输入错误,请重新输入\n");
		 }
	 }
 }
 //电脑下棋
 void Computermovie(char a[m][n], int X, int  Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("电脑下棋\n");
	 while (1)
	 {
		 i = rand() % X;
		 j = rand() % Y;
         if (a[i][j] == ' ')
		 {
			 a[i][j] = '#';
			 break;
		 }
		 
	 }
 }
 //平局判断函数
 int Isfull(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < X; i++)
	 {
		 for (j = 0; j < Y; j++)
		 {
			 if (a[i][j] == ' ')
				 return  0;
		 }

	 }
	 return 1;

 }

 char  Iswin(char a[m][n], int X, int  Y)
 {
	 //赢
	 int i = 0;
	 for (i = 0; i < X; i++)
	 {
		 if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][1]!=' ')
			 return a[i][0];
		 
	 }
	 for (i = 0; i < X; i++)
	 {
		 if (a[0][i] == a[1][i] && a[1][i] == a[2][i] && a[2][i] != ' ')
			 return a[1][i];
	 }
	 if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] != ' ')
		 return a[0][0];
	 if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[1][1] != ' ')
		 return a[1][1];
	 //平局判断
	 if (Isfull(a, m,n ) == 1)
	{
		 return 'Q';
	 }
	 else
	 //继续游戏
		 return 'C';

game.c —— 游戏函数的实现

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
	//目录
	printf("*******************************\n");
	printf("************* 1.play **********\n");
    printf("************* 0.exit **********\n");
	printf("*******************************\n");
}

void game()
{
	char k = 0;
	char a[m][n] = { 0 };
	Initboard(a, m, n);
	Displayboad(

`c
a, m, n);
	while (1)
	{
		//玩家下棋
		Playermove(a, m,n);
		//打印棋盘
		Displayboad(a, m,n);
		//判断输赢
		k=Iswin(a,m,n);
		if (k == '*')
		{
			printf("玩家赢\n");
			break;
		}
	
		
		//电脑下棋
		Computermovie(a,m,n);
		//打印棋盘
		Displayboad(a,m,n);
		//判断输赢
		k = Iswin(a, m, n);
		if (k == '*')


		{
			printf("玩家赢\n");
			break;
		}
		if (k == '#')
		{
			printf("电脑赢\n");
			break;
		}
		if (k == 'Q')
		{
			printf("平局\n");
			break;
		}
		if (k == 'C')
			printf("继续游戏\n");
	}
	
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	;
	menu();
	do
	{
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;
		}
	} while (1);
	
    return 0;
}

在这里插入图片描述

评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会kao代码的小王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值