鱼C论坛

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

[技术交流] 扫雷

[复制链接]
发表于 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[map_x][map_y];

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[x][y].course){
        printf(" ");
        return;
    }
    printf("%d",Map[x][y].course);
}

void drawmap(){
    for(int i=0; i<map_x; i++){
        for(int j=0; j<map_y; j++){
            gotoxy(i,j);
            if(Map[i][j].status){
                if(Map[i][j].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[x][y].is_mine);
        Map[x][y].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[x - 1 + i][y - 1].is_mine)
                                ++count;

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

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

        // ср╠ъ
        if(x + 1 < map_x)        // спср╠ъбП?
                if(Map[x + 1][y].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[i][j].is_mine)
                                Map[i][j].course = GetCount(i, j);
                }
        }
}

void show_mine(POINT p ){


    if (Map[p.x][p.y].status)
        return;
    else if (Map[p.x][p.y].course>0){
        Map[p.x][p.y].status = true;
        return;
    }
    else{//空格只需要上下左右四个方向检测
        Map[p.x][p.y].status = true;
        Map[p.x-1][p.y-1].status = true;
        Map[p.x+1][p.y-1].status = true;
        Map[p.x-1][p.y+1].status = true;
        Map[p.x+1][p.y-1].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[p.x][p.y].status)
        return false;
    if(Map[p.x][p.y].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[i][j].status){
                gotoxy(i,j);
                if(Map[i][j].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;
}
~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 | 显示全部楼层
void show_mine(int x,int y){
    Map[x][y].status = true;
    if(Map[x][y].course)
        return;
    for(int i = 0; i < 3; ++i)
        if((x - 1 + i < map_x) && (x - 1 + i >= 0) && (y - 1 >= 0) && !Map[x - 1 + i][y - 1].is_mine){

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

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

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

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

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

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

        if(!Map[x + 1][y].course && !Map[x + 1][y].status)
                show_mine(x + 1,y);
        Map[x + 1][y].status = true;
    }
}
把上面的同名函数改成这个就行了,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-12-24 00:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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