问题标题: 1.2版(更上层楼)扫雷,它来了!

0
0
已解决
曹灿阳
曹灿阳
初级天翼
初级天翼

今天是大年三十!!!

又是一年扫雷热,依然十里爆炸红。

我又更新了我的扫雷。

顺便说一下:1.0版扫雷的名字是初出茅庐,1.1版的名字是不负众望,1.2版的名字是更上层楼

我怕有人看不见我在原来的问题中发的扫雷,所以我换了一个问题。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
void color(int corcorcor){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),corcorcor+64);
}
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(vis[i][j]==0&&mmap[i][j]!=INF)
                return false;
        }
    }
    return true;
}
bool valid(int x,int y,int m,int n){
    if(x>=1&&x<=m&&y>=1&&y<=n)
        return true;
    return false;
}
void fankai(int x,int y,int m,int n){
    for(int i=0;i<8;i++){
        int nx=x+dir[i][0],ny=y+dir[i][1];
        if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
            if(mmap[nx][ny]!=INF)
                vis[nx][ny]=true;
            if(mmap[nx][ny]==0)
                fankai(nx,ny,m,n);
        }
    }
}
bool saolei_p1(int m,int n){
    memset(vis,0,sizeof(vis));
    while(!pd(m,n)){
        system("cls");
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(fflag[i][j]){
                    color(11);
                    cout<<"F ";
                }
                else if(vis[i][j]&&mmap[i][j]!=INF){
                    if(mmap[i][j]==0){
                        color(13);
                    }
                    else{
                        color(15);
                    }
                    cout<<mmap[i][j]<<" ";
                }
                else{
                    color(12);
                    cout<<"? ";
                }
            }
            color(9);
            cout<<left<<setw(2)<<i<<endl;
        }
        color(9);
        for(int j=1;j<=n;j++)
            cout<<left<<setw(2)<<j;
        cout<<"  ←列"<<endl;
        cout<<right<<setw(n*2+2)<<" ↑"<<endl;
        cout<<right<<setw(n*2+2)<<" 行"<<endl;
        Sleep(1000);
        color(14);
        cout<<"输入说明:\n";
        cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
        cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
        int xa,xb,caozuo;
        cin>>xa>>xb>>caozuo;
        if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
            cout<<"输入错误,请重新输入!";
            Sleep(1000);
            system("cls");
            continue;
        }
        if(caozuo==1){
            if(mmap[xa][xb]==INF){
                system("cls");
                cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
                for(int i=1;i<=m;i++){
                    for(int j=1;j<=n;j++){
                        if(mmap[i][j]==INF){
                            color(11);
                            cout<<"* ";
                        }
                        else{
                            if(mmap[i][j]==0)
                                color(13);
                            else
                                color(15);
                            cout<<mmap[i][j]<<" ";
                        }
                    }
                    cout<<endl;
                }
                color(14);
                system("pause");
                return false;
            }
            vis[xa][xb]=true;
            if(mmap[xa][xb]==0)
                fankai(xa,xb,m,n);
        }
        if(caozuo==2){
            if(vis[xa][xb]){
                cout<<"操作失败!";
                Sleep(1000);
                system("cls");
                continue;
            }
            fflag[xa][xb]=true;
        }
        if(caozuo==3){
            if(!vis[xa][xb]){
                cout<<"操作失败!";
                Sleep(1000);
                system("cls");
                continue;
            }
            int cnt=0,tmp_flag=false;
            for(int i=0;i<8;i++){
                int nx=xa+dir[i][0],ny=xb+dir[i][1];
                if(valid(nx,ny,m,n)&&fflag[nx][ny]){
                    cnt++;
                    if(mmap[nx][ny]!=INF){
                        tmp_flag=true;
                    }
                }
            }
            if(cnt!=mmap[xa][xb]){
                cout<<"操作格子周围的雷数不对,请注意。";
                Sleep(1000);
                system("cls");
                continue;
            }
            else if(tmp_flag){
                system("cls");
                cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
                for(int i=1;i<=m;i++){
                    for(int j=1;j<=n;j++){
                        if(mmap[i][j]==INF){
                            color(11);
                            cout<<"* ";
                        }
                        else{
                            if(mmap[i][j]==0)
                                color(13);
                            else
                                color(15);
                            cout<<mmap[i][j]<<" ";
                        }
                    }
                    cout<<endl;
                }
                color(14);
                system("pause");
                return false;
            }
            else{
                for(int i=0;i<8;i++){
                    int nx=xa+dir[i][0],ny=xb+dir[i][1];
                    if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
                        vis[nx][ny]=true;
                        if(mmap[nx][ny]==0){
                            fankai(nx,ny,m,n);
                        }
                    }
                }
            }
        }
        if(caozuo==4){
            if(fflag[xa][xb])
                fflag[xa][xb]=false;
            else{
                cout<<"操作失败!";
                Sleep(1000);
                continue;
            }
        }
        system("cls");
    }
    system("cls");
    cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(mmap[i][j]==INF){
                color(11);
                cout<<"* ";
            }
            else{
                if(mmap[i][j]==0)
                    color(13);
                else
                    color(15);
                cout<<mmap[i][j]<<" ";
            }
        }
        cout<<endl;
    }
    color(14);
    system("pause");
    system("cls");
    return true;
}
bool saolei(int m,int n){
    srand(time(NULL));
    memset(mmap,0,sizeof(mmap));
    memset(vis,0,sizeof(vis));
    memset(fflag,0,sizeof(fflag));
    system("cls");
    int cnt_b=m*(n+1)/10+1;
    for(int i=1;i<=cnt_b;i++){
        int x=rand()%m+1,y=rand()%n+1;
        mmap[x][y]=INF;
    }
    cnt_b=0;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(mmap[i][j]==INF){
                cnt_b++;
            }
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(mmap[i][j]!=INF){
                for(int k=0;k<8;k++){
                    int nx=i+dir[k][0],ny=j+dir[k][1];
                    if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
                        mmap[i][j]++;
                    }
                }
            }
        }
    }
    system("cls");
    bool tmp=saolei_p1(m,n);
    system("cls");
    while(tmp==0){
        lose++;
        color(14);
        bool a;
        cout<<"是否重新开始相同的地图?(1表示是,0表示否)";
        cin>>a;
        if(a){
            cout<<"好的,重新开始。";
            system("cls");
            tmp=saolei_p1(m,n);
        }
        else
            break;
    }
    return tmp;
}
void goto_saolei(){
    system("cls");
    int m,n;
    while(1){
        cout<<"请输入你要玩多少行,多少列的扫雷?\n";
        cin>>m>>n;
        if(!(m>=3&&m<=30&&n>=3&&n<=30)){
            cout<<"输入数据不合理,请重新输入!"<<endl;
            Sleep(1000);
            system("cls");
            continue;
        }
        else{
            break;
        }
    }
    if(saolei(m,n))
        win++;
    else
        lose++;
    system("cls");
}
int main(){
    system("cls");
    color(0);
    system("cls");
    color(14);
    MessageBox(NULL,"欢迎来到益智游戏大全1.2版(更上层楼)!\n特别鸣谢:沙宸安","欢迎",MB_OK);
    MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
    system("cls");
    bool cd;
    cout<<"请问您是否使用上一次的存档???(输入1或0)";
    cin>>cd;
    if(cd){
        cout<<"好的,恢复存档。"<<endl;
        ifstream fin("益智游戏大全.txt");
        fin>>win>>lose;
        fin.close();
        Sleep(1000);
    }
    while(1){
        system("cls");
        cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
        int g;
        cin>>g;
        if(g==-1)
            break;
        switch(g){
            case 1:goto_saolei();break;
            default:cout<<"输入错误,请重新输入!";Sleep(1000);continue; 
        }
    }
    system("cls");
    bool bc;
    cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。成功率:";
    printf("%.1f",win*100/(double)(win+lose));
    cout<<"%\n";
    Sleep(1500);
    cout<<"是否保存???(输入1或0)";
    cin>>bc;
    if(bc){
        cout<<"好的,保存后请立即退出。"<<endl;
        ofstream fout("益智游戏大全.txt");
        fout<<win<<" "<<lose;
        fout.close();
        Sleep(1000);
    }
    else{
        system("cls");
        cout<<"再见!!!";
        ofstream fout("益智游戏大全.txt");
        fout<<0<<" "<<0;
        fout.close();
        Sleep(1000);
    }
    return 0;
}

 


0
0
0
张帆
张帆
中级天翼
中级天翼

你是不是自坑自,发个无敌水贴让别人一行一行打?

0
曹灿阳
曹灿阳
初级天翼
初级天翼

各位,不好意思,板块发错了,我重发一下。

0
我要回答