首页 > 其他分享 >用c语言写一个简易版的扫雷游戏

用c语言写一个简易版的扫雷游戏

时间:2024-11-10 22:16:58浏览次数:3  
标签:字符 游戏 排查 简易版 扫雷 数组 棋盘 我们 函数

1、扫雷游戏的功能说明

1.1:基本功能

         1、使用控制台实现经典的扫雷游戏

         2、游戏可以通过菜单实现继续玩或者退出游戏

         3、扫雷游戏的棋盘是9*9的格子

         4、随机布置10个雷

         5、可以排查雷

              (1)、如果位置不是雷,就显示周围有几个雷

              (2)、如果是雷,就炸死游戏结束

                (3)、   把除10个雷之外的所有非雷都找出来,则排雷成功,游戏结束

    

   1.2:游戏分析和设计

            1.2.1:数据结构分析 

            扫雷过程中,布置雷和排查雷都是需要存储的,所以我们需要一定的数据结构来存储这些              信息。

            因为我们需要9*9的棋盘上布置雷的信息和排查雷,我们首先会想到创建一个9*9的数组来              存放这些信息。

            ddb1ab0879ac4759aa1646e741495001.png

             如果某个位置布置雷,我们就存放1,其他的存放0。

             在棋盘中,例如我们派排查5,5这个位置,如果不是雷,那得算出他附近的八个格子有几               个雷,然后显示在5,5这个位置。但是我们会发现如果是边界的几个格子,要想排查周围               八个格子就会越界。但是我们也暂时想不到有没有什么方法是专门解决这个问题的,因为               会越界的格子还是挺多,而且情况都有些许不一样。

             我们可以创建一个比9*9大一圈的棋盘,即设置成11*11的棋盘,然后在设置棋盘的时候就              只对里面的9*9的棋盘进行操作。如下图所示:

            e3fd5263c8af4a46bf3371e932c972eb.png

                  还有就是当排雷的时候,如果周围就只有一个雷,那么和我们布置雷的时候的1就冲突                    了。我们可以在布置雷的时候不使用数字来表示是否有雷。我们可以使用其他字来                          表 示,使用其他的字符来布置就好了。

                  还有就是在一个棋盘上有雷的信息,非雷的信息,还要有这个格子附近有几个雷的信                      息,这些信息在一起太混乱了。

                  我们可以设置两个棋盘,一个棋盘用来放布置好的雷(对应数组mine)的信息,另一                      个棋盘(对应数组show)用来放排查好雷的信息。

                  同时我们要把给用户看的棋盘(show)初始化成字符' * ',然后布置雷的棋盘我们先初                    始化为字符" 0 "。这个功能我们可以定义一个函数来实现。

e9604d4e298849e48d2d56e8fbe11850.png

                   大概就是上面的效果了。

          1.2.2:文件结构设计

                             前面我们在函数那个章节学到了多文件的形式对函数的声明和定义,我们这边                                 通过这个例子实践一下

                    1、  text.c//写游戏的测试逻辑

                    2、game.h//写游戏需要的函数声明和数据类型

                   3、game.c//定义函数。

   2、main函数的大致逻辑

             这里和前面的 猜数字游戏基本一致,我们在此实现一个菜单,然后在main函数中让用户                 选择。

             87896d8614764dabb9bdecb3f8611028.png

 3、创建棋盘 

         创建两个11*11的数组,一个用来存放布置雷的信息,一个用来排查雷

         因为我们使用字符来表示是否是雷,使用创建一个char类型的。

         109c0cb0369f49c9a5870868c9288255.png

  4、棋盘初始化

           我们对存放雷的数组先初始化为字符0。对排查雷的就先初始化为字符" * "。

           由于这个功能需要重复使用,所以我们可以定义一个函数来实现这个功能,

           1、初始化棋盘函数的名字:我们要取一个看名字就可以大概知道这个函数要实现的功能是                                                          什么的名字。所以我们取名lnitboard。

           2、函数参数:我们要对数组进行初始化,所以参数肯定要有一个是数组,然后我们要对其                                    元素进行遍历,所以要将数组的行数和列数也传递给函数,还有就是要初始                                    化的内容。

           3、改进:我们现在如果要实现中级和高级难道的扫雷游戏的话,就要对数组的行数列数进                             行改变,这样有点麻烦,我们可以把代表棋盘大小的数据用define定义一下。我                               们可以定义一个常数9。我们要11*11的棋盘就在其基础上+2即可。

844d4f74ae744ec097312eb3bf881f71.png

                          这上面的我们放在gema.h文件中,在text.c中包含这个头文件即可。我们把对数                              组初始化的函数声明也放在game.h文件中,然后在game.c文件中对函数进行定义

                          776aa4edad3c41c58d3752d5677a33cf.png

 5、打印棋盘

          经过上面的初始化,但是我们现在还看不到棋盘,我们可以写一个函数来实现棋盘的打印,            将棋盘打印出来看我们每一步有没有正确实现。

          1、函数名:我们可以使用和库函数里打印函数差不多的名字:printfboard。

          2、函数参数:首先要传递数组给函数,还有就是数组的行数和列数,但是我们的棋盘是9*9                                    的那个部分,所以要传递的是ROW和COL。

          3、函数的声明:和上面的初始化函数一样,我们在game.h文件声明,在game.c文件中定义

      46bc4db1d162475e9c31ec8ac3470e80.png

 

            我们在游戏中只需要将存放排查雷的那个数组给用户看,不要将存放雷的数组打印了。

 

 6、布置雷

          在上面对游戏的分析,我们使用字符" 1 "代表雷,,字符" 0 "代表不是雷,则要将字符

          " 1 "随机存放进数组mine这时候就又遇到了朋友随机数了。

          1、函数名字:因为是要在数组mine上布置,所以我取为:SetMine。

          2、参数:即为数组,还有数组的行和列,还有就是雷的个数也是一个常数,我们也可以使                            用define来定义一下。

          3、函数实现:

                         我们首先要在9*9的棋盘上随机放置" 1 "字符,所以得产生1~9即1~ROW的随机数

                         然后就是布置雷,将" 1 "放进数组中的随机位置。这个要注意的是存放的时候要除                           去已经是雷的位置,这里我们使用一个if语句,然后是这个位置不是雷就存放,然                           后雷的个数减1,当雷的个数变成0个的时候雷就存放好了。

               c2635df58deb4a40b8279aaf88e5a1c3.png

7、排查雷 

        排查雷的关键就是判断用户输入的坐标是不是字符" 1 "。如果是字符1就说明踩到雷了,则游          戏结束,如果不是字符1,则不是雷,则要统计其周围有几个雷,即统计周围有几个字符1。          这个操作就要对mine数组和show数组进行操作了。

        1、函数名:我根据其功能将其命名为Findboard.

         2、函数的参数:因为涉及两个数组,使用参数肯定有数组,然后还有就是用户要排查的范                  围应该在棋盘内,所以将棋盘的大小也传递给函数,然后还有就是雷的个数

         3、函数的实现

              1、首先我们提示用户输入要排的位置,并且输入的数据要在棋盘内,如果用户输入有误                      就提示用户输入有误,重新输入

              2、用户输入一个符合要求的坐标后,就判断输入的位置是不是雷,如果是雷就直接炸                          死,游戏结束,而且当玩家游戏失败后我们可以将棋盘打印出来让玩家看咋输的。

              3、然后这个位置如果不是雷我们就要计算这个位置周围八个的格子有几个雷。这里我们                      可以再创建一个函数来计算。

              4、如何计算雷的个数是个问题,因为我们使用的是字符0和字符1来表示的是不是雷,无                     法和整型0,1一样直接计算,不过我们知道的是字符0的ASCII码为48,字符1的ASCII                     码为49,那么使用字符1减字符0就是1了,就可以代表有几个雷了,那么我们可以将                       附近八个格子的ASCII码相加然后减去8个字符0的ASCII码就是有几个雷了。

              5、然后就是把这个结果返回给show数组了,我们可以将得到附近雷的个数加上字符0的                      ASCII码就将其变成字符了,那么就可以直接赋个排查的这个格子了。

              6、结束游戏的条件,当玩家将雷都排查出来游戏就完成了,我们可以创建一个变量win                       来统计玩家已经排查的格子,当已经排查的格子win==row*col-count这个时候就说明                       雷已经排查完了,也就是说循环的判断表达式应该为win<row*col-count。

              7、函数的实现还是一样函数的声明放在game.h文件,定义放在game.c文件中,然后统                        计附近雷的个数的函数要在Findboard的前面,因为在Findboard要使用。

8、源代码

             e7d8bd1b1f2b45a3aa55afddea8d371a.png

a0caa8bc452e476cbabf9f21d455f3af.png 

87ebf548bc7e41c7b4c88d6a0b5671b1.png 

9eb4f7e0edcf4127a0c6c4b83b657134.png 

2872ae11e89f4a37b7c4b2b57eb59867.png3411f973f4e24becbf0efe6be1f6bd20.png 

9、如何将游戏分享给朋友玩 

       c4dea5a5aecc44e2be57879055b0af8d.png

在vs中将其改成这样,然后运行一次,然后去文件夹找到Relese。找到扩展名为exe的可执行文化即可。 

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=6c6da1gg1x0b

标签:字符,游戏,排查,简易版,扫雷,数组,棋盘,我们,函数
From: https://blog.csdn.net/2302_81083101/article/details/143580840

相关文章

  • 55. 跳跃游戏
    题目链接解题思路方法一:(注:这种方法过不了,提供一种思路,如果只想过题,可直接跳转到方法二)自顶向下的动态规划,先写暴力递归过程,然后再直接加缓存表即可。boolprocess(nums,index,next)nums:固定参数index:当前来到的下标next:能够走到的最远的下标来到index,怎么......
  • P2123 皇后游戏 / [USACO12JAN] Mountain Climbing S / P1248 加工生产调度 题解
    P2123皇后游戏/[USACO12JAN]MountainClimbingS/P1248加工生产调度先来看P2123。我们把这个特别重要的公式打出来:\[c_{i}=\begin{cases}a_{1}+b_{1}&,i=1\\\displaystyle\max\left\{c_{i-1},\sum_{j=1}^{i}a_{j}\right\}+b_{i}&,2\leqi\leqn\end{......
  • node.js毕设游戏代练系统(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着电子竞技行业的快速发展,游戏代练已经成为许多游戏玩家提升游戏技能、快速提升段位的一种常见方式。现有研究主要集中在电子竞技行业的发展趋势、市......
  • [NOIP2012 提高组] 国王游戏 题解
    [NOIP2012提高组]国王游戏典贪心。设当前点为\(i\),\(\prod_{k=0}^{i-1}a_k\)为\(x\),则对于\(i,j\)两点的答案:(为了方便,记\(i+1=j\))\[\mathit{res}_1=\max\bigg(\dfracx{b_i},\dfrac{xa_i}{b_j}\bigg)~;\]若交换,则:\[\mathit{res}_2=\max\bigg(\dfracx{b_j},\dfrac{......
  • [luogu2123] 皇后游戏
    那她既然都说到老国王了,那肯定就是贪心了。先声明两个引理:引理1:若\(\max(c,a)<\max(c,b)\)时,定有\(a<b\)。引理2:\(\max(a,b)-a-b=-\min(a,b)\)。证明就不说了,非常好证。考虑\(i,j\)两大臣孰先孰后,假如\(i\)在前面更优,\(x\)表示所有在他们前面的大臣的\(\suma\)......
  • 在鸿蒙NEXT中开发一个2048小游戏
    本项目是基于api12开发的2048游戏,游戏的逻辑是当用户向某个方向滑动时,将该方向相邻且相等的数字相加,同时在空白区域的随机位置生成一个随机数字。游戏中的数字越大,分数越高。  首先,游戏的界面布局分别采用两个网格组件Grid来实现,难点在于上方的菜单栏是不均等的三种尺寸的组......
  • 如何简化App Store提现?——作为游戏开发者的跨境收款体验分享
    目录如何简化AppStore提现?——作为游戏开发者的跨境收款体验分享跨境收款常见的几个问题使用万里汇收款后的体验1.结算流程简单,到账更快2.多场景收付更灵活3.多种支付方式支持使用后的效果:资金管理更高效个人建议如何简化AppStore提现?——作为游戏开发者的跨......
  • 电脑提示xinput1_3.dll丢失怎么办?游戏DLL修复方法详解
    xinput1_3.dll是一个动态链接库(DLL)文件,它在Windows操作系统中扮演着重要的角色,特别是在处理游戏控制器和其他输入设备的交互方面。这个文件是MicrosoftDirectX软件包的一部分,DirectX是微软公司开发的一个多媒体编程接口集,广泛应用于PC游戏开发中,以实现高效的图形渲染、音频处......
  • win10玩游戏找不到d3dx9_43.dll丢失怎么解决,d3dx9_43.dll丢失五种解决方法
    d3dx9_43.dll是MicrosoftDirectX9的一个关键组件,具体而言,它是一个动态链接库(DLL)文件。DirectX是由Microsoft开发的多媒体编程接口,旨在优化Windows操作系统上游戏和多媒体应用程序的性能,特别是图形和声音功能。d3dx9_43.dll文件包含了Direct3D9的一些关键功能,如3......
  • 游戏搬砖项目号称单机曰产3张
    项目概述:本文档介绍的是一个工作室运营的游戏搬砖项目。该项目通过使用自动化脚本软件在游戏内执行任务和观看广告来收集游戏内材料,项目特点:自动化脚本:利用脚本软件全自动完成游戏内任务和观看广告,以收集游戏材料。详细教程:提供详细的操作教程,包括视频和文字说明,易于理......