C语言--扫雷进阶版,实现周围坐标展开
进阶版只需要再简单版的基础上增加一个能实现周围坐标展开的功能,并且改变判断是否胜利的条件。
简单版在之前的发布的文章中可看到
C语言实现简易扫雷小游戏_标仔22的博客-CSDN博客
如何能够实现坐标展开呢
可以利用递归,首先先判断我们输入的坐标周围的八个坐标,如果周围八个全都不是雷,则先展开这八个坐标。展开这八个坐标后,再依次对这八个坐标每个坐标的周围八个坐标进行判断,依次类推进行判断,直至每个判断的坐标周围全部有雷才停下。
void spread(char arr[hangs][lies], char arr2[hangs][lies], int x, int y)//坐标周围展开
{int near_x = 0, near_y = 0;int count = 0;if (x >= 1 && x <= hang && y >= 1 && y <= lie)//判断输入的坐标是否有效{//循环该坐标周围的八个坐标for (near_x = -1; near_x <= 1; near_x++){for (near_y = -1; near_y <= 1; near_y++){if (arr2[x + near_x][y + near_y] == '#'){count = jud(arr2, x + near_x, y + near_y);if (count == 0)//如果该坐标周围没有雷则全部展开{if (arr[x + near_x][y + near_y] == '*'){arr[x + near_x][y + near_y] = ' ';//利用递归第一次扫的坐标后再判断周围八个坐标每个坐标的周围八个坐标,//直至判断的坐标周围有雷再停下spread(arr, arr2, x + near_x, y + near_y);}}else{arr[x + near_x][y + near_y] = count + '0';}}}}}
}
在简单版中,我们一步只能判断一个坐标,因此胜利的条件就是我们扫雷步数等于全部坐标数减去雷的总数即可。但由于现在我们实现了展开坐标功能便不能再用该方法了,可以想一下,如果我们已经把所有的非雷坐标全部扫完,那剩下的未扫坐标就是雷的坐标,因此可以得出当未扫的坐标总数等于雷的总数时,那就已经胜利了。
int ifwin(char arr[hangs][lies], int h, int l,int p)//判断赢的条件
{int i, j;int count = 0;for (i = 1; i <= h; i++){for (j = 1; j <= l; j++){ if (arr[i][j] == '*')count++;}}//如果剩余未扫的坐标和雷的总数相等,那么玩家就获胜if (count == p)return 1;elsereturn 0;
}
以上就是改进的步骤,下面是全部代码
game.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define hang 10
#define lie 10
#define hangs hang+2
#define lies lie+2void chushi(char arr[hangs][lies], int h, int l, char set);//初始化void print(char arr[hangs][lies], int h, int l);//打印棋盘void computer(char arr[hangs][lies], int p);//电脑随机生成雷int jud(char arr[hangs][lies], int x, int y);//判断坐标周围雷的总数void play(char arr[hangs][lies], char arr2[hangs][lies], int h, int l, int p);//玩家操作int ifwin(char arr[hangs][lies], int h, int l, int p);//判断赢的条件void spread(char arr[hangs][lies], char arr2[hangs][lies], int x, int y);//坐标周围展开
game.c
#include "game.h"void chushi(char arr[hangs][lies], int h, int l, char set)//初始化棋盘
{int x, y;for (x = 0; x < h; x++){for (y = 0; y < l; y++){arr[x][y] = set;}}
}void print(char arr[hangs][lies], int h, int l)//打印棋盘
{int x = 0, y = 0;for (y = 1; y < l - 1; y++){printf(" %d ", y);}printf("\n");printf("|");for (y = 1; y < l - 1; y++){printf("---|");}printf("\n");for (x = 1; x < h - 1; x++){printf("|");for (y = 1; y < l - 1; y++){printf(" %c |", arr[x][y]);}printf("%d", x);printf("\n");printf("|");for (y = 1; y < l - 1; y++){printf("---|");}printf("\n");}
}void computer(char arr[hangs][lies], int p)//电脑布置雷
{do{//电脑随机生成雷的位置的下标int x = rand() % hang + 1;int y = rand() % lie + 1;if (arr[x][y] == '#'){arr[x][y] = '1';p--;}} while (p);
}int jud(char arr[hangs][lies], int x, int y)//判断扫雷的坐标附近八个坐标一共有多少个雷
{int i = 0;if (arr[x - 1][y - 1] == '1')i++;if (arr[x - 1][y] == '1')i++;if (arr[x - 1][y + 1] == '1')i++;if (arr[x][y - 1] == '1')i++;if (arr[x][y + 1] == '1')i++;if (arr[x + 1][y - 1] == '1')i++;if (arr[x + 1][y] == '1')i++;if (arr[x + 1][y + 1] == '1')i++;return i;
} void spread(char arr[hangs][lies], char arr2[hangs][lies], int x, int y)//坐标周围展开
{int near_x = 0, near_y = 0;int count = 0;if (x >= 1 && x <= hang && y >= 1 && y <= lie)//判断输入的坐标是否有效{//循环该坐标周围的八个坐标for (near_x = -1; near_x <= 1; near_x++){for (near_y = -1; near_y <= 1; near_y++){if (arr2[x + near_x][y + near_y] == '#'){count = jud(arr2, x + near_x, y + near_y);if (count == 0)//如果该坐标周围没有雷则全部展开{if (arr[x + near_x][y + near_y] == '*'){arr[x + near_x][y + near_y] = ' ';//利用递归第一次扫的坐标后再判断周围八个坐标每个坐标的周围八个坐标,//直至判断的坐标周围有雷再停下spread(arr, arr2, x + near_x, y + near_y);}}else{arr[x + near_x][y + near_y] = count + '0';}}}}}
}int ifwin(char arr[hangs][lies], int h, int l,int p)//判断赢的条件
{int i, j;int count = 0;for (i = 1; i <= h; i++){for (j = 1; j <= l; j++){ if (arr[i][j] == '*')count++;}}//如果剩余未扫的坐标和雷的总数相等,那么玩家就获胜if (count == p)return 1;elsereturn 0;
}void play(char arr[hangs][lies], char arr2[hangs][lies], int h, int l,int p)//玩家操作
{int x = 0, y = 0;int a;while (ifwin(arr, hang, lie,p) == 0){printf("请输入你要扫的坐标(x y):");scanf("%d%d", &x, &y);if (x >= 1 && x <= h && y >= 1 && y <= l)//判断输入的坐标是否有效{//如果该坐标上存放雷的棋盘为1,则踩到雷if (arr2[x][y] == '1'){printf("踩到雷了\n");print(arr2, hangs, lies);}//如果该坐标上操作的棋盘还未扫过,则记录并打印附近雷的总数else{a = jud(arr2, x, y);if (a == 0){arr[x][y] = ' ';spread(arr, arr2, x, y);print(arr, hangs, lies);}else{arr[x][y] = a + '0';print(arr, hangs, lies);}}}//判断输入的坐标是否有效elseprintf("输入坐标有误\n");}if (ifwin(arr, hang, lie,p) == 1){printf("恭喜你,赢了\n");}
}
main.c
#include "game.h"void meu()
{printf("*****************************\n");printf("***1、玩游戏 0、退出游戏***\n");printf("*****************************\n");
}void game()
{int p;printf("请输入雷的总数:");scanf("%d", &p);//创建数组char arr1[hangs][lies] = { 0 };//操作棋盘char arr2[hangs][lies] = { 0 };//存放雷的棋盘//初始化数组chushi(arr1, hangs, lies, '*');chushi(arr2, hangs, lies, '#');//打印棋盘print(arr1, hangs, lies);//电脑生成随机雷computer(arr2, p);//玩家操作play(arr1, arr2, hang, lie, p);
}int main()
{int i = 0;srand((unsigned)time(NULL));//设置随机种子do{meu();printf("请输入你的选择:");scanf("%d", &i);switch (i){case 0:printf("退出成功\n");break;case 1:game();break;default:printf("输入错误\n");break;}} while (i);return 0;
}
代码效果
C语言--扫雷进阶版,实现周围坐标展开相关推荐
- 二维数组应用——扫雷进阶版
C语言实现进阶版扫雷小游戏 游戏简介: 电脑随机设置10个雷,用户输入坐标,若坐标下是雷则结束游戏,不是则该位置显示周围的雷数. 相较于之前优化的点在于: 1>保证第一次不被炸死(功能实现见Sa ...
- 【C语言】进阶版_飞机小游戏
目录 前言 一.代码重构 二.新式子弹代替激光 三.优化敌方战机 四.增加积分模块 五.更好的清屏功能 写在最后 前言 没有学习函数,以上功能都在main()中实现是有点痛苦的.在学了函数之后会模块化 ...
- C语言五子棋进阶版(增设玩家对战,大棋盘,棋盘行列对应等)
经过好多天的编写,五子棋项目总算完成,作为一个学了不是很久的小白,我在编写过程中也遇到了许多困难,但还好都解决了,在此我建议和我一样,是小白的都应该写写五子棋或三子棋,当然,不是全抄别人的代码,也不是 ...
- 扫雷--优化版实现(可以自动展开、标记雷、取消标记,并加入了标记出所有的雷直接获胜、自动清屏)
目录 1.完整代码 2.实现效果 3.各函数剖析 4.总结 1.完整代码 game.h: #include<stdio.h> #include<stdlib.h> #inclu ...
- C语言 进阶版三子棋小游戏
目录 前言 游戏运行效果: 游戏代码: 1.test.c文件 2. game.h头文件 3. game.c 一.框架部分 二.游戏函数实现 1.创建数组并初始化 2.打印数组 3.玩家下棋 4.电 ...
- C语言三子棋游戏进阶版详解(包括多子棋)
目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...
- 2020进阶版 -【C语言/C++编程语言学习路径图】!
很多同学刚学编程的时候,都在问:"我要从怎么学?从哪里开始学起?"这次我们就来解决这个问题.以下是2019年→2020年进阶版C/C++编程语言的学习路径.以及需要掌握的知识点,供 ...
- c语言小游戏 精简_C语言开发简易版扫雷小游戏
C 语言开发简易版扫雷小游戏 本文给大家分享的是一个使用 C 语言开发的命令行下的简易版扫雷小游戏, 本身没有什么太 多的技术含量, 只不过是笔者的处女作, 所以还是推荐给大家, 希望对大家学习 C ...
- C语言圣诞树(精修版)附图(有初学者版还有进阶版)
圣诞节快到了,这是我到CSDN度过的第一个圣诞节,也是我学习计算机的第一个圣诞节,为了让它更有意义,我呕心沥血,自己打了两版初学者版,再在网上找了一版进阶版,都十分精美,废话少说,代码奉上: 初学者版 ...
最新文章
- php去掉字符串的最后一个字符
- 工厂方法模式与IoC/DI
- 攻防世界-Misc-stegano(巨详细.零基础)
- 关于DEBUG的一点体会
- thinkphp-1
- python time datetime
- jenkins docker 自动部署 构建_jenkins+docker+vue项目的自动部署环境
- java调用jndi出错,Webshpere数据源错误:无法查找JNDI名称
- fastdfs文件上传 read timeout_121FastDFS实现文件上传下载
- 中国料斗底部谷物拖车市场趋势报告、技术动态创新及市场预测
- 基于SSM校园一卡通管理系统
- idea插件开发可能出现的问题
- 综合评价与决策方法02——模糊综合评判法
- 网络1711班 C语言第七次作业批改总结
- 服务器内存型号的后缀字母,收藏!CPU型号20种后缀字母是什么意思?不再被坑!...
- jeecms v9图标不显示问题
- 将uniapp打包成安卓APP
- 教你如何查看加密的QQ空间和加密的QQ相册
- 一个曾讨厌英语的人是如何爱上英语学好英语的
- 移动机器人(四)四轴飞行器
热门文章
- 开讲啦观后感2017计算机科学家,【开讲啦观后感2017】2017开讲啦观后感400字_2017开讲啦观后感500字_亲亲宝贝网...
- feign.codec.DecodeException: Could not extract response: no suitable HttpMessageConverter found
- 阿里云服务器怎么购买图文教程
- Excel的某列拼成逗号分隔的字符串
- HTML四种定位-绝对定位
- 为什么每个远程工作者都应该使用虚拟浏览器进行在线协作?
- js倒计时----距离活动结束还有 xx天xx时xx分xx秒
- 计算机组成原理-中央处理器CPU
- 学学jscode的超酷HTML5时钟
- 982. 按位与为零的三元组