【游戏】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列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...
随机推荐
- Educational Codeforces Round 106 (Rated for Div. 2) 简单题解(A~C)
1499A. Domino on Windowsill 题意:给定一个 \(2 \times n\) 的空间,\(k1.k2 行要设置为白色(2 \times 1)\) 然后其他的设置为黑色 思路:为 ...
- KVM 核心功能:CPU 虚拟化
1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...
- AHB 局限性
AHB's problem SoC bus 架构 AXI is used more and more 频率200M使用AHB,频率再升高就使用AXI AHB的问题 AHB协议本身限制要求较高,比如co ...
- 【SHELL】查找包含指定字符串的目录、在找出的路径中找出指定格式的文件、并统计出数量
查找包含字符串"skull"的目录.在找出的路径中找出格式".c/.cpp/.h"的文件.并统计出数量 find . -path ./out -prune -o ...
- 【TouchGFX】MIXINS - ClickListener
ClickListener Click Listener混合器使它可以应用到其小部件,并能够通过使用回调扩展小部件来响应触摸输入. 在TouchGFX Designer中,可以通过在" Mi ...
- vocode-markdown导出pdf插件
1. 背景 在vocode中编辑markdown格式文本文件,并将其导出为pdf格式文件 2. 插件 在 vscode的扩展市场中搜索插件"Markdown PDF" 并安装 选中 ...
- [转帖]Java 8 要过时了?从JDK8飞升到JDK17,一次性给你讲明白
https://blog.csdn.net/agonie201218/article/details/127916729?spm=1001.2101.3001.6650.2&utm_mediu ...
- [转帖]Clickhouse单机及集群部署详解
https://www.cnblogs.com/ya-qiang/p/13540016.html 一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析( ...
- [转帖]JVM——内存区域:运行时数据区域详解
https://www.jianshu.com/p/cded765cfd1b 关注:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了 ...
- [转帖] 如何kill一条TCP连接?
https://www.cnblogs.com/codelogs/p/16838850.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果你的程序写 ...