• 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 }
  • 相关阅读:
    nginx
    mysql
    intelij maven
    redis命令大全
    绑定touch事件后click无效,vue项目解决棒法
    新的用法
    img
    vuedragable
    自己总结
    vuex的项目在id中不能运行
  • 原文地址:https://www.cnblogs.com/ziwang520/p/13996903.html
Copyright © 2020-2023  润新知