zoukankan      html  css  js  c++  java
  • c++实现扫雷游戏 初学

    设计思路


    全局变量定义地图和一些判断信息

    创建三个地图 分别表示 源地图  显示的效果地图  和一个用来判断点位是否被选中的地图


    功能:

    玩家输入要翻开的格子的行数和列数。用一个函数来翻开目标格子,如果是地雷游戏失败,可以选择是否重新游戏并且刷新一个新的随机地图,否则用一个函数统计目标格子周围的地雷数。如果周围没有地雷,则递归使用一个函数将附近周围没有地雷的格子全部打开,最后判断是否游戏胜利,胜利可以选择是否进入下一关,并增加难度。


    tips:

    本代码我拿来测试了一下 将m地雷数和x关卡数设置的比较简单 可以自行修改关卡

    (写的并不好 没有用到结构体和指针 可以自行加工)


    代码实现


      1 #include<iostream>
      2 #include<windows.h>
      3 using namespace std;
      4 
      5 int i, j, stop = 0, m = 2, stop2 = 0,x=1;
      6 //stop判断游戏是否失败 m雷数  x关卡 stop2 判断游戏成功 
      7 char k[20][20];//地图信息 
      8 int h=5,l=5;//地图行列 
      9 char show[20][20] ;//地图是否被翻开 
     10 char showmap[20][20];//输出的地图 
     11 
     12 
     13 
     14 void showMap(int i, int j)//输出地图 
     15 {
     16     cout <<"关卡"<<x ;
     17     cout <<' ';
     18     cout <<"雷数"<<h;
     19     cout << endl;
     20     cout << ' ';
     21     for (i = 0; i < h; i++)
     22         cout << i << ' ';
     23     cout << endl;
     24     for (i = 0; i < h; i++)
     25     {
     26         cout << i;
     27         cout <<' ';
     28         for (j = 0; j < l; j++)
     29         {
     30 
     31             if (show[i][j] == 0)//没翻开 
     32                 printf("");
     33             else if (show[i][j] == 2) //标记 
     34             {
     35                 printf("# ");
     36             }
     37             else
     38                 cout << showmap[i][j] << ' ';//
     39 
     40         }
     41         cout << endl;
     42     }//框架 
     43     if (stop == 1)//判断游戏是否结束 
     44     {    system("cls");
     45         cout << ' ';
     46         for (i = 0; i < h; i++)
     47             cout << i << ' ';
     48         cout << endl;
     49         for (i = 0; i < h; i++)
     50         {
     51             cout << i;
     52             for (j = 0; j < l; j++)
     53             {
     54                 if (k[i][j] == '*')
     55                     printf("* ");
     56                 else
     57                     printf("");
     58             }
     59             cout << endl;
     60         }
     61         cout << endl;
     62     }
     63 }
     64 
     65 
     66 
     67 
     68 
     69 
     70 bool nominefindfs(int row, int col)//遍历判断空白 
     71 {
     72     int roemove[8] = { 1,1,1,0,0,-1,-1,-1 };
     73     int colmove[8] = { 1,0,-1,1,-1,-1,0,1 };
     74     if (k[row][col] == '*') return false;
     75     if (row < 0 || col < 0 || row >= 10 || col >= 10) return false;
     76 
     77     showmap[row][col] = k[row][col];
     78     show[row][col] = 1;
     79     if (k[row][col] != ' ') return false;
     80 
     81     for (int i = 0; i < 8; i++)
     82     {
     83         int nextrow = row + roemove[i];
     84 
     85         int nextcol = col + colmove[i];
     86 
     87         if (nextrow >= 0 && nextrow < h && nextcol >= 0 && nextcol < l)
     88         {
     89 
     90             if (show[nextrow][nextcol] == 0 && k[nextrow][nextcol] != '*')
     91             {
     92                 nominefindfs(nextrow, nextcol);
     93             }
     94         }
     95     }
     96 
     97 }
     98 
     99 void change(int i, int j)//把选中的坐标输出 
    100 {
    101     switch (k[i][j]) {
    102     case ' ':
    103         nominefindfs(i, j);
    104         break;
    105     case '*':
    106         cout << '*';
    107         showmap[i][j] = '*';
    108         stop = 1;
    109         break;
    110     default:
    111         showmap[i][j] = k[i][j];
    112         break;
    113     }
    114 }
    115 int main()
    116 {
    117     system("color 0B");
    118     system("cls");
    119     stop = 0; stop2 = 0;
    120         for (i = 0; i < h; i++)
    121         for (j = 0; j < l; j++)
    122         {
    123             k[i][j]=' ';
    124              show[i][j] = 0;//默认没翻开 
    125      showmap[i][j] = ' ';
    126         }
    127      //数字问题  关卡 
    128         for (j = 0; j < h; j++)
    129         {
    130             k[rand() % h][rand() % h] = '*';
    131         }
    132         
    133         int sum = 0;          //统计周围地雷数量
    134         for (i = 0; i < h; i++)
    135         for (j = 0; j < l; j++)
    136         {
    137             sum = 0;
    138            if(k[i][j]!='*')
    139            {
    140              
    141 
    142                      if (i - 1 >= 0 && j - 1 >= 0 && k[i - 1][j- 1] =='*')
    143                         sum++;
    144                     if (i - 1 >= 0 && k[i - 1][j]  == '*')
    145                         sum++;
    146                     if (i - 1 >= 0 && j+ 1 < 10 && k[i - 1][j+ 1]  == '*')
    147                         sum++;
    148                     if ( j- 1 >= 0 && k[i ][j- 1]  == '*')
    149                         sum++;
    150                     if (j+ 1 < 10 && k[i][j+1]  == '*')
    151                         sum++;
    152                     if (i + 1 < 10 && j- 1 >= 0 && k[i +1][j- 1]  == '*')
    153                         sum++;
    154                     if (i + 1 < 10  && k[i+  1][j]  == '*')
    155                         sum++;
    156                     if (i +1 < 10 && j+ 1 < 10 && k[i + 1][j+ 1]  == '*')
    157                         sum++;    
    158                 }    
    159                 
    160                 switch(sum){
    161                     case 1:
    162                        k[i][j]='1';
    163                        break; // 可选的
    164                     case 2:
    165                        k[i][j]='2';
    166                        break; // 可选的
    167                       case 3:
    168                        k[i][j]='3';
    169                        break; // 可选的
    170                     case 4:
    171                        k[i][j]='4';
    172                        break; // 可选的
    173                       case 5:
    174                        k[i][j]='5';
    175                        break; // 可选的
    176                     case 6:
    177                        k[i][j]='6';
    178                        break; // 可选的
    179                       case 7:
    180                        k[i][j]='7';
    181                        break; // 可选的
    182                     case 8:
    183                        k[i][j]='8';
    184                        break; // 可选的
    185                     default : // 可选的
    186                        break;
    187                 }            
    188 }
    189             
    190         
    191         
    192     int temp,jx;
    193     showMap(i, j);
    194     while (1)
    195     {
    196         if (stop == 1)//判断游戏是否结束 
    197         {
    198             cout << "游戏失败QAQ";
    199             cout<<endl; 
    200             cout <<"重新游戏请输入1...";
    201             cout<<endl; 
    202             cout <<"退出游戏输入任意数字...";
    203             cout<<endl; 
    204             cin>>jx;
    205             if(jx==1)//判断是否继续游戏 
    206             {
    207                 jx=0;
    208                 main();
    209             } 
    210             else
    211                 break;
    212         }
    213 
    214         if (stop2 == m)
    215         {
    216             cout << "游戏成功QWQ!";
    217             cout<<endl; 
    218             cout <<"进入下一关请输入1...";
    219             cout<<endl; 
    220             cout <<"退出游戏输入任意数字...";
    221             cout<<endl; 
    222             cin>>jx;
    223             if(jx==1)
    224             {
    225             
    226                 if(x==3)
    227                 {
    228                     system("cls");
    229                     cout << "闯关成功!!!";
    230                     cout<<endl;
    231                      
    232                     break;
    233                 }
    234                     x++;
    235                 h+=2;
    236                 l+=2;
    237                 jx=9;
    238                 main();
    239         }
    240             else
    241                 break;
    242         
    243         }
    244         cout << "---1.扫雷-------2.标记雷---";
    245         cin >> temp;
    246         if (temp == 1)
    247         {
    248             cout << "请输入坐标";
    249             cin >> i;
    250             cin >> j;
    251             system("cls");
    252             show[i][j] = 1;//翻开 
    253             change(i, j);
    254             showMap(i, j);
    255         
    256         }
    257         else
    258         {
    259             cout << "请输入坐标";
    260             cin >> i;
    261             cin >> j;
    262                 system("cls");
    263             show[i][j] = 2;//标记 
    264             showMap(i, j);
    265             stop2++;
    266         }
    267 
    268     }
    269     return 0;
    270 }
  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/ziwang520/p/13996903.html
Copyright © 2011-2022 走看看