热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎样用C语言实现一个扫雷的游戏?

原标题:怎样用C语言实现一个扫雷的游戏?

原标题:怎样用C语言实现一个扫雷的游戏?

在这里插入图片描述


扫雷游戏-C语言

扫雷游戏和我上面写的三子棋游戏的框架有类似,对与这种像对于来说比较复杂一点的代码.我们就应该应用同样的思路,先构建好一个框架,理清自己的思路,然后再编写代码

思路:

1.首先,对于扫雷游戏,我们应该创建两个二维数组,一个是给玩家看到的,另一个应该是含有到底在哪里的一个二维数组,只有一个是完全不够的.

2.把玩家能看到的那张表打印出来

3.让玩家输入要下的坐标,并且对其要进行校验

4.判断是否有地雷,有则游戏直接结束

5.如果没有错误,则将周围手雷的数目打在屏幕上

6.判断输赢,看翻开格子的数量如果是71=9*9-10

7.如果翻开的格子数为71,则游戏结束,玩家胜利

思路一样,主要就是根据自己列出的思路去合理的写出代码,就好啦
如下面例题:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_COL 9 //宏定义
#define MAX_ROW 9
#define DEFAULT_MINE_COUNT 10 //宏定义一个10个雷
//扫雷游戏
//1.创建两个二维数组并进行初始化
//2.打印一张地图
//3.玩家输入要读取的坐标,并对玩家输入的坐标进行校验
//4.判断输入的坐标是否有地雷,如果存在,则直接游戏结束
//5.如果没有,则统计周围雷的数目并将其显示在屏幕上
//6.判断输赢,并检查翻开格子的数量,9*9-10=71;
//7.如果将71个格子全部翻开,则游戏结束,玩家胜利
int menu(){ //菜单显示
printf("\n\n=======================\n");
printf("1.开始游戏\n");
printf("2.结束游戏\n");
printf("=======================\n");
printf("请输入序号:");
int choice = 0;
scanf("%d",&choice);
return choice;
}
//两个期盼的初始化
void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][文章来源地址34179.htmlMAX_COL]){ //对这两个二维数组进行赋初值,并将其改变所存放的数www.yii666.com
for (int row = 0; row < MAX_ROW; row++){ //for嵌套(二维数组)
for (int col = 0; col < MAX_COL; col++){
showMap[row][col] = '*';
}
}
for (int row = 0; row <MAX_ROW; row++){
for (int col = 0; col <MAX_COL; col++){
mineMap[row][col] = '0';
}
}
int n = DEFAULT_MINE_COUNT; //将雷赋值给n
while(n > 0){ //循环并让电脑取随机数
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if文章来源地址34179.html (mineMap[row][col] == '1'){ www.yii666.com //遇到雷
continue;
}
mineMap[row][col] = '1';
n--; //逐次递减,保证只有10个雷
}
}
//将只对于玩家才能看见棋盘打印出来
void printMap(char theMap[MAX_ROW][MAX_COL]){ //这个是玩家能看到的界面
printf("1 2 3 4 5 6 7 8 9\n");
printf("-----------------\n");
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
printf文章来源站点https://www.yii666.com/("%c ",theMap[row][col]);
}
printf("\n");
}
printf("-----------------\n");
}
//更新棋盘
void updateShowMap(char showMap[MAX_ROW][MAX_COL], //让在翻开的格子上显示周围8个格子有雷的数目
char mineMap[MAX_ROW][MAX_COL],int row, int col){
int count = 0;
for (int r = row - 1; r<= row + 1; r++){
for (int c = col - 1; c <= col + 1; c++){
if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL){ //校验,让其在给定范围内
continue;
}
if (mineMap[r][c] == '1'){ //周围有,则++
count++;
}
}
}
showMap[row][col] = count + '0'; //将其转换为10进制
}
//游戏函数
void game(){
char showMap[MAX_ROW][MAX_COL] = { 0 }; //定义二维数组
char mineMap[MAX_ROW][MAX_COL] = { 0 };
init(showMap, mineMap); //1.对两个二维数组进行赋初值,定义
int openedBlockCount = 0;
while (1){

printMap(showMap); //2.将图显示出来
int row = 0;
int col = 0;
printf("请输入你要翻开的坐标(row,col):");
scanf("%d %d",&row, &col); //赋予地址
if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){ //这里是对函数的校验
printf("您输入的坐标有误!\n");
continue;
}
if (showMap[row][col] != '*'){ //错误提醒
printf("当前位置已经被翻开!\n");
continue;
}
if (mineMap[row][col] == '1'){ //遇到雷时,游戏结束
printf("Game over!\n");
printMap(mineMap); //并且打印mineMap()
break;
}
updateShowMap( showMap, mineMap, row, col); //将周围雷的数目显示在屏幕上
openedBlockCount++; //已经被翻开的格子的数目
if (openedBlockCount == MAX_ROW*MAX_COL - DEFAULT_MINE_COUNT){ //翻开格子数目71,则玩家胜利
printf("游戏胜利了!;");
printMap(mineMap); //打印雷图
break;
}
}
}
int main(){
while (1){
int choice = menu(); //创建菜单
if (choice == 1){
game(); //并在choice=1时调用game()函数
}else if (choice == 0){
printf("Goodbye!");
break;
}else{
printf("您的输入有误");
}
}
system("pause");
return 0;
}

写这个代码的时候还是要小心,要细心,尤其是在row<=MAX_ROW这一部分的时候,一定要细心,早上我也调试了好久,就是因为多加了等于号,累了大半天.还是要多敲代码 ,gai油!

来源于:怎样用C语言实现一个扫雷的游戏?


推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 直击热门考点——结构体内存对齐
    原标题:直击热门考点——结构体内存对齐文章目录前言一、引例 ... [详细]
  • 20210921c++ 继承,虚继承(内存结构)
    原标题:2021-09-21c++继承,虚继承(内存结构)普通的公有继承 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • JavaScript实现拖动对话框效果
    原标题:JavaScript实现拖动对话框效果代码实现:<!DOCTYPEhtml><htmllan ... [详细]
author-avatar
艹尛鱈_695
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有