鱼C论坛

 找回密码
 立即注册
查看: 3242|回复: 20

[已解决]扫雷小游戏求助~

[复制链接]
发表于 2018-2-7 16:42:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风过无痕丶 于 2018-2-7 16:48 编辑
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <conio.h>
  4. #include <time.h>
  5. #include <Windows.h>
  6. #include <cstdlib>

  7. using namespace std;

  8. const int MAX_BOOM_A = 15;
  9. const int MAX_BOOM_B = 28;

  10. int x,y; // 横纵坐标
  11. int sum_mine; // 雷的个数


  12. // 暂定 1为未知区域, 2为现行选中位置, 3为雷
  13. char juzhen[16][16]{

  14.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  15.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  16.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  17.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  18.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  19.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  20.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  21.         {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1},
  22.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  23.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  24.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  25.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  26.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  27.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  28.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  29.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

  30. };

  31. char juzhen_tnt[16][16]{

  32.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  33.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  34.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  35.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  36.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  37.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  38.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  39.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  40.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  41.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  42.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  43.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  44.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  45.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  46.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  47.         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

  48. };


  49. class saolei_a{

  50.         public:
  51.                 char mine; // 雷
  52.                 char Unknown_region;// 未知区域
  53.                 char Choice_region; // 选中区域

  54.                 // 先把图画出来!
  55.                 void huatu_saolei(void){

  56.                                 cout << "还剩下" << sum_mine << "个雷" ;
  57.                                 cout << '\n' << '\n';
  58.                                 cout << '\t' << '\t' << '\t';
  59.                                 cout << "    欢迎来到扫雷小游戏!" << endl;
  60.                                 cout << '\t' << '\t' << '\t';
  61.                                 cout << "按下字母 w a s d  移动光标!";
  62.                                 cout << '\n' << '\n' << '\n' << '\n';
  63.                                 for (int i = 0; i < 16; i++){
  64.                                         // 奶奶的!三个TAB又多了,只有加几个空格了!
  65.                                         cout << '\t' << '\t' << "     ";
  66.                                         for (int j = 0; j < 16; j++){

  67.                                                 if (juzhen[i][j] == 1){
  68.                                                         cout << "■";  // 如果数组内容为1 就画 方块
  69.                                                         }
  70.                                                 else if (juzhen[i][j] == 2){
  71.                                                         cout << "□"; // 如果数组内容为2 就画 空方块
  72.                                                         }
  73.                                                 else if (juzhen[i][j] == 8){
  74.                                                         cout << "★";  // 如果数组内容为8 画五角星
  75.                                                         }
  76.                                                 }
  77.                                                 cout << '\n';

  78.                                         }
  79.                                 }


  80.                         // 再搞个定位的函数算了,不然不知道怎么移动了~
  81.                         // 头绪不是很清晰,就用迭代来找吧~
  82.                         void gps_saolei(int *x, int *y){

  83.                                 for (int i = 0; i < 16; i++){
  84.                                         for (int j = 0; j < 16; j++){
  85.                                                 if (juzhen[i][j] == 2){ // 2为现行选中项的标识符
  86.                                                         *x = i;
  87.                                                         *y = j;
  88.                                                 }
  89.                                         }
  90.                                 }

  91.                         }

  92.                         // 移动现行选中项
  93.                          void Choice_saolei(void){
  94.                                 Choice_region = getch();
  95.                                         switch(Choice_region){

  96.                                                 case 'w' :
  97.                                                         gps_saolei(&x,&y); //获取到现行选中项在什么位置!
  98.                                                         juzhen[x-1][y] = 2; // 把现在的位置变成 选中
  99.                                                         juzhen[x][y] = 1;   // 把刚才的位置变成 未选中
  100.                                                         break;

  101.                                                 case 'a':
  102.                                                         gps_saolei(&x,&y);
  103.                                                         juzhen[x][y-1] = 2;
  104.                                                         juzhen[x][y] = 1;
  105.                                                         break;
  106.                                                 case 's':
  107.                                                         gps_saolei(&x,&y);
  108.                                                         juzhen[x+1][y] = 2;
  109.                                                         juzhen[x][y] = 1;
  110.                                                         break;
  111.                                                 case 'd' :
  112.                                                         gps_saolei(&x,&y);
  113.                                                         juzhen[x][y+1] = 2;
  114.                                                         juzhen[x][y] = 1;
  115.                                                         break;
  116.                                                 case 'g':
  117.                                                         gps_saolei(&x,&y);
  118.                                                         if (prove_tnt(x,y)){
  119.                                                                 cout << "游戏结束!";
  120.                                                                 exit(-1);
  121.                                                         }
  122.                                                         else{
  123.                                                                 cout << "那就继续来吧!" << endl;
  124.                                                         }
  125.                                                         break;
  126.                     }
  127.                         }

  128.                         // 来吧! 我要开始造雷了!
  129.                         // 我的思路是,选择挖的时候调用一次这个函数,
  130.                         // 反馈回去,这是不是雷区


  131.                         // 雷的位置!
  132.                         void mine_arr(int *x, int *y){

  133.                                 srand((unsigned)time(NULL));
  134.                                 *x = rand()% MAX_BOOM_A;
  135.                                 *y = rand()% MAX_BOOM_A;
  136.                         }

  137.                         // 雷的个数
  138.                         int num_mine_arr(void){
  139.                                 int sum;
  140.                                 srand((unsigned)time(NULL));
  141.                                 sum = rand()% MAX_BOOM_B;

  142.                                 return sum;
  143.                         }

  144.                         // 这里开始造雷
  145.                         void tnt_arr(void){

  146.                                 int tnt_x,tnt_y;
  147.                                 int sum = num_mine_arr();
  148.                         // 不知道为什么~次数执行够了的~雷只造一个出来!!!
  149.                                 for (int i = 0; i <= sum; i++){
  150.                                         mine_arr(&tnt_x,&tnt_y);
  151.                                         juzhen_tnt[tnt_x][tnt_y] = 8;
  152.                                         sum_mine++;[/color]
  153.                                 }

  154.                         }

  155.                         // 来吧!这里开始挖雷
  156.                         // emmmm... 怎么挖呢。。。
  157.                         // 搞两个数组!一个来操作!,一个来验证!
  158.                         bool prove_tnt(int x, int y){

  159.                                 if (juzhen_tnt[x][y] == 8){
  160.                                         // 有雷
  161.                                         return true;
  162.                                 }
  163.                                 else {
  164.                                         return false;
  165.                                 }

  166.                         }

  167. };


  168. int main(){

  169.         saolei_a add;
  170.         do {
  171.                 system("cls");
  172.                 if (sum_mine == 0){
  173.                         add.tnt_arr(); // 没雷! 造!
  174.                 }
  175.                 else {
  176.                         ; // 有了就不造了
  177.                 }
  178.                 add.huatu_saolei();
  179.                 add.Choice_saolei();


  180.         }while(1);

  181.         return 0;
  182. }
复制代码



奶奶的~ 循环次数是执行够了的~死活都给一个雷~ 求大佬解惑~
最佳答案
2018-2-7 20:23:40
风过无痕丶 发表于 2018-2-7 19:48
我就是这样做的啊~ juzhen_tnt  里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,  两个相同大小 ...
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <conio.h>
  4. #include <time.h>
  5. #include <Windows.h>
  6. #include <cstdlib>

  7. using namespace std;

  8. const int MAX_BOOM_A = 15;
  9. const int MAX_BOOM_B = 28;

  10. int x, y;        // 横纵坐标
  11. int sum_mine;        // 雷的个数


  12. // 暂定 1为未知区域, 2为现行选中位置, 3为雷
  13. char juzhen[16][16] =
  14. {
  15.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  16.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  17.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  18.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  19.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  20.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  21.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  22.         {1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1},
  23.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  24.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  25.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  26.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  27.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  28.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  29.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  30.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  31. };

  32. char juzhen_tnt[16][16] =
  33. {

  34.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  35.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  36.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  37.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  38.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  39.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  40.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  41.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  42.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  43.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  44.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  45.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  46.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  47.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  48.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  49.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  50. };

  51. class saolei_a {

  52. public:
  53.         char mine;                // 雷
  54.         char Unknown_region;        // 未知区域
  55.         char Choice_region;        // 选中区域

  56.         // 先把图画出来!
  57.         void huatu_saolei(void) {

  58.                 cout << "还剩下" << sum_mine << "个雷";
  59.                 cout << '\n' << '\n';
  60.                 cout << '\t' << '\t' << '\t';
  61.                 cout << "    欢迎来到扫雷小游戏!" << endl;
  62.                 cout << '\t' << '\t' << '\t';
  63.                 cout << "按下字母 w a s d  移动光标!";
  64.                 cout << '\n' << '\n' << '\n' << '\n';
  65.                 for(int i = 0; i < 16; i++)
  66.                 {
  67.                         // 奶奶的!三个TAB又多了,只有加几个空格了!
  68.                         cout << '\t' << '\t' << "     ";
  69.                         for(int j = 0; j < 16; j++) {

  70.                                 if(juzhen[i][j] == 1) {
  71.                                         cout << "■";  // 如果数组内容为1 就画 方块
  72.                                 }
  73.                                 else if(juzhen[i][j] == 2) {
  74.                                         cout << "□"; // 如果数组内容为2 就画 空方块
  75.                                 }
  76.                                 else if(juzhen[i][j] == 8) {
  77.                                         cout << "★";  // 如果数组内容为8 画五角星
  78.                                 }
  79.                         }
  80.                         cout << '\n';

  81.                 }
  82.         }

  83.         // 再搞个定位的函数算了,不然不知道怎么移动了~
  84.         // 头绪不是很清晰,就用迭代来找吧~
  85.         void gps_saolei(int *x, int *y) {

  86.                 for(int i = 0; i < 16; i++) {
  87.                         for(int j = 0; j < 16; j++) {
  88.                                 if(juzhen[i][j] == 2) { // 2为现行选中项的标识符
  89.                                         *x = i;
  90.                                         *y = j;
  91.                                 }
  92.                         }
  93.                 }

  94.         }

  95.         // 移动现行选中项
  96.         void Choice_saolei(void) {
  97.                 Choice_region = getch();
  98.                 switch(Choice_region) {

  99.                 case 'w':
  100.                         gps_saolei(&x, &y); //获取到现行选中项在什么位置!
  101.                         juzhen[x - 1][y] = 2; // 把现在的位置变成 选中
  102.                         juzhen[x][y] = 1;   // 把刚才的位置变成 未选中
  103.                         break;

  104.                 case 'a':
  105.                         gps_saolei(&x, &y);
  106.                         juzhen[x][y - 1] = 2;
  107.                         juzhen[x][y] = 1;
  108.                         break;
  109.                 case 's':
  110.                         gps_saolei(&x, &y);
  111.                         juzhen[x + 1][y] = 2;
  112.                         juzhen[x][y] = 1;
  113.                         break;
  114.                 case 'd':
  115.                         gps_saolei(&x, &y);
  116.                         juzhen[x][y + 1] = 2;
  117.                         juzhen[x][y] = 1;
  118.                         break;
  119.                 case 'g':
  120.                         gps_saolei(&x, &y);
  121.                         if(prove_tnt(x, y)) {
  122.                                 cout << "游戏结束!";
  123.                                 exit(-1);
  124.                         }
  125.                         else {
  126.                                 cout << "那就继续来吧!" << endl;
  127.                         }
  128.                         break;
  129.                 }
  130.         }

  131.         // 来吧! 我要开始造雷了!
  132.         // 我的思路是,选择挖的时候调用一次这个函数,
  133.         // 反馈回去,这是不是雷区


  134.         // 雷的位置!
  135.         void mine_arr(int *x, int *y) {

  136.                 //srand((unsigned)time(NULL));        // 问题在这里
  137.                 *x = rand() % MAX_BOOM_A;
  138.                 *y = rand() % MAX_BOOM_A;
  139.         }

  140.         // 雷的个数
  141.         int num_mine_arr(void) {
  142.                 int sum;
  143.                 //srand((unsigned)time(NULL));        // 问题在这里
  144.                 sum = rand() % MAX_BOOM_B;

  145.                 return sum;
  146.         }

  147.         // 这里开始造雷
  148.         void tnt_arr(void)
  149.         {
  150.                 int tnt_x, tnt_y;
  151.                 int sum = num_mine_arr();

  152.                 for(int i = 0; i < sum; i++)
  153.                 {
  154.                         mine_arr(&tnt_x, &tnt_y);
  155.                        
  156.                         printf("x: %.2d,y: %.2d\n", tnt_x, tnt_y);                // debug
  157.                        
  158.                        
  159.                         juzhen_tnt[tnt_x][tnt_y] = 8;
  160.                        
  161.                         juzhen[tnt_x][tnt_y] = 8;        // 在huatu_saolei函数中只看juzhen
  162.                        
  163.                                                         //for(int j = 0; j < 16; j++) {

  164.                                                         //        if(juzhen[i][j] == 1) {
  165.                                                         //                cout << "■";  // 如果数组内容为1 就画 方块
  166.                                                         //        }
  167.                                                         //        else if(juzhen[i][j] == 2) {
  168.                                                         //                cout << "□"; // 如果数组内容为2 就画 空方块
  169.                                                         //        }
  170.                                                         //        else if(juzhen[i][j] == 8) {
  171.                                                         //                cout << "★";  // 如果数组内容为8 画五角星
  172.                                                         //        }
  173.                                                         //}


  174.                         sum_mine++;
  175.                 }

  176.                 getchar();                // debug
  177.         }

  178.         // 来吧!这里开始挖雷
  179.         // emmmm... 怎么挖呢。。。
  180.         // 搞两个数组!一个来操作!,一个来验证!
  181.         bool prove_tnt(int x, int y) {

  182.                 if(juzhen_tnt[x][y] == 8) {
  183.                         // 有雷
  184.                         return true;
  185.                 }
  186.                 else {
  187.                         return false;
  188.                 }

  189.         }

  190. };

  191. int main(void)
  192. {
  193.         srand((unsigned)time(NULL));

  194.         saolei_a add;
  195.         do {
  196.                 system("cls");
  197.                 if(sum_mine == 0) {
  198.                         add.tnt_arr(); // 没雷! 造!
  199.                 }
  200.                 else {
  201.                         ; // 有了就不造了
  202.                 }
  203.                 add.huatu_saolei();
  204.                 add.Choice_saolei();


  205.         }
  206.         while(1);

  207.         return 0;
  208. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-7 17:22:02 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 17:27:55 | 显示全部楼层

我的天呐! 我不是在分享啊! 我在请教问题啊!!!! 写了半上午啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 17:30:40 | 显示全部楼层
debug跑了半天也没看出什么毛病~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 18:30:44 | 显示全部楼层
什么情况?代码不完整?
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 18:31:33 | 显示全部楼层
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:04:20 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-2-7 18:31

不是  后面的方括号里面的是放这里面才有的~ 我本来想设置一个红色 让人一眼看出问题~ 没想到没变色~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 19:06:20 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 19:04
不是  后面的方括号里面的是放这里面才有的~ 我本来想设置一个红色 让人一眼看出问题~ 没想到没变色~

不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:16:05 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-2-7 19:06
不明白

sum_mine++ 后面的哪个方括号可以删了~  是贴到论坛里面来 加进去的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 19:17:48 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 19:16
sum_mine++ 后面的哪个方括号可以删了~  是贴到论坛里面来 加进去的~

哦,我算是明白了
发代码时不能加颜色
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:28:44 | 显示全部楼层
人造人 发表于 2018-2-7 19:17
哦,我算是明白了
发代码时不能加颜色

您费心帮我看看这代码什么毛病~
按照我的理解~
tnt_arr 成员函数里面的循环  循环次数是对的 也确实执行了那么多次
也就是说每执行一次 就会调用一次mine_arr函数
传的是地址 也应该改变对应的值多少次。
但是只有一个值~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 19:37:49 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 19:28
您费心帮我看看这代码什么毛病~
按照我的理解~
tnt_arr 成员函数里面的循环  循环次数是对的 也确 ...

添加雷的时候使用 数组juzhen_tnt
画雷的时候使用    数组juzhen


  1. huatu_saolei 函数
  2. for(int i = 0; i < 16; i++)
  3. {
  4.         cout << '\t' << '\t' << "     ";
  5.         for(int j = 0; j < 16; j++)
  6.         {

  7.                 if(juzhen[i][j] == 1) {
  8.                         cout << "■";  // 如果数组内容为1 就画 方块
  9.                 }
  10.                 else if(juzhen[i][j] == 2) {
  11.                         cout << "□"; // 如果数组内容为2 就画 空方块
  12.                 }
  13.                 else if(juzhen[i][j] == 8) {
  14.                         cout << "★";  // 如果数组内容为8 画五角星
  15.                 }
  16.         }
  17.         cout << '\n';

  18. }


  19. // 这里开始造雷
  20.         void tnt_arr(void)
  21.         {
  22.                 int tnt_x, tnt_y;
  23.                 int sum = num_mine_arr();

  24.                 for(int i = 0; i < sum; i++)
  25.                 {
  26.                         mine_arr(&tnt_x, &tnt_y);
  27.                         juzhen_tnt[tnt_x][tnt_y] = 8;
  28.                         sum_mine++;
  29.                 }
  30.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:48:17 | 显示全部楼层
人造人 发表于 2018-2-7 19:37
添加雷的时候使用 数组juzhen_tnt
画雷的时候使用    数组juzhen

我就是这样做的啊~ juzhen_tnt  里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,  两个相同大小的数组,用junzhen_tnt 来做验证~juzhen数组的现行选中位置,和juzhen_tnt 数组相同的坐标来做判断。  如果juzhen_tnt 对应的位置是雷,就反馈回去~ 但是只有一个雷 就很难受了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 20:23:40 | 显示全部楼层    本楼为最佳答案   
风过无痕丶 发表于 2018-2-7 19:48
我就是这样做的啊~ juzhen_tnt  里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,  两个相同大小 ...
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <conio.h>
  4. #include <time.h>
  5. #include <Windows.h>
  6. #include <cstdlib>

  7. using namespace std;

  8. const int MAX_BOOM_A = 15;
  9. const int MAX_BOOM_B = 28;

  10. int x, y;        // 横纵坐标
  11. int sum_mine;        // 雷的个数


  12. // 暂定 1为未知区域, 2为现行选中位置, 3为雷
  13. char juzhen[16][16] =
  14. {
  15.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  16.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  17.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  18.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  19.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  20.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  21.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  22.         {1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1},
  23.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  24.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  25.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  26.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  27.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  28.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  29.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  30.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  31. };

  32. char juzhen_tnt[16][16] =
  33. {

  34.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  35.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  36.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  37.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  38.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  39.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  40.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  41.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  42.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  43.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  44.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  45.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  46.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  47.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  48.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  49.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  50. };

  51. class saolei_a {

  52. public:
  53.         char mine;                // 雷
  54.         char Unknown_region;        // 未知区域
  55.         char Choice_region;        // 选中区域

  56.         // 先把图画出来!
  57.         void huatu_saolei(void) {

  58.                 cout << "还剩下" << sum_mine << "个雷";
  59.                 cout << '\n' << '\n';
  60.                 cout << '\t' << '\t' << '\t';
  61.                 cout << "    欢迎来到扫雷小游戏!" << endl;
  62.                 cout << '\t' << '\t' << '\t';
  63.                 cout << "按下字母 w a s d  移动光标!";
  64.                 cout << '\n' << '\n' << '\n' << '\n';
  65.                 for(int i = 0; i < 16; i++)
  66.                 {
  67.                         // 奶奶的!三个TAB又多了,只有加几个空格了!
  68.                         cout << '\t' << '\t' << "     ";
  69.                         for(int j = 0; j < 16; j++) {

  70.                                 if(juzhen[i][j] == 1) {
  71.                                         cout << "■";  // 如果数组内容为1 就画 方块
  72.                                 }
  73.                                 else if(juzhen[i][j] == 2) {
  74.                                         cout << "□"; // 如果数组内容为2 就画 空方块
  75.                                 }
  76.                                 else if(juzhen[i][j] == 8) {
  77.                                         cout << "★";  // 如果数组内容为8 画五角星
  78.                                 }
  79.                         }
  80.                         cout << '\n';

  81.                 }
  82.         }

  83.         // 再搞个定位的函数算了,不然不知道怎么移动了~
  84.         // 头绪不是很清晰,就用迭代来找吧~
  85.         void gps_saolei(int *x, int *y) {

  86.                 for(int i = 0; i < 16; i++) {
  87.                         for(int j = 0; j < 16; j++) {
  88.                                 if(juzhen[i][j] == 2) { // 2为现行选中项的标识符
  89.                                         *x = i;
  90.                                         *y = j;
  91.                                 }
  92.                         }
  93.                 }

  94.         }

  95.         // 移动现行选中项
  96.         void Choice_saolei(void) {
  97.                 Choice_region = getch();
  98.                 switch(Choice_region) {

  99.                 case 'w':
  100.                         gps_saolei(&x, &y); //获取到现行选中项在什么位置!
  101.                         juzhen[x - 1][y] = 2; // 把现在的位置变成 选中
  102.                         juzhen[x][y] = 1;   // 把刚才的位置变成 未选中
  103.                         break;

  104.                 case 'a':
  105.                         gps_saolei(&x, &y);
  106.                         juzhen[x][y - 1] = 2;
  107.                         juzhen[x][y] = 1;
  108.                         break;
  109.                 case 's':
  110.                         gps_saolei(&x, &y);
  111.                         juzhen[x + 1][y] = 2;
  112.                         juzhen[x][y] = 1;
  113.                         break;
  114.                 case 'd':
  115.                         gps_saolei(&x, &y);
  116.                         juzhen[x][y + 1] = 2;
  117.                         juzhen[x][y] = 1;
  118.                         break;
  119.                 case 'g':
  120.                         gps_saolei(&x, &y);
  121.                         if(prove_tnt(x, y)) {
  122.                                 cout << "游戏结束!";
  123.                                 exit(-1);
  124.                         }
  125.                         else {
  126.                                 cout << "那就继续来吧!" << endl;
  127.                         }
  128.                         break;
  129.                 }
  130.         }

  131.         // 来吧! 我要开始造雷了!
  132.         // 我的思路是,选择挖的时候调用一次这个函数,
  133.         // 反馈回去,这是不是雷区


  134.         // 雷的位置!
  135.         void mine_arr(int *x, int *y) {

  136.                 //srand((unsigned)time(NULL));        // 问题在这里
  137.                 *x = rand() % MAX_BOOM_A;
  138.                 *y = rand() % MAX_BOOM_A;
  139.         }

  140.         // 雷的个数
  141.         int num_mine_arr(void) {
  142.                 int sum;
  143.                 //srand((unsigned)time(NULL));        // 问题在这里
  144.                 sum = rand() % MAX_BOOM_B;

  145.                 return sum;
  146.         }

  147.         // 这里开始造雷
  148.         void tnt_arr(void)
  149.         {
  150.                 int tnt_x, tnt_y;
  151.                 int sum = num_mine_arr();

  152.                 for(int i = 0; i < sum; i++)
  153.                 {
  154.                         mine_arr(&tnt_x, &tnt_y);
  155.                        
  156.                         printf("x: %.2d,y: %.2d\n", tnt_x, tnt_y);                // debug
  157.                        
  158.                        
  159.                         juzhen_tnt[tnt_x][tnt_y] = 8;
  160.                        
  161.                         juzhen[tnt_x][tnt_y] = 8;        // 在huatu_saolei函数中只看juzhen
  162.                        
  163.                                                         //for(int j = 0; j < 16; j++) {

  164.                                                         //        if(juzhen[i][j] == 1) {
  165.                                                         //                cout << "■";  // 如果数组内容为1 就画 方块
  166.                                                         //        }
  167.                                                         //        else if(juzhen[i][j] == 2) {
  168.                                                         //                cout << "□"; // 如果数组内容为2 就画 空方块
  169.                                                         //        }
  170.                                                         //        else if(juzhen[i][j] == 8) {
  171.                                                         //                cout << "★";  // 如果数组内容为8 画五角星
  172.                                                         //        }
  173.                                                         //}


  174.                         sum_mine++;
  175.                 }

  176.                 getchar();                // debug
  177.         }

  178.         // 来吧!这里开始挖雷
  179.         // emmmm... 怎么挖呢。。。
  180.         // 搞两个数组!一个来操作!,一个来验证!
  181.         bool prove_tnt(int x, int y) {

  182.                 if(juzhen_tnt[x][y] == 8) {
  183.                         // 有雷
  184.                         return true;
  185.                 }
  186.                 else {
  187.                         return false;
  188.                 }

  189.         }

  190. };

  191. int main(void)
  192. {
  193.         srand((unsigned)time(NULL));

  194.         saolei_a add;
  195.         do {
  196.                 system("cls");
  197.                 if(sum_mine == 0) {
  198.                         add.tnt_arr(); // 没雷! 造!
  199.                 }
  200.                 else {
  201.                         ; // 有了就不造了
  202.                 }
  203.                 add.huatu_saolei();
  204.                 add.Choice_saolei();


  205.         }
  206.         while(1);

  207.         return 0;
  208. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 20:47:56 | 显示全部楼层

如果说在画图函数里面只看juzhen 数组,是没问题,
但是,雷的位置就显示出来了啊~ 这个小游戏就没意义了啊~
矩阵数组是显示出来的数组, 按照我的理解, 雷是不能显示出来的,
也就是说 juzhen数组里面不能有8这个值, 不然也没必要弄两个数组了啊
另外,Choice_saolei函数 会改变 juzhen数组的值, 如果说,现行选中项的位置就是雷。
如有雷放到juzhen数组里面  那么这个雷是不是就被变成了另外的值了。也就是说 这个雷也没效果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 20:53:47 | 显示全部楼层

不过只有一个雷的情况确实解决了!谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 20:56:36 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 20:47
如果说在画图函数里面只看juzhen 数组,是没问题,
但是,雷的位置就显示出来了啊~ 这个小游戏就没意义 ...

你的程序问题是

函数mine_arr和num_mine_arr
  1. // 雷的位置!
  2.         void mine_arr(int *x, int *y) {

  3.                 //srand((unsigned)time(NULL));        // 问题在这里
  4.                 *x = rand() % MAX_BOOM_A;
  5.                 *y = rand() % MAX_BOOM_A;
  6.         }

  7.         // 雷的个数
  8.         int num_mine_arr(void) {
  9.                 int sum;
  10.                 //srand((unsigned)time(NULL));        // 问题在这里
  11.                 sum = rand() % MAX_BOOM_B;

  12.                 return sum;
  13.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 20:57:14 | 显示全部楼层
人造人 发表于 2018-2-7 20:56
你的程序问题是

函数mine_arr和num_mine_arr

难道不要随机数种子吗~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 21:01:09 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 20:57
难道不要随机数种子吗~

是啊
但是...

  1. #include <iostream>
  2. #include <time.h>

  3. int GetRand(void)
  4. {
  5.         int sum;
  6.         srand((unsigned)time(NULL));
  7.         sum = rand() % 16;

  8.         return sum;
  9. }

  10. int main(void)
  11. {
  12.         for(int i = 0; i < 10; ++i)
  13.                 std::cout << GetRand() << std::endl;

  14.         return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 21:01:44 | 显示全部楼层
  1. 10
  2. 10
  3. 10
  4. 10
  5. 10
  6. 10
  7. 10
  8. 10
  9. 10
  10. 10
  11. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表