鱼C论坛

 找回密码
 立即注册
楼主: 人造人

[技术交流] 扫雷

[复制链接]
发表于 2018-3-27 18:40:34 | 显示全部楼层
我又改了一下这样好像就可以自动打开了
  1. #include<bits/stdc++.h>
  2. #include<windows.h>
  3. #include <conio.h>
  4. using namespace std;

  5. const int map_x = 16;
  6. const int map_y = 16;
  7. struct Mapelem{
  8.     bool status = false;
  9.     bool is_mine = false;
  10.     int course = 0;
  11. }Map[map_x][map_y];

  12. void Hidecursor()
  13. {
  14.     CONSOLE_CURSOR_INFO cci;
  15.     cci.bVisible = FALSE;
  16.     cci.dwSize = sizeof(cci);
  17.     HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  18.     SetConsoleCursorInfo(handle, &cci);
  19. }

  20. void gotoxy(int x,int y){
  21.     COORD cod;
  22.     cod.X = x * 2;
  23.     cod.Y = y;
  24.     SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod );
  25. }

  26. void print_course(int x,int y){
  27.     if(!Map[x][y].course){
  28.         printf(" ");
  29.         return;
  30.     }
  31.     printf("%d",Map[x][y].course);
  32. }

  33. void drawmap(){
  34.     for(int i=0; i<map_x; i++){
  35.         for(int j=0; j<map_y; j++){
  36.             gotoxy(i,j);
  37.             if(Map[i][j].status){
  38.                 if(Map[i][j].is_mine)
  39.                     printf("★");
  40.                 else
  41.                     print_course(i,j);
  42.             }
  43.             else
  44.                 printf("■");
  45.         }
  46.     }
  47. }

  48. void UpdateCursor(POINT po)
  49. {
  50.         drawmap();

  51.         gotoxy(po.x, po.y);
  52.         printf("□");
  53. }

  54. void setmine(int num){
  55.     int x,y;
  56.     for(int i=0; i<num; i++){
  57.         do{
  58.             x = rand()%map_x;
  59.             y = rand()%map_y;
  60.         }while(Map[x][y].is_mine);
  61.         Map[x][y].is_mine = true;
  62.     }
  63. }

  64. int GetCount(int x, int y)
  65. {
  66.         int count = 0;

  67.         // вСио╫г -> срио╫г
  68.         for(int i = 0; i < 3; ++i)
  69.                 if((x - 1 + i >= 0) && (y - 1 >= 0))
  70.                         if(Map[x - 1 + i][y - 1].is_mine)
  71.                                 ++count;

  72.         // вСоб╫г -> сроб╫г
  73.         for(int i = 0; i < 3; ++i)
  74.                 if((x - 1 + i >= 0) && (y + 1 < map_y))
  75.                         if(Map[x - 1 + i][y + 1].is_mine)
  76.                                 ++count;

  77.         // вС╠ъ
  78.         if(x - 1 >= 0)                // спвС╠ъбП?
  79.                 if(Map[x - 1][y].is_mine)
  80.                         ++count;

  81.         // ср╠ъ
  82.         if(x + 1 < map_x)        // спср╠ъбП?
  83.                 if(Map[x + 1][y].is_mine)
  84.                         ++count;

  85.         return count;
  86. }

  87. void GenerateCount(void)
  88. {
  89.         for(int i = 0; i < map_x; ++i)
  90.         {
  91.                 for(int j = 0; j < map_y; ++j)
  92.                 {
  93.                         if(!Map[i][j].is_mine)
  94.                                 Map[i][j].course = GetCount(i, j);
  95.                 }
  96.         }
  97. }

  98. void show_mine(POINT p ){


  99.     if (Map[p.x][p.y].status)
  100.         return;
  101.     else if (Map[p.x][p.y].course>0){
  102.         Map[p.x][p.y].status = true;
  103.         return;
  104.     }
  105.     else{//空格只需要上下左右四个方向检测
  106.         Map[p.x][p.y].status = true;
  107.         Map[p.x-1][p.y-1].status = true;
  108.         Map[p.x+1][p.y-1].status = true;
  109.         Map[p.x-1][p.y+1].status = true;
  110.         Map[p.x+1][p.y-1].status = true;
  111.         POINT k;
  112.         k.x = p.x;
  113.         if(p.y + 1 < map_y){
  114.              k.y = p.y + 1;
  115.             show_mine(k);
  116.         }
  117.         if(p.y - 1 > 0){
  118.             k.y = p.y - 1;
  119.             show_mine(k);
  120.         }
  121.         k.y = p.y;
  122.         if(p.x + 1 < map_x){
  123.            k.x = p.x + 1;
  124.             show_mine(k);
  125.         }
  126.         if(p.x - 1 > 0){
  127.             k.x = p.x - 1;
  128.             show_mine(k);
  129.         }
  130.     }
  131. }

  132. bool SelectTarget(POINT p){
  133.     if(Map[p.x][p.y].status)
  134.         return false;
  135.     if(Map[p.x][p.y].is_mine)
  136.         return true;
  137.     //print_course(p.x,p.y);
  138.     show_mine(p);
  139.     drawmap();
  140.     return false;
  141. }

  142. void showmap(){
  143.     for(int i=0; i<map_x; i++){
  144.         for(int j=0; j<map_y; j++){
  145.             if(!Map[i][j].status){
  146.                 gotoxy(i,j);
  147.                 if(Map[i][j].is_mine)
  148.                     printf("★");
  149.                 else
  150.                     print_course(i,j);
  151.             }
  152.         }
  153.     }
  154. }

  155. int main(){
  156.     srand((unsigned int)time(0));
  157.     Hidecursor();
  158.     drawmap();
  159.     setmine(30);
  160.     GenerateCount();

  161.     POINT p = {0,0};
  162.     UpdateCursor(p);

  163.     while(1){
  164.         char c = _getch();
  165.         switch(c){
  166.         case 'q':
  167.         case 'Q':
  168.             goto EXIT;
  169.             break;
  170.         case 'a':
  171.         case 'A':
  172.             if(p.x>0){
  173.                 p.x--;
  174.                 UpdateCursor(p);
  175.             }break;
  176.         case 's':
  177.         case 'S':
  178.             if(p.y<15){
  179.                 p.y++;
  180.                 UpdateCursor(p);
  181.             }break;
  182.         case 'W':
  183.         case 'w':
  184.             if(p.y>0){
  185.                 p.y--;
  186.                 UpdateCursor(p);
  187.             }break;
  188.         case 'd':
  189.         case 'D':
  190.             if(p.x<15){
  191.                 p.x++;
  192.                 UpdateCursor(p);
  193.             }break;
  194.         case ' ':
  195.             if(SelectTarget(p))
  196.                 goto EXIT;
  197.             break;
  198.         }
  199.     }
  200.     EXIT:
  201.         showmap();

  202.     return 0;
  203. }
复制代码
~FS]F[{K$2D8A4{0Q3%0MSR.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-27 19:02:37 | 显示全部楼层
mintaka 发表于 2018-3-27 18:40
我又改了一下这样好像就可以自动打开了

谢谢,我研究研究
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 20:15:47 | 显示全部楼层
人造人 发表于 2018-3-27 19:02
谢谢,我研究研究
^_^

还是不行,我想的是创建一个函数,点到空格就打开并扫描周围的方块,如果上下左右四个正方向的空格可以再次调用函数,递归。但上面的有的空格四周没打开。。。
上面的程序我忘记加限制了在边界打开会有错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-27 20:46:35 | 显示全部楼层
mintaka 发表于 2018-3-27 20:15
还是不行,我想的是创建一个函数,点到空格就打开并扫描周围的方块,如果上下左右四个正方向的空格可以再 ...

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

使用道具 举报

发表于 2018-3-29 19:41:57 | 显示全部楼层
  1. void show_mine(int x,int y){
  2.     Map[x][y].status = true;
  3.     if(Map[x][y].course)
  4.         return;
  5.     for(int i = 0; i < 3; ++i)
  6.         if((x - 1 + i < map_x) && (x - 1 + i >= 0) && (y - 1 >= 0) && !Map[x - 1 + i][y - 1].is_mine){

  7.             if(!Map[x - 1 + i][y - 1].course && !Map[x - 1 + i][y - 1].status && (i !=0 || i != 2) )
  8.                 show_mine(x - 1 + i,y - 1);
  9.             else if(!Map[x - 1 + i][y - 1].course && !Map[x - 1 + i][y - 1].status && i != 1)
  10.                 continue;
  11.             Map[x - 1 + i][y - 1].status = true;
  12.         }

  13.     for(int i = 0; i < 3; ++i)
  14.         if((x - 1 + i < map_x) && (x - 1 + i >= 0) && (y + 1 < map_y) && !Map[x - 1 + i][y + 1].is_mine){

  15.             if(!Map[x - 1 + i][y + 1].course && !Map[x - 1 + i][y + 1].status && (i !=0 || i != 2))
  16.                 show_mine(x - 1 + i,y + 1);
  17.             else if(!Map[x - 1 + i][y + 1].course && !Map[x - 1 + i][y + 1].status && i != 1)
  18.                 continue;
  19.             Map[x - 1 + i][y + 1].status = true;
  20.         }

  21.     if(x - 1 >= 0 && !Map[x - 1][y].is_mine){

  22.         if(!Map[x - 1][y].course && !Map[x - 1][y].status)
  23.                 show_mine(x - 1,y);
  24.         Map[x - 1][y].status = true;
  25.     }

  26.     if(x + 1 < map_x && !Map[x + 1][y].is_mine){

  27.         if(!Map[x + 1][y].course && !Map[x + 1][y].status)
  28.                 show_mine(x + 1,y);
  29.         Map[x + 1][y].status = true;
  30.     }
  31. }
复制代码

把上面的同名函数改成这个就行了,emmmm,至少没有大bug,我调的雷数是30,效果还可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 19:49:48 | 显示全部楼层
mintaka 发表于 2018-3-29 19:41
把上面的同名函数改成这个就行了,emmmm,至少没有大bug,我调的雷数是30,效果还可以

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

使用道具 举报

发表于 2018-4-5 10:27:38 | 显示全部楼层
66
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-20 20:34:44 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-21 14:09:24 | 显示全部楼层
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 16:12:04 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-24 00:11:09 | 显示全部楼层
神人呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-8 11:16:55 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 14:30:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-3 20:41:18 | 显示全部楼层
好玩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-4 14:20:54 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-17 07:57:15 | 显示全部楼层
111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-17 09:13:09 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-4 13:06:27 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2019-6-13 23:45:59 | 显示全部楼层
学习一下增长知识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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