C语言初学之扫雷游戏

一、游戏的框架

(1)游戏界面

在日常游戏前我们肯定会先看到游戏界面,在这里选择进行什么样的操作。因为扫雷游戏游戏的初始界面只需要选择进行或者退出就好,所以并不需要额外的功能。

    我们可以直接打印这个界面如下:


printf("*************************************\n");
printf("*******1.playgame         ***********\n");
printf("*******0.exit             ***********\n");
printf("*************************************\n");

(2)游戏的框架
(1)、创建一个整形 ’ input ’ 接受用户执行的是什么操作。
输入1就进行游戏,0就退出游戏。
使用do while语句判断用户操作。这里为什么要用do while语句,因为此语句当我们把while后表达式写为input时,输入的input为0时就会退出程序而input为1时就进行游戏,与我们之前说用户输入0时退出游戏的逻辑相同。此时我们还需注意,当用户输入除0和1之外的值时我们要提示用户输入错误,do while会重新执行此循环不会进入游戏。

int input=0;
do{
	printf("请输入你想要执行的操作:")scanf("%d",input);
	if(input==1)
	{
		game()//此为函数为游戏本体
	}
	else if(input==0{
		printf("退出游戏");
	}
	else//除0之外的数都可以让do while继续循环
	{
		printf("输入错误请重新输入");
	}
	

}while(input)

二、游戏本体的实现

(1)创建.h和.c文件
在我们写的程序需求的函数比较多时可以专门创建一个.h的头文件用来声明函数和一些库函数,我们需要用到这写库函数时直接在我们需要操作的源文件上调用这个函数就好。
1. 创建一个work.h文件放函数的声明以及库函数和常量的定义等…
2. 创建一个minemine.c文件放游戏需要用到函数的实现内容。
3. 创建一个game函数放游戏的框架。
比如我创建一个work.h的头文件在里面写入了一些库函数如#include<stdio.h>。在minemine.c这个源文件需要用到#include<stdio.h>时直接调用work.h头文件就好
格式如下:

#include "work.h"//此操作要在finemine.c文件下执行

(2)创建棋盘
1. 首先在game函数里我们先要创建两个棋盘,一个用来在后台执行我们的扫雷操作起名为mine棋盘。一个棋盘用来专门展示起名为show棋盘,当我们操作检查mine棋盘对应的位置是否存在雷给投影出来。
另外我们可以直接在.h文件中定义几个常量我们需要棋盘的长和宽也就是棋盘的长和宽,后续我们想要修改长和宽时就直接可以在头文件中修改数量。

#define ROW 9//行数
#define COL 9//列数

2. 因为观察到扫雷游戏,每次都会显示排查位置周围有多少雷,所以后续的程序中肯定会涉及到判断周围坐标是否存在 ‘ 雷 ’ 。
但是如果我们创建一个9x9的二维数组当作棋盘后排查的是棋盘边缘位置时,扫描周围八个坐标时就会扫描到不是数组内的内容。
为了方便理解我们画出图:
在这里插入图片描述
如上当我们排查到(1,9)此坐标时扫描周围8个坐标时就会扫描到我们9x9棋盘外的的数值。
所以我们可以实际创建11x11的棋盘,但只操作中间9x9的棋盘,这些白色的边缘都默认设置为不是雷。

当然这只是其中的一种方法,也可以在后续的程序中识别是否为棋盘边缘,当是棋盘边缘时是在哪条边的的边缘或者在角上,在执行排除棋盘外的数值进行识别操作。
当然这种比较麻烦一些。应该还有更便捷的方法不过我没想到罢了。
这时我们就可以拓展我们刚刚在头文件定义的常量了。
work.h中的定义:

#include<stdio.h>
#define ROW 9//行数
#define COL 9//列数
#define ROWS ROW+2
#define COLS COL+2 //这些是在头文件中定义的列数和行数

在game.c源文件中的game函数中定义两个数组

void game()
{
	#include "work.h"
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
}

(3)初始化棋盘内容
这里我们需要把mine棋盘初始化为字符0(后续把地雷设置成1做铺垫)
show棋盘初始化为*(show这里只是为了方便观看初始化成什么都可以)

void game()
{
	#include "work.h"
	char mine[ROWS][COLS];
	char show[ROWS][COLS];

//初始化两个棋盘里的内容
Initboard(mine,ROWS,COLS,'0');
Initboard(show,ROWS,COLS,'*');
}

在minegame.c文件中实现函数的功能
minegmae.c

//初始化棋盘
void Initboard(char board[ROWS][COLS],int row,int col,char set)
{
	int i = 0;
	for(;i < row ; i++)
	{
		int j = 0;
		for(; j < col ; j++)
		{
			board[i][j]=set;
		}
	}
}

(4)打印show棋盘内容
定义一个函数Printboarc用来打印棋盘

void game()
{
	#include "work.h"
	char mine[ROWS][COLS];
	char show[ROWS][COLS];

//初始化两个棋盘里的内容
Initboard(mine,ROWS,COLS,'0');
Initboard(show,ROWS,COLS,'*');
//打印棋盘
Printboard(show,ROW,COL)//因为打印的只有11x11数组中间9x9的部分所以传入的形参为ROW和COL
}

Printboard函数功能实现

void Printboard(char show[ROWS][COLS],row,col)
{
	int i = 0;
	for(i=0;i<=row;i++)//在棋盘周围显示坐标方便后续操作者选择坐标
	{
		printf("%d \n",i);
	}
	for(i=1; i <= row ; i++)
	{
		printf("%d ",i);
		int j = 0;
		for(j=1;j <= col ; j++)
		{
			printf("%c ",show[i][j]);
		}
	}
}

此时我们打印出的show棋盘就如下所示:
在这里插入图片描述

(5)在mine棋盘中随机放入地雷
1. 首先我们如果想要生成随机数的话需要用到srand函数和time搭配
首先要包含连个库函数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//行数
#define COL 9//列数
#define ROWS ROW+2
#define COLS COL+2 //这些是在头文件中定义的列数和行数

在因为game源文件中引入了work头文件所以只需要在work中包含就好
下面我们需要在主程序中事先把随机数前提srand函数写出来

#include "work.h"
int main()
{
srand((unsigned int)time(NULL));

}

2. 创建函数Setmine实现其功能


//设置地雷
Setmine(mine, ROW,COL)

实现setmine函数

void Setmine(char mine[ROWS][COLS],int row,inr col)
{
	int x,y;
	int count = EASY;//我们初始设置为5个地雷(此时可以在work头文件中定义简单模式为9的常量,方便后续修改雷的数量)
	while(count!=0)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if(mine[x][y] == ' 0 ')
		{
			mine[x][y] = '1';
			count--;
		}
	}	
}

(6)寻找雷
1. 创建Findmine函数用来进行判断此处是否是雷


//判断雷
Finemine(mine,show,ROW,COL)/*此时排查雷后需要在用户能看到的show棋盘中
显示此处石否为雷,若不是雷则显示周围雷的个数,
所以要传进去mine数组和show数组*/

实现Findmine函数

void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS]int row,int col)
{
	int x,y;
	int scancount=0;
	while(scancount<row*col-EASY)//简单模式的数量为9个地雷
	{
		printf("请输入你想排查的坐标:");
		scanf("%d%d",&x,&y);
		if(x <= row && x >= 1 && y >= 1 && y <= col)
		{
			//1.首先判断用户是否重复输入同样的坐标
			if(mine[x][y] != '*')
			{
				printf("该坐标已被排查请重新输入:")}
			//2.当排查处是雷时
			else if	(mine[x][y]=='1')	
			{	
				printf("你已被炸死了哦");
				break;
			}
			//3.排查处不是雷时
			else 
			{
				//判断排查处周围八处有几个雷
				int minecount = getmine(mine,x,y);/*先理解为getmine函数直接能排查出
				雷的个数,此函数之后会实现。*/
				show[x][y]=minecount+'0';/*不论数字几加上字符0都会成为它对	
				应的字符几*/
				scancount--;	
			}
		}
		else//输入错误
		{	
			printf("输入的坐标错误哦,请重新输入.");
		}		
	}	
	if(scancount==row*col-EASY)
	{
		printf("恭喜你扫雷成功!!!");
		break;
	}
}
//getmine函数的实现
void getmine(char mine[ROWS][COLS],int x,int y)
{
		return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y + 1] +
		mine[x + 1][y] +
		mine[x][y + 1] +
		mine[x - 1][y + 1]) - 8 * '0';
}

好了现在我们的游戏也写好了可以运行实验一下结果:
在这里插入图片描述
好的执行完成,学习分享就到这里了哦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值