扫雷是经典小游戏,为了写这个代码,我第一次通关了高级难度扫雷,说实话比想象中要难一些。
今天就来简单进行扫雷的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.胜利判断:遍历show和mine,没有既是‘ ’元素但又不是地雷的位置。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都可以。
好的,这篇博客是我最近还算比较满意的一篇,内容进行了大量的精简,看起来还是有些进步,接下来还要继续坚持更新,感谢感谢。