C语言小游戏——扫雷

这篇具有很好参考价值的文章主要介绍了C语言小游戏——扫雷。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        结合前边我们所学的C语言知识,本期我们将使用C语言实现一个简单的小游戏——扫雷


目录

前言

总体框架设计

多文件分装程序

各功能模块化实现

初始化棋盘

 棋盘打印

埋雷

 判赢与排雷

游戏逻辑安排

总结


1. 总体框架设计

        和三子棋相同,游戏开始时不需要任何判断与操作直接进入游戏(符合我们所学的do…while结构),然后再根据菜单选择,开始游戏和退出游戏,这部分的操作与三子棋较为类似,这里不再详细讲解(详请看三子棋那期博客)。

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择>:\n");
		scanf("%d", &input);
		switch (input) {
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误请重新输入>:\n");
			break;
		}
	} while (input);
	return 0;
}

 菜单打印部分也是相同

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

2. 多文件分装程序

当然根据之前的方法,我将程序分装到多文件,.h文件用于声明函数,test.c文件用于程序设计,game.c文件用于函数定义

注意:函数的定义和声明是不同的(详细请看函数那期内容)

函数声明(在.h文件中)

//初始化棋盘
void InitBoard(char board[ROWS][COLS], char set);

 函数定义(在函数实现.c文件中)

void InitBoard(char board[ROWS][COLS], char set)
{
}

3. 各功能模块化实现

        接下来是最重要的部分,game()游戏部分的实现。游戏开始首先我们需要布置棋盘,设置雷的个数,和三子棋有所不同,这里我们最好是创建两个二维数组来存放我们的棋盘信息,一个棋盘用于玩家下棋棋盘,另外一个用于存放雷的信息。

3.1 初始化棋盘

    InitBoard(mine,'0');//埋雷棋盘
	InitBoard(show,'*');//玩家棋盘

 棋盘初始化和二维数组初始化相同

void InitBoard(char board[ROWS][COLS], char set)//字符型变量用于接收传入的字符
{
	for (int i = 0; i < ROWS; i++) {//为了便于更改棋盘大小这里需要定义字符型常量
		for (int j = 0; j < COLS; j++) {
			board[i][j] = set;
		}
	}
}

 3.2 棋盘打印

        棋盘的打印没有三子棋那么难,如果想要美化棋盘也是可以使用与三子棋结合的棋盘。

效果图如下:

C语言小游戏——扫雷

 这里我们采用上图的效果进行讲解

void DisPlaybroad(char board[ROWS][COLS])
{
	printf("------------------扫雷游戏------------------\n");//棋盘分割线
	printf("  ");                                           //与行打印对齐
	for (int i = 1; i <=COL; i++) {                         //打印列数序号1~9
		printf(" %d  ", i);
	}
	printf("\n");         //打印完一行及时换行
	printf("  -----------------------------------");//列与棋盘分割线
	printf("\n");
	for (int i = 1; i <= ROW; i++) {             //打印行数序号
		printf("%d ",i);
		for (int j = 1; j <= COL; j++) {        //与三子棋打印一样" %c |"为一次循环进行打印
			printf(" %c ", board[i][j]);
			if (j < COL) {                      
				printf("|");
			}
		}
		printf("\n");
		if (i < ROW) {
			for (int i = 1; i <=ROW; i++) {
				if (i ==1) {
					printf("  ");          //空出第一列用于打印序列号
			}
				printf("---");
				if (i < ROW) {           //---|---|---为一个整体(一次循环)循环打印
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

3.3 埋雷

        首先我们需要了解扫雷的规则,玩家选择一个坐标,然后检测该坐标附近8个坐标是否有雷,然后在玩家棋盘中显示附近雷的个数,简单的9*9的棋盘在边缘检测时比较复杂,那么我们就可以采用11*11的棋盘去初始化,埋雷的位置限制在9*9的棋盘中,这样就可以避免许多没必要的判断。

void SetMine(char board[ROWS][COLS]) {
	int count = N;//雷的个数
	while (count) {
		int x = rand() % ROW + 1;//使用随机数来进行埋雷,与srand配合使用来实现真正的随机。
		int y = rand() % COL + 1;//COL,ROW等于9,随机数与9求余范围是0~8,加一范围就变成了1~9
		if (board[x][y] == '0') {//确保雷的位置不重复布置
			board[x][y] = '1';//用1来表示雷
			count--;//布置之后雷的数量减一
		}
	}
}

 字符型常量定于如下:

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define N 10

 3.4 判赢与排雷

        这部分特别需要注意的是两个棋盘之间的联系。判断雷的数量在埋雷的棋盘中进行,打印输出雷的信息在show这个数组展现。

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]) {
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<COL*ROW-N) //判赢
	{
		printf("请输入要排查的位置>:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {
			if (mine[x][y] == '1') {
				printf("很遗憾,你踩到了雷,游戏结束!\n");
				DisPlaybroad(mine);            //游戏结束打印埋雷棋盘
				break;
			}
			else {
				show[x][y] = Get_Mine(mine, x, y) + '0';//扫雷部分函数返回值是一个数字,而打印时是以字符的形式打印数字,所以加上‘0’转变为对应的ascll值,注意这里将埋雷棋盘的排雷信息通过函数返回给show棋盘。
				DisPlaybroad(show);//没有踩到雷继续打印棋盘
				win++;//计数
			}
		}
		else {
			printf("坐标非法,请重新输入!\n");
		}
	}
	if (win == ROW * COL - N) {//9*9的棋盘埋10个雷,那需要走71步才能将雷扫完。
		printf("恭喜你排雷成功!\n");
		DisPlaybroad(mine);
	}
}
int Get_Mine(char mine[ROWS][COLS], int x, int y)//排雷
{//在ascll表中数字都有对应的ascll值,且是10个连续的,对应0~9,数字字符
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1]  + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0');
}//判断附近8个位置中雷的个数,1是字符不是数字有对应的ascll值,-8*‘0’减去8个字符0的ascll值

 以上便是游戏各模块的实现。

3.5 游戏逻辑安排

        游戏的各个模块我们已经基本实现,接下来我们需要将各个模块进行组装,使游戏顺利运行。

void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	//初始化棋盘
	InitBoard(mine,'0');
	InitBoard(show,'*');
	//埋雷
	SetMine(mine);
	//打印棋盘
	DisPlaybroad(show);
	//排雷+判赢
	FindMine(mine,show);
}

         首先我们创建了两个二维数组,游戏开始需要先初始化棋盘,游戏开始前我们需要先进行埋雷操作,然后才是打印棋盘,最后就是判赢。这就是游戏大概整体逻辑。

4. 代码

以下便是整体代码的呈现:

用于声明的头文件(.h文件)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define N 10
//初始化棋盘
void InitBoard(char board[ROWS][COLS], char set);
//打印棋盘
void DisPlaybroad(char board[ROWS][COLS]);
//埋雷
void SetMine(char board[ROWS][COLS]);
//排雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS]);

 函数定义文件(.c文件)

#include"game1.h"
void InitBoard(char board[ROWS][COLS], char set)
{
	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			board[i][j] = set;
		}
	}
}
void DisPlaybroad(char board[ROWS][COLS])
{
	printf("------------------扫雷游戏------------------\n");
	printf("  ");
	for (int i = 1; i <=COL; i++) {
		printf(" %d  ", i);
	}
	printf("\n");
	printf("  -----------------------------------");
	printf("\n");
	for (int i = 1; i <= ROW; i++) {
		printf("%d ",i);
		for (int j = 1; j <= COL; j++) {
			printf(" %c ", board[i][j]);
			if (j < COL) {
				printf("|");
			}
		}
		printf("\n");
		if (i < ROW) {
			for (int i = 1; i <=ROW; i++) {
				if (i ==1) {
					printf("  ");
			}
				printf("---");
				if (i < ROW) {
					printf("|");
				}
			}
			printf("\n");
		}
	}
}
void SetMine(char board[ROWS][COLS]) {
	int count = N;
	while (count) {
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (board[x][y] == '0') {
			board[x][y] = '1';
			count--;
		}
	}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]) {
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<COL*ROW-N) //判赢
	{
		printf("请输入要排查的位置>:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {
			if (mine[x][y] == '1') {
				printf("很遗憾,你踩到了雷,游戏结束!\n");
				DisPlaybroad(mine);
				break;
			}
			else {
				show[x][y] = Get_Mine(mine, x, y) + '0';
				DisPlaybroad(show);
				win++;
			}
		}
		else {
			printf("坐标非法,请重新输入!\n");
		}
	}
	if (win == ROW * COL - N) {
		printf("恭喜你排雷成功!\n");
		DisPlaybroad(mine);
	}
}
int Get_Mine(char mine[ROWS][COLS], int x, int y)//排雷
{
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1]  + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0');
}

 游戏主体(.c文件)

#include"game1.h"
void menu()
{
	printf("******************************\n");
	printf("*********   1.play   *********\n");
	printf("*********   0.exit   *********\n");
	printf("******************************\n");
}
void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	//初始化棋盘
	InitBoard(mine,'0');
	InitBoard(show,'*');
	//埋雷
	SetMine(mine);
	//打印棋盘
	DisPlaybroad(show);
	//排雷+判赢
	FindMine(mine,show);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择>:\n");
		scanf("%d", &input);
		switch (input) {
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误请重新输入>:\n");
			break;
		}
	} while (input);
	return 0;
}

总结


      以上就是今天要讲的内容,本文仅仅使用简单的C语言基础语法来实现的扫雷小游戏,希望可以对你有所帮助,感谢阅读!文章来源地址https://www.toymoban.com/news/detail-455711.html

到了这里,关于C语言小游戏——扫雷的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言:轻松实现扫雷小游戏

    目录 一、前言 二、扫雷步骤 1.创建项目 2.设计整体框架 1.定义数组长度和雷的个数 2.game函数功能 三、头文件game.h代码实现  四、测试文件test.c代码实现 五、game函数功能实现 1.初始化棋盘 2.打印棋盘  3.布置雷 4. 获得雷的个数  5.排查雷 6.game函数实现代码 六、总结 大家好

    2024年02月03日
    浏览(55)
  • 【C】C语言实现扫雷小游戏

    相信大家一定都玩过扫雷小游戏,今天我就带大家来用C语言实现一个简易版的扫雷小游戏。 这里我们还是需要三个文件来封装我们的写的代码: test.c ----- 用于我们代码的测试,以及游戏整体框架的实现。 game .c ------ 用来封装实现我们游戏的相关函数。 game.h ------ 主要用来

    2024年02月11日
    浏览(122)
  • 【C语言】扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月12日
    浏览(52)
  • C语言——扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月03日
    浏览(58)
  • 【C语言】小游戏-扫雷(清屏+递归展开+标记)

    大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装  三、代码实现步骤 1.制作简易游戏菜单  2. 初始化棋盘(11*11)  3.打印棋盘(9*9) 4.布置雷   5.计算(x,y)周围8个坐标的和  6.排查雷   1清屏后打印棋盘 2递归展开 3标记雷 四、完整代码 game.h:相关函数的声明,整个代码要引用

    2024年02月12日
    浏览(57)
  • 【C语言实现扫雷小游戏——可展开一片】

    学习完了函数和数组,让我们做个扫雷小游戏巩固一下所学的知识把! 使用控制台操作 通过菜单实现选择 棋盘为9×9 默认随机布置10个雷 排查雷 如果排查的位置不是雷,就显示周围有几个雷 排查位置是雷,游戏结束,玩家失败 把10个雷全部排除,游戏结束,玩家成功 扫雷

    2024年02月08日
    浏览(53)
  • C语言之扫雷小游戏的实现【含递归展开】

    扫雷游戏是1992年发行的一款大众类益智游戏,对于许多80后、90后来说都是童年的回忆。如今三十年过去了,这款游戏依旧受到很多网友的喜爱,今天我们一起来模拟实现一下扫雷游戏。 本文所用的编译器是VS2022 这里我们使用模块化设计,模块化设计就是把各个模块的代码分

    2024年02月02日
    浏览(52)
  • 带你实现初阶扫雷小游戏—【C语言】

      目录 1. 扫雷游戏实现的思路 注意点1  注意点2  2. 函数实现扫雷功能 2.1 初始化棋盘 2.2 显示棋盘 2.3 设置雷 2.4 排查雷 2.5 返回附近雷的个数 3.源码 3.1 game.h 3.2 game.c  3.3 test.c 我们这里拿9*9的棋盘(其中包含10个雷)来实现(这里也可以自定义棋盘大小和雷的个数 》我们这

    2024年02月05日
    浏览(107)
  • C语言经典小游戏之扫雷(超详解释+源码)

    “少年气,是历尽千帆举重若轻的沉淀,也是乐观淡然笑对生活的豁达!” 今天我们学习一下扫雷游戏怎么用C语言来实现! 一个扫雷盘面由许多方格(cell)组成,方格中随机分布着一定数量的雷(mine),一个格子中至多只有1雷。胜利条件是打开所有安全格(非雷格,saf

    2024年02月12日
    浏览(60)
  • 【C语言】扫雷小游戏详细分析(模块化编程)——内附源码

    . 🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠ 📝个人主页:gugugu—CSDN博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:gugugu的系列专栏——

    2024年02月14日
    浏览(243)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包