C语言趣味小游戏——扫雷(详解版)

article/2025/10/27 7:24:09

前言



全篇无任何废话,本文的解释大多数都在代码段中,所以一定要看代码,边看边学边理解。

这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容

可以先学习一下比扫雷还简单的猜数字和三子棋
C语言趣味小游戏——猜数字

​C语言趣味小游戏——三子棋

游戏实现的条件(简单版)

1:创建三个文件
1:(test.c):用于游戏的逻辑测试,游戏菜单的打印,游戏设计的展示

2:(game.c):用于游戏功能的具体实现,游戏的核心代码

3:(game.h):用于头文件的包含,符号以及函数的声明

2:先布置10个雷

3:扫雷

(1):输入坐标,是雷游戏结束

(2):输入坐标,不是雷,以坐标为中心,遍历周围的8个位置中有多少雷,就显示对应的数字

3:直到把所有非雷的位置找出来,游戏结束,扫雷成功

打印简易的菜单

1:先打印一个简单的菜单,过程不过多赘述,这个链接有详解
三子棋——打印一个简易的菜单


void menu()
{printf("**********************\n");printf("******  1.play  ******\n");printf("******  0.over  ******\n");printf("**********************\n");
}//	void test()
{int input = 0;do {menu();printf("选择 1 进入游戏,选择 0 退出游戏\n");scanf("%d", &input);switch (input){case 1://    game();    假设这是游戏printf("扫雷游戏\n");break;case 0:printf("退出游戏\n");break;default:printf("请重新输入\n");}} while (input);
}//int main()
{test();return 0;
}

雷盘的初始化

1:创建一个9*9的二维数组并且创建数组存放10个雷

2:把雷赋值为 1 放进数组里,如果不是雷(非雷)就为 0

3:开始扫雷 ↓ 例如下图,以为坐标(4,1)为中心,它周围有两个雷,就显示2

在下图中坐标为(3,1)的位置,它的周围只有一个雷,所以显示的是1

在这里插入图片描述
但是在第2步,我们将雷赋值为了1放进数组中

这样就会产生bug,这是绝对不允许的

而且还有一个问题,如果坐标在雷盘的边缘,就不可能遍历周围的8个坐标,如果用代码实现会太麻烦

出现的问题

至此已近出现两个问题

1:我们赋值雷为1,但是在遍历坐标周围8个位置的时候,只有1个雷,这个 ‘ 1 ’ 究竟是周围8个坐标中有1个雷,还是我们赋值的雷

2:在雷盘边缘,我们遍历不了8个位置,但是用代码实现又会太麻烦

解决方案


1(1):再创建一个数组,也就是雷盘2,我们将雷盘1和雷盘2的数据都一致,将雷盘1中显示雷个数的数字放到雷盘2,其他数据放在雷盘1,这样只会显示雷盘2,不会分不清 ‘ 1 ’ 究竟是什么

在这里插入图片描述

1(2):将雷盘1的 非雷(0),在雷盘2中以 ‘ * ’ 打印出来

在这里插入图片描述

2(1):在坐标(3,3)中,可以遍历周围8个位置,但是在坐标(9,1)中,只能遍历3个位置

如果修改代码,那将会是一个极其复杂的过程
在这里插入图片描述

2(2):所以我们将雷盘再扩大一圈,雷盘还是9×9,但是大小是11×11,多余的是防止越界遍历
在这里插入图片描述
至此,问题已经解决,下面开始代码的实现过程

游戏的实现

在文件中使用宏来定义雷盘的大小,以及防数组越界雷盘的大小

//		所在的文件	→	game.h//		↓	雷盘#define ROW 9#define COL 9//		↓	防雷盘越界#define ROWS ROW+2#define COLS COL+2

定义两个雷盘

//		所在的文件	→	test.cvoid game()
{//	游戏的实现char mine[ROWS][COLS] = { 0 };	//	雷盘 1char show[ROWS][COLS] = { 0 };	//	雷盘 2}

初始化雷盘

//		所在的文件	→	test.cvoid game()
{//	游戏的实现char mine[ROWS][COLS] = { 0 };	//	雷盘 1char show[ROWS][COLS] = { 0 };	//	雷盘 2//	初始化雷盘Init_board(mine, ROWS, COLS,'0');Init_board(show, ROWS, COLS,'*');}

声明雷盘的信息


//		所在的文件	→	game.hvoid Init_board(char arr[ROWS][COLS], int rows, int cols,char set);//						雷盘		,行	  ,列		,内容

定义雷盘的信息

//		所在的文件	→	game.cvoid Init_board(char arr[ROWS][COLS], int rows, int cols,char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){arr[i][j] = set;}}
}

打印雷盘,防止bug

// 所在的文件 → test.c

void game()
{	//	打印雷盘show_board(mine, ROW, COL);}

// 所在的文件 → game.h


//		打印void show_board(char arr[ROWS][COLS], int row, int col);

所在的文件 game.c

//		打印void show_board(char arr[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){printf("%C ", arr[i][j]);}printf("\n");}
}

效果图
在这里插入图片描述

如果用这样的信息去扫雷,每次还要找坐标,所以在数组的周围加上显示长和宽的数字,会很方便

// 所在的文件 → game.c

void show_board(char arr[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;int a = 0;for (a = 0; a <= col; a++){printf("%d ", a);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%C ", arr[i][j]);}printf("\n");}
}

效果图
在这里插入图片描述

布置雷

// 所在的文件 → test.c

void game()
{//	布置雷set_mine(mine, ROW, COL);}

// 所在的文件 → game.h


//		布置雷void set_mine(char mine[ROWS][COLS], int row, int col);

// 所在的文件 → game.c

//		布置雷void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;int x = 0;int y = 0;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';	//	布置雷count--;}}	
}

排查雷

// 所在的文件 → test.c

void game()
{//	排查雷find_mine(mine, show, ROW, COL);}

// 所在的文件 → game.h


//		排查雷void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

// 所在的文件 → game.c

int get_mine_count(char mine[ROWS][COLS], int x, int y)		//	遍历坐标周围的8个位置
{returnmine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 2][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] -8 * '0';
}
//	排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{printf("请输入要排查的坐标");int x = 0;int y = 0;while (1){scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("游戏结束,被雷炸死\n");show_board(mine, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);show[x][y] = count + '0';show_board(show, ROW, COL);}}else{printf("输入坐标非法,请重新输入\n");}}
}

所有代码

// 所在的文件 → test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu()
{printf("**********************\n");printf("******  1.play  ******\n");printf("******  0.over  ******\n");printf("**********************\n");}
void game()
{//	游戏的实现char mine[ROWS][COLS] = { 0 };	//	雷盘 1char show[ROWS][COLS] = { 0 };	//	雷盘 2//	初始化雷盘Init_board(mine, ROWS, COLS,'0');	//	雷盘 1Init_board(show, ROWS, COLS,'*');	//	雷盘 2//	打印雷盘//	show_board(mine, ROW, COL);//	布置雷set_mine(mine, ROW, COL);show_board(show, ROW, COL);//	show_board(show, ROW, COL);//	排查雷find_mine(mine, show, ROW, COL);
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择 1 进入游戏  0 退出游戏 \n");scanf("%d", &input);switch(input){case 1:game();printf("扫雷游戏\n");break;case 0:printf("退出游戏!\n");break;default :printf("输入错误,请重新选择!\n");}} while (input);return 0;
}

// 所在的文件 → game.h

#pragma once#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10//		初始化void Init_board(char arr[ROWS][COLS], int rows, int cols,char set);//		打印void show_board(char arr[ROWS][COLS], int row, int col);//		布置雷void set_mine(char mine[ROWS][COLS], int row, int col);//		排查雷void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

// 所在的文件 → game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//		初始化void Init_board(char arr[ROWS][COLS], int rows, int cols,char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){arr[i][j] = set;}}
}//		打印void show_board(char arr[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;int a = 0;for (a = 0; a <= col; a++){printf("%d ", a);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%C ", arr[i][j]);}printf("\n");}
}//		布置雷void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;int x = 0;int y = 0;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';	//	布置雷count--;}}	
}int get_mine_count(char mine[ROWS][COLS], int x, int y)		//	遍历坐标周围的8个位置
{returnmine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 2][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] -8 * '0';
}//	排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{printf("请输入要排查的坐标");int x = 0;int y = 0;int win = 0;while (win<row*col-EASY_COUNT){scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("游戏结束,被雷炸死\n");show_board(mine, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);show[x][y] = count + '0';show_board(show, ROW, COL);win++;}}else{printf("输入坐标非法,请重新输入\n");}}//	判断是否成功if (win == row * col - EASY_COUNT){printf("恭喜你,扫雷成功!\n");show_board(mine, ROW, COL);}
}

总结

1:do while 结构方便玩完一盘继续,也方便打印简易的菜单
2:实现游戏,用了两个雷盘 , 并且用char数组来存储游戏的数据
3:为了防止数组越界访问, 雷盘2 比 雷盘1 大 2×2,一个存放布置好雷的信息,一个存放排查出雷的信息
4:初始化棋盘—打印棋盘—布置雷—排查雷
5:是雷被炸死,不是雷统计坐标周围有几个雷,返回到雷盘2
6:找到所有非雷的位置,游戏结束


http://chatgpt.dhexx.cn/article/sOGQS2l1.shtml

相关文章

C语言小程序游戏

c语言小程序游戏 ​ 本代码是我大一刚学完c语言自己编写的&#xff0c;三个游戏分别是飞机竞速、走迷宫和魔塔&#xff0c;满满的都是回忆。 1、不可能的任务-飞机竞速 ​ 这种游戏在以前小时候玩的游戏机里面玩过&#xff0c;那时抱着个游戏机一玩就是一下午&#xff0c;如…

C语言简易小游戏

文章目录 前言一、猜数字游戏二、旋转光标三、多个字符从两端移动&#xff0c;向中间汇聚四、恶搞&#xff1a;关机小程序五、闪烁的五彩爱心六、扫雷七、三子棋 前言 本篇博客将带领大家自己动手写一下一些C语言小游戏&#xff1b;以增加对于C语言的兴趣&#x1f600;&#x…

c语言成绩管理系统(链表)

C语言实现了学生成绩管理系统&#xff0c;可以进行学生成绩的增加&#xff0c;删除&#xff0c;修改&#xff0c;查询&#xff0c;计算平均成绩和展示。 开发语言&#xff1a;C语言 开发工具&#xff1a;Dev c 开发者&#xff1a;呵呵up 创建学生成绩信息 2. 插入学生信息 3.…

C语言实现学生成绩管理系统设计

本系统有增加学生记录、修改学生记录、删除学生记录、按姓名查询学生记录、按C语言成绩对学生进行排序、退出系统6大功能。 能够对学生的姓名&#xff0c;学号&#xff0c;c语言成绩做相应的操作。 在检测到输入成绩大于55时&#xff0c;会自动加上5。 该管理系统设计功能模块…

c语言成绩管理系统常见错误,求教 学生成绩管理系统出错

已结贴√ 问题点数:20 回复次数:5 求教 学生成绩管理系统出错 小弟刚做了个学生成绩管理系统 编译无错误 但是运行的时候连选择函数都不能 特来求教 望高手解释 代码如下: #include #include #define N 20 #define M 100 struct score {int scr1; int scr2; int scr…

c语言课程设计 学生成绩管理系统

学生成绩管理系统要求&#xff1a; 1、系统功能以菜单方式工作&#xff1b; 2、数据的输入&#xff1b; 3、数据的插入&#xff1b; 4、数据的输出&#xff1b; 5、数据的删除&#xff1b; 6、数据的查找&#xff0c;通常以两种方式进行查找&#xff0c;如姓名、学号&#xff1…

C语言学生成绩管理系统详解

文章目录 一、系统概述二、数据类型三、自定义函数说明四、运行界面五、源代码 源代码请直接跳到最后 引言&#xff1a;最近写了C语言的大作业&#xff0c;感觉做得还行&#xff0c;记录一下&#xff0c;给后人一些参考&#xff0c;给自己留更深印象方便后续改进&#xff01; …

学生成绩管理系统 C语言

基础篇问题&#xff1a; 1.输出如下菜单&#xff1a; *********************学生成绩管理系统******************* * 1 成绩录入 2 成绩查询 3 计算平均分 * * 4 计算最高分 5 排名 6 退出 * ******************************…

C语言编程学生成绩管理系统

目录 一、介绍 二、功能 1.录入学生 2.删除学生信息 3.修改学生信息 4.查询学生信息 5.所有学生信息 6.成绩排序 7.退出程序 三、代码 1.主函数 2.头文件 3.函数封装库 一、介绍 利用C语言&#xff0c;运用链表、指针、封装函数等基本知识实现一个学生管理系统。通…

C语言学生成绩管理系统

制作学生成绩管理系统&#xff0c;可以实现以下功能&#xff1a; 每条记录包括&#xff1a;学号、姓名、专业和5门课程的成绩&#xff1b;能够实现添加、删除、修改功能&#xff1b;能够计算某学生的总分和平均分&#xff1b;能按照总分排序输出&#xff1b; 利用C语言的基本…

c语言成绩管理系统

关注微信公众号每日新觉&#xff0c;私聊作者获取提取密码点击下面链接&#xff0c;私聊作者获取提取密码。https://mp.weixin.qq.com/s/QgRQ3YB2JqCvNOGQHQ57rA 作者每日新觉&#xff0c;是一名热爱技术和编程的年轻程序员。他在计算机科学和软件工程领域有着广泛的研究和实践…

c语言成绩管理系统1.0,c语言成绩管理系统完整附源码v1.0 免费版

c语言成绩管理系统拥有和hello word一样的江湖地位&#xff0c;初学C语言的朋友基本都会从管理系统开始入手学习&#xff0c;对于很多大学生来说更是如此&#xff0c;今天为大家带来的这款系统以及源码希望能对大家学习学C语言有所帮助&#xff0c;欢迎下载使用。 C语言介绍 C语…

C语言学生成绩管理系统(综合项目)

1. 这个代码主要实现以下功能&#xff1a; 2. 用到的主要参数有&#xff1a; 1.整型变量int n;用于储存学生人数和之后的循环判断。 2.字符串char name[][];用于储存姓名。 3.浮点型变量float score[];用于储存成绩。 4.长整型变量long ID[Max];用于储存学号。 3.…

【高级语言程序设计】c语言-学生成绩管理系统

c语言期末作业 声明&#xff1a;未经允许&#xff0c;请勿转载 学生成绩管理系统 本系统能够对学生成绩管理功能&#xff0c;包括&#xff1a; 1.对多个学生成绩进行管理&#xff0c;至少10个学生。 2.每个学生至少3门课程。 3.对每个学生大学期间的成绩进行记录。 4.修改学生…

班级成绩管理系统(C语言)

文章目录 一、设计任务与目标二、实现功能三、程序源码四、效果展示 一、设计任务与目标 对一个有N个学生的班级&#xff0c;每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。 二、实现功能 &#xff08;1&#xff09;本系统采用一个结…

C语言:学生成绩管理系统

目录 一&#xff1a;功能概述&#xff1a; 二&#xff1a;实现&#xff1a; 1.主源文件 1.打印菜单&#xff01; 2.构建管理系统的框架&#xff1a; 二&#xff1a;辅源文件 1.使用结构体&#xff0c;方便后面的编写 2.输入学生信息 3.输出学生基本信息 3.按姓名查询 3.…

C语言课程设计|学生成绩管理系统(含完整代码)

目录 前言 简介 学生信息录入功能 学生单个信息查询 查询全部学生信息 修改学生信息 删除学生信息 退出 完整代码 前言 在临近期末之际&#xff0c;相信好多初学C语言的同学都开始为写C语言课程设计这件事开始焦虑了吧&#xff1f;或许会不知所措&#xff0c;或许会…

matlab importdata不能读取全部数据问题

最近使用importdata函数不能读取全部数据&#xff0c;数据集315行&#xff0c;但是读取了197行&#xff0c;那就是197-198之间有问题&#xff0c;百度之后有了思路。由于没有找到具体的证据&#xff0c;所以这里说一下解决思路。 import可以导入很多文件类型&#xff0c;.dat文…

ImportError: cannot import name 'datasets'

初次使用python scikit-learn库时出现找不到模块的问题 from sklearn import datasets ImportError: cannot import name datasets类似问题链接&#xff1a; https://stackoverflow.com/questions/39280466/cant-import-datasets-with-scikit-learn 参考答案&#xff1a; 原因…