当前位置:首页 » 《随便一记》 » 正文

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

8 人参与  2024年02月17日 13:26  分类 : 《随便一记》  评论

点击全文阅读


前言

  这是本人第一篇博客,更多的是对现阶段c语言学习的一个总结,相当于一篇笔记,代码以及博客文章都存在着很大的不足,望各位大佬指出,本人一定及时纠正并加以补充,愿共同进步!

目录

一:扫雷游戏的基本逻辑

二:游戏的分析与设计

1.分文件编写

2.创建菜单

3.创建棋盘

4.显示棋盘


一:扫雷游戏的基本逻辑

想必大家都有接触过扫雷游戏

  我们要想用代码实现一款扫雷游戏,首先便要理清这款游戏的逻辑。

1.一张地图,且地图上有一定数量的雷,在此我们设置地图为9*9,一共有10个雷。

2.游玩方式:如果位置是雷,就炸死了。游戏失败。

                     如果不是雷,会统计该坐标周围雷的个数,并通过数字显示出来

                     如果成功找到所有非雷的位置。游戏胜利。

二:游戏的分析与设计

?1.分文件编写

  不同功能的函数封装到不同的文件中。 一个.c文件和一个.h文件被称为一个模块。 开发C程序时,稍微大型的项目就需要使用多文件开发(模块化编程)。 当代码量较大功能较复杂时,单一文件程序会使得文件非常巨大,代码量非常大,成千上万行的代码在一个文件中不便于修改和维护,因此需要将不同的功能模块放在不同的文件中。

?好处:

 1.程序更加简洁明了
 2.利于小组团队共同完成项目
 3.便于进行调试

?2.创建菜单

便于进行后续操作

void menu(){printf("--------------------------\n");printf("--------------------------\n");printf("---------1.play-----------\n");printf("---------2.quit-----------\n");printf("--------------------------\n");printf("--------------------------\n");}

用do…while循环实现菜单使用,switch语句进行菜单选择

int main(){int input = 0;do{menu();int n = 0;scanf("%d", &n);switch (n){case 1:Sweepmine();break;case 2:printf("欢迎您下次游玩!");break;deafault:break;}} while (input);return 0;}

?3.创建棋盘

由于考虑到边缘有雷的情况,防止访问出界棋盘应制作9+2=11大小的规格

000000000
00

0

000000
000000000
000000000
000000000
000000000
000000000
000000000
000000 100
000

先创建数组

注:由于列使用频率较高 在game.h中进行宏定义

?数组1 初始化 使其全部填充“*”视为遮挡、

?数组2 初始化 使其全部填充0,视为无雷,后续填充1作为雷

初始化 函数

?4.显示棋盘

  我们很容易利用for循环实现对棋盘的打印,为方便后续的体验以及游玩,我们也可以先打印序号,建立一个平面直角坐标系。

棋盘打印效果如下:

?5.布置雷

  要想生成雷,我们先利用生成指定范围的随机数的道理生成两个介于1~9的数字,作为埋雷的坐标,并进行替换。

  生成随机坐标,并将坐标位置替换为1。

注:进入while循环每设置一个雷,count减一,直到雷设置完毕跳出循环。

     ?  调用rand()需要srand()

?6.排查雷

  输入坐标,可以设置输入坐标范围以确保坐标在棋盘范围内否则重新输入,判断棋盘范围内坐标是否重复输入,若未重复输入判断是否踩雷,.若踩雷”炸死“游戏结束,放入while循环,若雷没有排查完持续循环,若所有雷被排查出则排雷成功。

void CheckMine(char arr1[ROWS][COLS],char arr2[ROWS][COLS], int row, int col){int x = 0;int y = 0;int win = 0;while (win < ROW*COL-10){printf("请输入坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] != '*'){printf("输入坐标重复,请重新输入\n");}else if (board[x][y] == '1'){printf("很遗憾,你被炸死了\n");break;}else{//不是雷,就统计x,y坐标周围有几个雷int c = Display(mine, x, y);board[x][y] = c + '0';Show(board, ROW, COL);win++;}}else{printf("输入坐标错误,请重新输入\n");}}if (win == ROW*COL-10){printf("排雷成功\n");Show(board, ROW, COL);}}

统计坐标的方法如下:

因为坐标内输入的是字符‘0’,所以统计出个坐标数‘1’之和减去‘0’及为周围雷数

int CheckMine(char arr1[ROWS][COLS], int x, int y){return  arr1[x + 1][y] + arr1[x - 1][y] + arr1[x][y + 1]    + arr1[x][y - 1] + arr1[x + 1][y + 1] + arr1[x - 1][y - 1]    + arr1[x + 1][y - 1] + arr1[x - 1][y + 1]-(8*'0');}

游戏即可正常运行

三:总结与反思

  此扫雷小游戏属于简化版,并不能做到像WINDOWS系统自带的扫雷游戏那样。代码也有更多提升的地方以上是本篇文章的全部内容了,如果这篇文章对你有些许帮助你的点赞,收藏,评论都是对我最大的支持与鼓励,另外文章的不足之处也希望大佬们能给我一点小小的建议,我会努力的检查并改进。感谢你的阅读。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/68785.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1