热门标签 | 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语言实现一个扫雷的游戏?


推荐阅读
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文介绍了一种在ANSI C中动态分配二维数组的方法。通过创建指针数组并为每个指针分配连续空间,可以灵活地管理内存。文章还讨论了一些常见的错误和注意事项。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
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社区 版权所有