一、要求分析
(1)程序开始时,由用户决定扫雷区域边长和游戏难度。然后,系统按难度模式随机产生nXn大小的雷区数据并存人文件ample.in。若雷区数据是0,则表示所在的方格内无地雷:若是1。则代表该小方格内有地雷。然后从sample.in文件读人nxn个整数存人mine数组。
(2)用户扫雷时输人用逗号分开的两个正整数x和y,每输人一对数据x和y就表示用户用鼠标单击扫雷区域中第x行第y列位置上的小方格,x和y表示的位置必须在扫雷区域内,每输人一对x和y,程序立即进行相应的处理。
(3)程序将根据读人的一组x和y的值对扫雷区域做相应的处理,具体规则如下:
①若x和y表示的小方格内没有地雷(即mine[x][y]的数值是0)而且该方格之前也没有被榆人过(即flag[x][y]的数值是0)。则将处理以该小方格为中心的由9个方格构成的正方形区域正方形区域内所有没有地雷的小方格都赋值为-1(即show[x][y]置为-1,表示该区域的地砖已经被掀开了):若在当前正方形区域内有一个位置号为x1和y1(注意:x1≠x并且y1≠y)的小方格内恰好有地雷,则此地雷就被顺利扫除,将该位置标记为-2.即show[x][y]置为-2。若该正方形区域内某些小方格已被处理过,则对这些小方格不再做任何处理。
②若x和y表示的小方格周边区域被部分处理过(即x的周边区域是前面输人过的某个方格的区域),则继续处理完x,y的周边区域。
③若x和y表示的小方格已经被输人过,则不作任何处理,继续读取下一行的x和y信息。
④若x和y表示的小方格刚好有地雷,且该小方格没有被处理过(即mine[x][y]数值是1,flag[x][y]数值是0),则表示触雷,立即输出雷区数据及相应信息,结束。
(4)若在读人x和y的过程中一直没有触雷,则一直按照位置信息处理下去,直到满足下列条件之一,就输出相应信息并结束程序。
①读入的x和y的值都0(表示用户不想再玩游戏了),则输出整个扫雷区域的状态(即输出mine数组,每行中两个整数之间用个空格分隔),然后程序结束。
②若某次处理完后,游戏区域内所有的地雷都被扫除了,则不必再读入下一行的x和y信息,输出整个扫雷区域的状态(即输出mine数组,每行中两个整数之间用一个空格分隔),程序结束。
二、阐述编程思路
用户输人的数据确定了雷区的边长n后,由程序按照难度模式随机生成雷区文件sample.in的nXn个数据。简单模式约有1/6区域埋雷,中等模式约有1/4区域埋雷,复杂模式约有1/2区域埋雷。游戏开始时从文件中读取雷区数据,由于界面的限制,系统把雷区边长的上限设置成30。雷区数据的存储是从下标为1的区域展开的。所以系统把存储雷区原始数据的mine二维数组大小上限设置成32。show数组用于显示当前的扫雷状态,未翻开的区域用·显示,翻开的无雷区显示为-1,翻开的雷区显示为-2。show数组并未定义成字符型数组。
mine数组为存储雷区原始数据的数组,对用户不可见:show数组存储的是显示给用户的扫雷当前状态数据,未扫出的雷区以*显示,扫出的雷区以-1或-2显示,分别代表扫出的无雷区和雷区。为了避免重复处理,设置flag数组记录已输人过的无雷的方格坐标,初值为0代表该无雷点未被输人过,对于输人过的无雷点,处理其周边数据后,设置其flag数组元素为1,避免下次再次输人该点后的重复处理
三、流程图
四、拓展功能
若输入的坐标已被输入过,但周边已被清理,程序仍需清理周边区域。设计程序使其无需清理。在flag[x][y]==1且mine[x][y]==0时,采用for循环,当show[x][y]==-1或show[x][y]==-2,cl=cl+1。当出现以下情况时,程序则显示"该坐标周围已被清理过!\n请按x,y格式重新输入,按0,0结束!\n"。除此之外则清理周边区域。
if(cl==9&&x>1&&y>1)
else if(cl==6&&(x==1||x==n)&&y!=n&&y!=1)
else if(cl==6&&(y==1||y==n)&&x!=n&&x!=1)
else if(cl==4&&(x==1||x==n)&&(y==1||y==n))
五、程序展示
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 32
void readfromfile(int mine[][N],int show[][N],int n,int *count);
void createnewfile(int n);
void displayarea(int area[][N],int n);
void sweep(int mine[][N],int show[][N],int n,int count);
int main(void)
{
int mine[N][N];
int show[N][N];
int n=0,count=0;
printf("\n***********************");
printf("\n* *");
printf("\n* 欢迎扫雷 *");
printf("\n* *");
printf("\n***********************");
printf("\n请输入扫雷区域的边长(5~30):");
scanf("%d",&n);
printf("你选择了%d*%d雷区.\n",n,n);
createnewfile(n);
readfromfile(mine,show,n,&count);
displayarea(show,n);
sweep(mine,show,n,count);
return 0;
}
详细内容见下篇
标签:游戏,show,int,区域,mine,开发,扫雷,方格,雷区 From: https://blog.csdn.net/2301_81016138/article/details/143479739六、运行结果