【游戏】C语言实现扫雷游戏(超详细备注和解释)
C语言实现扫雷游戏
求个赞求个赞求个赞求个赞 谢谢
先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️
文章目录
思路
首先,我们需要理清楚思路,我们创建三个.c源文件
game.h用来存放游戏的函数声明和一些头文件引用和一些常量的定义
game.c用来实现游戏里面的函数
test.c用来存放游戏整体思路和main函数。*
建议收藏后食用~
首先:
我们先编写一个选择菜单函数menu(),如果要进行游戏,选择1,退出游戏,选择0,同时,定义一个int input来接受
然后,游戏必须在一个循环里面,在循环里面,我们可以使用switch/case语句来执行我们的input,如果case 0:我们直接break,如果case1:我们进行游戏game(),default,我们重新选择。
void menu()
{
printf("************************\n");
printf("***********1.play*******\n");
printf("***********0.exit*******\n");
printf("************************\n");
}
int main()
{
int input = 0;
do
{
srand((unsigned int)time(NULL));
menu();
printf("please enter your input:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("exit the game!!!!\n");
break;
default:
printf("err,please input again:\n");
break;
}
} while (input);
return 0;
}
接下来,最重要的,我们要开始写我们的game()函数。
游戏函数game()函数实现详解
定义两个二维数组
在实现游戏的时候,我们必须定义两个二维数组,一个是用来存放雷的信息,一个是用来展示给玩家看的
于此同时,我们的游戏是99的,但是,我们定义二维数组的时候要定义1111的,因为我们在后面排查雷的时候,边边角角的位置的排查,找一圈,如果不定义多一行,我们为了在访问数组的时候不越界访问导致程序崩溃,我们必须定义多一行。
#define ROWS 11
#define COLS 11
#define ROW ROWS-2
#define COL COLS-2
#define MINE 10//定义雷的个数
数组的初始化
//雷数组
char mine[ROWS][COLS] = { 0 };
//展示数组
char show[ROWS][COLS] = { 0 };
//初始化
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
我们可以规定,在存放雷的信息的数组mine里面,我们规定,‘1’代表有雷,‘0’代表无雷
我们可以规定,在展示数组show里面,我们规定,还没排查的位置展示" * "
当然,我们使用for循环来初始化数组
头文件:
//初始化数组
void Initboard(char board[ROWS][COLS], int rows, int cols, char ch);
void Initboard(char board[ROWS][COLS], int rows, int cols, char ch)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ch;//把ch传过来,我们就可以一个函数两用了
}
}
}
在传参的时候,我们,必须也把我们要初始化的字符也传过去,这样的话,我们写一个Initboard函数就可以完成两个数组的初始化了。
打印数组函数
紧接着,我们当然是需要一个函数来把我们的数组打印一下,展示给玩家看
此处注意,show数组才需要打印,mine数组是不能给玩家看的,给玩家看了还得了
但是,我们在写程序的时候可以打印出来看看,看看自己有没有写好
//打印数组
//Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
//打印
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("--------game-------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("--------game-------\n");
}
此处注意,我们不只是需要打印那些*,我们还需要行号和列号,具体请看代码,不懂的伙伴可以私信留言
打印出来是这样的:

布置雷函数
接下来,我们需要布置雷,我们在game.h头文件里面已经定义了雷的个数是10个(当然我们可以改)
//布置
Setmine(mine, ROW, COL);
//Displayboard(mine, ROW, COL);
//当然,我们设置完雷,我们可以打印出来看看打印好没有
此时,我们需要rand函数,来随机生成坐标,我们rand的种子用srand函数,其中,我们把种子定义成时间,这样我们才能随机生成,而且每次打开游戏生成的位置不一样
srand((unsigned int)time(NULL));
注意,这个语句只需要执行一次,因此,我们放在main()函数里面,dowhile循环外面即可
//布置
void Setmine(char board[ROWS][COLS], int row, int col)
{
int count = 0;
while (1)
{
int x = rand() % row + 1;//这里的模然后加一可以控制生成x的范围控制在1<=x<=row这个范围内,有疑问的伙伴可以给我留言。
int y = rand() % col + 1;
if (board[x][y] == '0')//先判断这个坐标有雷没有,没有,才埋雷,如果有了,重新生成。
{
board[x][y] = '1';
count++;//计算已设置雷的个数
}
if (count == MINE)//如果搞够十个了,就break;
break;
}
}
设置完雷后我们可以打印出来看一下,看完记得屏蔽代码,别让玩家看到

排查雷函数
接下来,玩家就要开始操作了
//排查
Findmine(show, mine, ROW, COL);
//排查
static int get_mine(char mine[ROWS][COLS], int x, int y)
{
return mine[x][y - 1] + mine[x][y + 1] +
mine[x - 1][y - 1] + mine[x - 1][y] +
mine[x - 1][y + 1] + mine[x + 1][y] +
mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0';//字符转整型
}
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count<row*col-MINE)
{
printf("please input the location you want to search:\n");
scanf_s("%d %d", &x,&y);
//判断坐标合法性
if (x >= 1 && x <= 9 && y <= 9 && y >= 1)
{
if (mine[x][y]=='1')
{
Displayboard(mine, row, col);
printf("Your LOSE the GAME!!\n");
//输掉的时候,打印一下雷的数组给玩家看看
break;
}
else
{
int ret = get_mine(mine, x, y);//把坐标传过去,计算附近到底有多少个雷
//如果没有被炸死,计算附近雷的个数,并打印出来
show[x][y] = ret + '0';//整型转字符
Displayboard(show, row, col);//打印排查信息给玩家看
count++;//计算已排查坐标个数
}
}
else//如果玩家输入了不在范围内的坐标,重新输入
{
printf("err,please input again\n");
}
}
if (count == row * col - MINE)//判断是否赢,赢了才打印,输的情况跳出来是不用打印的
{
printf("YOU WIN!!!\n");
Displayboard(mine, row, col);
}
}
实现以下函数,用来计算玩家输入坐标xy附近的雷个数
static int get_mine(char mine[ROWS][COLS], int x, int y)
整体代码展示
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
#include<time.h>
void game()
{
//雷数组
char mine[ROWS][COLS] = { 0 };
//展示数组
char show[ROWS][COLS] = { 0 };
//初始化
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
//打印数组
//Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
//布置
Setmine(mine, ROW, COL);
//Displayboard(mine, ROW, COL);
//排查
Findmine(show, mine, ROW, COL);
}
void menu()
{
printf("*****************************\n");
printf("***********1.play************\n");
printf("***********0.exit************\n");
printf("*****************************\n");
}
int main()
{
int input = 0;
do
{
srand((unsigned int)time(NULL));
menu();
printf("please enter your input:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("exit the game!!!!\n");
break;
default:
printf("err,please input again:\n");
break;
}
} while (input);
return 0;
}
game.h
#pragma once
#define ROWS 11
#define COLS 11
#define ROW ROWS-2
#define COL COLS-2
#define MINE 10
//初始化数组
void Initboard(char board[ROWS][COLS], int rows, int cols, char ch);
//打印
void Displayboard(char board[ROWS][COLS], int row, int col);
//布置
void Setmine(char board[ROWS][COLS], int row, int col);
//排查
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int rows, int cols);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include<stdio.h>
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char ch)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ch;//把ch传过来,我们就可以一个函数两用了
}
}
}
//打印函数
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("--------game-------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("--------game-------\n");
}
//布置雷函数
void Setmine(char board[ROWS][COLS], int row, int col)
{
int count = 0;
while (1)
{
int x = rand() % row + 1;//这里的模然后加一可以控制生成x的范围控制在1<=x<=row这个范围内,有疑问的伙伴可以给我留言。
int y = rand() % col + 1;
if (board[x][y] == '0')//先判断这个坐标有雷没有,没有,才埋雷,如果有了,重新生成。
{
board[x][y] = '1';
count++;//计算已设置雷的个数
}
if (count == MINE)//如果搞够十个了,就break;
break;
}
}
//排查雷函数
static int get_mine(char mine[ROWS][COLS], int x, int y)//计算(x,y)坐标附近雷的总数
{
return mine[x][y - 1] + mine[x][y + 1] +
mine[x - 1][y - 1] + mine[x - 1][y] +
mine[x - 1][y + 1] + mine[x + 1][y] +
mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0';//字符转整型
}
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < row * col - MINE)
{
printf("please input the location you want to search:\n");
scanf_s("%d %d", &x, &y);
//判断坐标合法性
if (x >= 1 && x <= 9 && y <= 9 && y >= 1)
{
if (mine[x][y] == '1')
{
Displayboard(mine, row, col);
printf("Your LOSE the GAME!!\n");
//输掉的时候,打印一下雷的数组给玩家看看
break;
}
else
{
int ret = get_mine(mine, x, y);
//如果没有被炸死,计算附近雷的个数,并打印出来
show[x][y] = ret + '0';//整型转字符
Displayboard(show, row, col);//打印排查信息给玩家看
count++;//计算已排查坐标个数
}
}
else//如果玩家输入了不在范围内的坐标,重新输入
{
printf("err,please input again\n");
}
}
if (count == row * col - MINE)//赢了才打印you win,否则不打印
{
printf("YOU WIN!!!\n");
Displayboard(mine, row, col);
}
}
尾声
以上就是本期博客的全部内容了,谢谢各位的耐心观看,如果对这个小游戏还有什么问题的话,可以在评论区留言哦!在划走之前点个赞支持下吧!!
【游戏】C语言实现扫雷游戏(超详细备注和解释)的更多相关文章
- C语言实现扫雷游戏(完整版)
头文件定义.函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布 ...
- 阿望教你用vue写扫雷(超详细哦)
前言 话说阿望还在大学时,某一天寝室突然停网了,于是和室友两人不约而同地打开了扫雷,比相同难度下谁更快找出全部的雷,玩得不亦乐乎,就这样,扫雷伴我们度过了断网的一周,是整整一周啊,不用上课的那种,可想 ...
- Java练习(模拟扫雷游戏)
要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读入3 ...
- JAVA_扫雷游戏(布置地雷)
1.要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读 ...
- 梦幻西游H5游戏超详细图文架设教程
前言 想体验经典Q版西游霸服快乐吗?想体验满级VIP的尊贵吗?想体验一招秒杀的爽快吗?各种极品装备.翅膀.宠物通通给你,就在梦幻西游! 本文讲解梦幻西游H5游戏的架设教程,想研究H5游戏如何实现,体验 ...
- C语言二维数组实现扫雷游戏
#include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...
- 大天使之剑H5游戏超详细图文架设教程
引言 想体验传奇游戏霸服的快乐吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品装备装备.翅膀.宠物通通给你,就在大天使之剑! 本文讲解大天使之剑H5游戏的架设教程,想研究H5游戏如 ...
- C#编写扫雷游戏
翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windo ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- 洛谷 P2670 扫雷游戏==Codevs 5129 扫雷游戏
题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...
随机推荐
- HashMap非线程安全到底有什么问题
HashMap是Java中常用的数据结构,用于存储键值对,并且提供了快速的查找和插入操作.下面挖掘一下HashMap内部的架构设计思维: 哈希函数的设计: HashMap使用哈希函数将键映射到数组索引 ...
- 如何开发一套苹果cms前端模板
本文运用了苹果cms官网的模板开发教程,开发了一套苹果cms的前端模板,感兴趣的同学可以去github下载使用. 什么是模板 模板是网站的主题外观,也被称为主题或皮肤.通过使用不同的模板,网站的前台可 ...
- ABP微服务系列学习-微服务模板结构
开源版本ABP CLI里面的模板是不包含微服务模板的,而商业版里面有一个微服务模板.这个模板据说是微服务的最佳实践,eShopOnAbp这个仓库的结构基本也和商业版的微服务模板一致.那就开始学习一下. ...
- 缓存选型:Redis or MemCache
★ Redis24篇集合 1 背景 互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计.最常用的就是使用Redis了,也有部分企业会选择使用Memcache. 所以了解 Redis 和 ...
- Laravel - 创建项目
1,创建目录 ( 路径不要带有中文 ) 2,进入目录,执行下列命令 composer create-project --prefer-dist laravel/laravel project
- SpringMVC01——回顾MVC
1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要作用是降低了视图 ...
- [转帖]从Linux源码看TIME_WAIT状态的持续时间
https://zhuanlan.zhihu.com/p/286537295 从Linux源码看TIME_WAIT状态的持续时间 前言 笔者一直以为在Linux下TIME_WAIT状态的Socket持 ...
- [转帖]【性能】大页内存 (HugePages)在通用程序优化中的应用
目录 1. 背景 2. 基于指纹的音乐检索简介 3. 原理 4. 小页的困境 5. 大页内存的配置和使用 6. 大页内存的优化效果 7. 大页内存的使用场景 8. 总结 LD_PRELOAD用法 原文 ...
- [转帖]Nacos使用2.0.1版本启动出现9848端口错误的解决方式(亲测有效)
目录 一.背景 二.报错如下 三.报错原因 四.解决方式 一.背景 nacos服务端和客户端都是 2.x版本. centos7使用原始安装nacos单机版,没有使用docker安装naocs集群. 二 ...
- [转帖] GC耗时高,原因竟是服务流量小?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 最近,我们系统配置了GC耗时的监控,但配置上之后,系统会偶尔出现GC耗时大于1s的报警,排查花了一些力气,故 ...