扫雷实战总结

扫雷是经典小游戏,为了写这个代码,我第一次通关了高级难度扫雷,说实话比想象中要难一些。

今天就来简单进行扫雷的c语言开发作为训练实战。

与三子棋不同,扫雷需要处理两类信息,一是地雷的坐标,二是玩家所点开的无雷区块附近的地雷数目。地雷的标记理所当然想到使用0和1来进行标记,但是如果这两类信息放在同一数组内,0和1对第二类数据 ‘地雷数目’ 来说也是有效数据,但要是以字符来标记地雷位置,就无法与地雷信息放在同一整型数组内。因此,以后在处理不同逻辑的数据时,最好是分为两个数组来进行记录和处理。

地雷坐标放置在数组int mine[ROW][COL]中,

地雷数目信息放置在数组int num[ROW][COL]中。

展示和初始化还需要数组char show[ROW][COL]

核心函数game()实现步骤如下:

定义初始化mine和num。

定义并初始化show,全部存入‘ ’元素。    InitMap(show, ROW, COL);

随机生成地雷位置,存入mine。    MakeMine(mine, ROW, COL);

根据mine的数据,生成num数据,实现的算法是:找到地雷位置,在以地雷为中心九宫格内的num元素+1,边角的位置需要进行非法判断,不要访问数组定义以外的内容。这样就得到了num的数组数据。    MakeNum(mine, num, ROW, COL);

打印空地图。    PrintMap(show, ROW, COL);

开始游戏。

玩家输入坐标。PlayerDo(show, mine, num, ROW, COL);

返回:1.非法  2.触雷  3.胜利  4.未触雷未胜利

1.非法判断:超出地图范围 或 show[x][y]非空。

2.触雷判断:mine数组判断;

既然非非法非触雷,及时更新地图!!以便胜利判断

3.胜利判断:遍历showmine,没有既是‘ ’元素但又不是地雷的位置。Iswin(show, mine, ROW, COL);

4.未触雷未胜利:打印地图。

当胜利或触雷之后,打印地雷答案    Publish(show, mine, ROW, COL);

上述为核心game()的逻辑,这只是最简单的版本。后续可以添加的功能:1.当排出num为0的格子时,公布周围的数字,直到没有0出现为止。2.排雷标记选项(公布答案后如果有标记错误的需要特别显示)。3.剩余地雷个数显示。4.第一次点击之后再实时生成地雷分布数据,以防止第一次点击就触雷。

之后的优化部分在我完全过一遍c语言之后会进行补充练习。

小tips:想将int 类型数字存入字符变量之中并打印出来的话,需要在数字后面+‘0’或+48。

因为字符型存放的是ASCII码,直接将0存入字符变量中时存入的是‘\x0’,这样是无法打印出想要的内容的。0的ASCII码值为48,所以+‘0’或者48都可以。

好的,这篇博客是我最近还算比较满意的一篇,内容进行了大量的精简,看起来还是有些进步,接下来还要继续坚持更新,感谢感谢。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值