所在的位置: C++ >> C++介绍 >> C小游戏扫雷

C小游戏扫雷

皮肤科医生程少为 https://baijiahao.baidu.com/s?id=1678954418699267434&wfr=spider&for=pc
前言

提示:本文是基于easyX图形库实现的,还有部分功能可以添加,仅适合新手参考。

提示:以下是本篇文章正文内容,下面案例可供参考

一、扫雷游戏模式

在确定大小的矩形雷区中随机布置一定数量的地雷,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。游戏的基本操作包括左键单击和右键单击。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断。左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。右键单击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复一次或两次操作可取消标记。

二、代码实现1.绘制地图场景

根据每一块地区的数据进行图形输出。

代码如下(示例):

voiddrawmap(intmap[][12],IMAGE*img){inti,j;for(i=1;i=10;i++){for(j=0;j=10;j++){intx=50*(i-1);//得到位置inty=50*(j-1);if(map[i][j]25){putimage(x,y,img[9]);//标记flag}else{switch(map[i][j]){case9:putimage(x,y,img[11]);//输出图片雷break;case10:putimage(x,y,img[0]);//0break;case11:putimage(x,y,img[1]);//1break;case12:putimage(x,y,img[2]);//2break;case13:putimage(x,y,img[3]);//3break;case14:putimage(x,y,img[4]);//4break;case15:putimage(x,y,img[5]);//5break;case16:putimage(x,y,img[6]);//6break;case17:putimage(x,y,img[7]);//7break;case18:putimage(x,y,img[8]);//8break;default:putimage(x,y,img[10]);//地图break;}}}}}2.鼠标点击

鼠标左键点击翻开格子,右键点击标记flag,再次点击可以进行取消。sum记录翻开格子的数量,点击后对每个位置的数据进行加减操作。

代码如下(示例):

intmousedown(intmap[][12]){MOUSEMSGm;//定义鼠标消息变量while(1){//获取鼠标消息m=GetMouseMsg();intmi=m.x/50+1;intmj=m.y/50+1;//判断鼠标消息switch(m.uMsg){caseWM_LBUTTONDOWN:if(map[mi][mj]9)//已翻开的情况{continue;}if(map[mi][mj]==0)//如果点击为0,则翻开一片。{//使用递归函数swap(map,mi,mj);}else{map[mi][mj]+=10;sum+=1;}returnmap[mi][mj];break;caseWM_RBUTTONDOWN:if(map[mi][mj]9map[mi][mj]25)//已翻开的情况{continue;}if(map[mi][mj]25)//再次点击取消flag{map[mi][mj]-=30;}else{map[mi][mj]+=30;}returnmap[mi][mj];break;}}}3.递归

当我们点到为0的地区时,将会打开周围的部分地区,外围为非0数或到达边界,内部为0.如图:

代码如下(示例):

voidswap(intmap[][12],intmi,intmj){map[mi][mj]=10;sum+=1;for(inti=mi-1;i=mi+1;i++){for(intj=mj-1;j=mj+1;j++){//数组下标不能越界if(i=1i=10j=1j=10){//翻开的只能是数字if(map[i][j]9){//如果为0,则进行递归。if(map[i][j]==0){swap(map,i,j);}else{map[i][j]+=10;sum+=1;}}}}}}4.初始化游戏

代码如下(示例):

voidstartgame(){initgraph(,);//初始化地图xintmap[12][12]={0};inti,j,m,n;//随机函数种子srand((unsignedint)time(NULL));//随机生成10个雷for(n=0;n10;){i=rand()%10+1;//[1,10]j=rand()%10+1;if(map[i][j]==0)//排除本来就有雷的情况{map[i][j]=-1;//-1表示有雷n++;}}//产生数字for(i=1;i=10;i++){for(j=1;j=10;j++){//排除是雷的情况if(map[i][j]!=-1){for(m=i-1;m=i+1;m++)//判断周围是否有雷{for(n=j-1;n=j+1;n++){if(map[m][n]==-1){map[i][j]++;}}}}}}IMAGEimg[12];//定义图片变量loadimage(img[0],"E:\\C++project\\minesweeping\\0.jpg",50,50);loadimage(img[1],"E:\\C++project\\minesweeping\\1.gif",50,50);//加载图片loadimage(img[2],"E:\\C++project\\minesweeping\\2.gif",50,50);loadimage(img[3],"E:\\C++project\\minesweeping\\3.gif",50,50);loadimage(img[4],"E:\\C++project\\minesweeping\\4.gif",50,50);loadimage(img[5],"E:\\C++project\\minesweeping\\5.gif",50,50);loadimage(img[6],"E:\\C++project\\minesweeping\\6.gif",50,50);loadimage(img[7],"E:\\C++project\\minesweeping\\7.gif",50,50);loadimage(img[8],"E:\\C++project\\minesweeping\\8.gif",50,50);loadimage(img[9],"E:\\C++project\\minesweeping\\flag.gif",50,50);loadimage(img[10],"E:\\C++project\\minesweeping\\地图.gif",50,50);loadimage(img[11],"E:\\C++project\\minesweeping\\雷.gif",50,50);while(1){drawmap(map,img);//点到地雷if(mousedown(map)==9){sum=0;//重置判断变量drawmap(map,img);MessageBox(hwnd,"你踩到雷了!","GameOver",MB_OK);return;}//成功完成游戏if(sum==90){sum=0;//重置判断变量drawmap(map,img);MessageBox(hwnd,"你成功完成了游戏!","GameOver",MB_OK);return;}}}5.main

代码如下(示例):

#includeiostream#includetime.h#includegraphics.h//图形库头文件easyx#includeconio.h//调用_getch函数usingnamespacestd;HWNDhwnd;intsum=0;//用于表示目前已经点开的格子数//声明函数voiddrawmap(intmap[][12],IMAGE*img);intmousedown(intmap[][12]);voidswap(intmap[][12],intmi,intmj);//初始化游戏//绘制地图//鼠标点击//递归函数intmain(){while(1){startgame();if(MessageBox(hwnd,"再来一次","结束游戏",MB_YESNO)==IDNO)break;}//_getch();//防止闪屏closegraph();return0;}总结及运行

提示:本代码仅供参考,编译器为visualstudio图片资源可以在网上找找,将其放到对应的目录即可。运行结果如图:

转自:CSDN-瑩光




转载请注明:http://www.aierlanlan.com/rzfs/377.html

  • 上一篇文章:
  •   
  • 下一篇文章: