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语言实现扫雷游戏(超详细备注和解释)的更多相关文章

  1. C语言实现扫雷游戏(完整版)

    头文件定义.函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布 ...

  2. 阿望教你用vue写扫雷(超详细哦)

    前言 话说阿望还在大学时,某一天寝室突然停网了,于是和室友两人不约而同地打开了扫雷,比相同难度下谁更快找出全部的雷,玩得不亦乐乎,就这样,扫雷伴我们度过了断网的一周,是整整一周啊,不用上课的那种,可想 ...

  3. Java练习(模拟扫雷游戏)

    要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读入3 ...

  4. JAVA_扫雷游戏(布置地雷)

    1.要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读 ...

  5. 梦幻西游H5游戏超详细图文架设教程

    前言 想体验经典Q版西游霸服快乐吗?想体验满级VIP的尊贵吗?想体验一招秒杀的爽快吗?各种极品装备.翅膀.宠物通通给你,就在梦幻西游! 本文讲解梦幻西游H5游戏的架设教程,想研究H5游戏如何实现,体验 ...

  6. C语言二维数组实现扫雷游戏

    #include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...

  7. 大天使之剑H5游戏超详细图文架设教程

    引言 想体验传奇游戏霸服的快乐吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品装备装备.翅膀.宠物通通给你,就在大天使之剑! 本文讲解大天使之剑H5游戏的架设教程,想研究H5游戏如 ...

  8. C#编写扫雷游戏

    翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windo ...

  9. 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 ...

  10. 洛谷 P2670 扫雷游戏==Codevs 5129 扫雷游戏

    题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...

随机推荐

  1. Educational Codeforces Round 106 (Rated for Div. 2) 简单题解(A~C)

    1499A. Domino on Windowsill 题意:给定一个 \(2 \times n\) 的空间,\(k1.k2 行要设置为白色(2 \times 1)\) 然后其他的设置为黑色 思路:为 ...

  2. KVM 核心功能:CPU 虚拟化

    1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...

  3. AHB 局限性

    AHB's problem SoC bus 架构 AXI is used more and more 频率200M使用AHB,频率再升高就使用AXI AHB的问题 AHB协议本身限制要求较高,比如co ...

  4. 【SHELL】查找包含指定字符串的目录、在找出的路径中找出指定格式的文件、并统计出数量

    查找包含字符串"skull"的目录.在找出的路径中找出格式".c/.cpp/.h"的文件.并统计出数量 find . -path ./out -prune -o ...

  5. 【TouchGFX】MIXINS - ClickListener

    ClickListener Click Listener混合器使它可以应用到其小部件,并能够通过使用回调扩展小部件来响应触摸输入. 在TouchGFX Designer中,可以通过在" Mi ...

  6. vocode-markdown导出pdf插件

    1. 背景 在vocode中编辑markdown格式文本文件,并将其导出为pdf格式文件 2. 插件 在 vscode的扩展市场中搜索插件"Markdown PDF" 并安装 选中 ...

  7. [转帖]Java 8 要过时了?从JDK8飞升到JDK17,一次性给你讲明白

    https://blog.csdn.net/agonie201218/article/details/127916729?spm=1001.2101.3001.6650.2&utm_mediu ...

  8. [转帖]Clickhouse单机及集群部署详解

    https://www.cnblogs.com/ya-qiang/p/13540016.html 一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析( ...

  9. [转帖]JVM——内存区域:运行时数据区域详解

    https://www.jianshu.com/p/cded765cfd1b 关注:CodingTechWork,一起学习进步. 引言   我们经常会被问到一个问题是Java和C++有何区别?我们除了 ...

  10. [转帖] 如何kill一条TCP连接?

    https://www.cnblogs.com/codelogs/p/16838850.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果你的程序写 ...