mintaka 发表于 2018-3-27 18:40:34

我又改了一下这样好像就可以自动打开了
#include<bits/stdc++.h>
#include<windows.h>
#include <conio.h>
using namespace std;

const int map_x = 16;
const int map_y = 16;
struct Mapelem{
    bool status = false;
    bool is_mine = false;
    int course = 0;
}Map;

void Hidecursor()
{
    CONSOLE_CURSOR_INFO cci;
    cci.bVisible = FALSE;
    cci.dwSize = sizeof(cci);
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorInfo(handle, &cci);
}

void gotoxy(int x,int y){
    COORD cod;
    cod.X = x * 2;
    cod.Y = y;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod );
}

void print_course(int x,int y){
    if(!Map.course){
      printf(" ");
      return;
    }
    printf("%d",Map.course);
}

void drawmap(){
    for(int i=0; i<map_x; i++){
      for(int j=0; j<map_y; j++){
            gotoxy(i,j);
            if(Map.status){
                if(Map.is_mine)
                  printf("★");
                else
                  print_course(i,j);
            }
            else
                printf("■");
      }
    }
}

void UpdateCursor(POINT po)
{
      drawmap();

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

void setmine(int num){
    int x,y;
    for(int i=0; i<num; i++){
      do{
            x = rand()%map_x;
            y = rand()%map_y;
      }while(Map.is_mine);
      Map.is_mine = true;
    }
}

int GetCount(int x, int y)
{
      int count = 0;

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

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

      // вС╠ъ
      if(x - 1 >= 0)                // спвС╠ъбП?
                if(Map.is_mine)
                        ++count;

      // ср╠ъ
      if(x + 1 < map_x)      // спср╠ъбП?
                if(Map.is_mine)
                        ++count;

      return count;
}

void GenerateCount(void)
{
      for(int i = 0; i < map_x; ++i)
      {
                for(int j = 0; j < map_y; ++j)
                {
                        if(!Map.is_mine)
                              Map.course = GetCount(i, j);
                }
      }
}

void show_mine(POINT p ){


    if (Map.status)
      return;
    else if (Map.course>0){
      Map.status = true;
      return;
    }
    else{//空格只需要上下左右四个方向检测
      Map.status = true;
      Map.status = true;
      Map.status = true;
      Map.status = true;
      Map.status = true;
      POINT k;
      k.x = p.x;
      if(p.y + 1 < map_y){
             k.y = p.y + 1;
            show_mine(k);
      }
      if(p.y - 1 > 0){
            k.y = p.y - 1;
            show_mine(k);
      }
      k.y = p.y;
      if(p.x + 1 < map_x){
         k.x = p.x + 1;
            show_mine(k);
      }
      if(p.x - 1 > 0){
            k.x = p.x - 1;
            show_mine(k);
      }
    }
}

bool SelectTarget(POINT p){
    if(Map.status)
      return false;
    if(Map.is_mine)
      return true;
    //print_course(p.x,p.y);
    show_mine(p);
    drawmap();
    return false;
}

void showmap(){
    for(int i=0; i<map_x; i++){
      for(int j=0; j<map_y; j++){
            if(!Map.status){
                gotoxy(i,j);
                if(Map.is_mine)
                  printf("★");
                else
                  print_course(i,j);
            }
      }
    }
}

int main(){
    srand((unsigned int)time(0));
    Hidecursor();
    drawmap();
    setmine(30);
    GenerateCount();

    POINT p = {0,0};
    UpdateCursor(p);

    while(1){
      char c = _getch();
      switch(c){
      case 'q':
      case 'Q':
            goto EXIT;
            break;
      case 'a':
      case 'A':
            if(p.x>0){
                p.x--;
                UpdateCursor(p);
            }break;
      case 's':
      case 'S':
            if(p.y<15){
                p.y++;
                UpdateCursor(p);
            }break;
      case 'W':
      case 'w':
            if(p.y>0){
                p.y--;
                UpdateCursor(p);
            }break;
      case 'd':
      case 'D':
            if(p.x<15){
                p.x++;
                UpdateCursor(p);
            }break;
      case ' ':
            if(SelectTarget(p))
                goto EXIT;
            break;
      }
    }
    EXIT:
      showmap();

    return 0;
}

人造人 发表于 2018-3-27 19:02:37

mintaka 发表于 2018-3-27 18:40
我又改了一下这样好像就可以自动打开了

谢谢,我研究研究
^_^

mintaka 发表于 2018-3-27 20:15:47

人造人 发表于 2018-3-27 19:02
谢谢,我研究研究
^_^

还是不行,我想的是创建一个函数,点到空格就打开并扫描周围的方块,如果上下左右四个正方向的空格可以再次调用函数,递归。但上面的有的空格四周没打开。。。
上面的程序我忘记加限制了在边界打开会有错误。{:10_243:}

人造人 发表于 2018-3-27 20:46:35

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

我研究研究

mintaka 发表于 2018-3-29 19:41:57

void show_mine(int x,int y){
    Map.status = true;
    if(Map.course)
      return;
    for(int i = 0; i < 3; ++i)
      if((x - 1 + i < map_x) && (x - 1 + i >= 0) && (y - 1 >= 0) && !Map.is_mine){

            if(!Map.course && !Map.status && (i !=0 || i != 2) )
                show_mine(x - 1 + i,y - 1);
            else if(!Map.course && !Map.status && i != 1)
                continue;
            Map.status = true;
      }

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

            if(!Map.course && !Map.status && (i !=0 || i != 2))
                show_mine(x - 1 + i,y + 1);
            else if(!Map.course && !Map.status && i != 1)
                continue;
            Map.status = true;
      }

    if(x - 1 >= 0 && !Map.is_mine){

      if(!Map.course && !Map.status)
                show_mine(x - 1,y);
      Map.status = true;
    }

    if(x + 1 < map_x && !Map.is_mine){

      if(!Map.course && !Map.status)
                show_mine(x + 1,y);
      Map.status = true;
    }
}
把上面的同名函数改成这个就行了,emmmm,至少没有大bug,我调的雷数是30,效果还可以

人造人 发表于 2018-3-29 19:49:48

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

嗯,谢谢

MAX-Payen 发表于 2018-4-5 10:27:38

66

溯影 发表于 2018-4-20 20:34:44

学习一下{:10_254:}

FCrimonal 发表于 2018-4-21 14:09:24

感谢楼主分享

NILL_X 发表于 2018-4-23 16:12:04

学习一下

不辣不火锅 发表于 2018-4-24 00:11:09

神人呀

青栀 发表于 2018-5-8 11:16:55

谢谢分享

Meteor.Yu 发表于 2018-5-11 14:30:45

{:7_113:}

^^^^^^^^^ 发表于 2018-11-3 20:41:18

好玩

DESTINY1 发表于 2018-11-4 14:20:54

学习一下

2377183301 发表于 2019-4-17 07:57:15

111

asdfghjkl147 发表于 2019-4-17 09:13:09

看看

养只鱼 发表于 2019-5-4 13:06:27

1

15002406463 发表于 2019-5-11 01:35:02

感谢分享

18392487927 发表于 2019-6-13 23:45:59

学习一下增长知识
页: 1 [2] 3 4
查看完整版本: 扫雷