扫雷F版 Beta 1.2.3

· · 休闲·娱乐

扫雷F版 Beta 1.2.3

无病毒 欢迎试玩 提出的建议大概率会采纳

    /* Copyright Flintmall, 2px Studio, 2024. All rights reserved. */
   /*                     Minesweeper Ver. F                      */
  /*                       作者:Flintmall                        */
 /*                     扫雷F版 Release 1.1                     */
/*                     致谢 Olive__ WeiBoYu                    */
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
void setColor(int color){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return ;
}
void cls(){
    system("cls");
    return ;
}
void wait(double n){
    _sleep(n * 1000);
    return ;
}
void wncls(double n){
    _sleep(n * 1000);
    cls();
    return ;
}
void waitEnter(){
    while(true){
        if(_kbhit()){
            int ch = _getch();
            if(ch == 13){
                break;
            }
        }
    }
}
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
int vis[7][9];

char white[6][8] = {
    {' ','1','2','3','4','5','6','7'},
    {'1','#','#','#','#','#','#','#'},
    {'2','#','#','#','#','#','#','#'},
    {'3','#','#','#','#','#','#','#'},
    {'4','#','#','#','#','#','#','#'},
    {'5','#','#','#','#','#','#','#'}
};
char black[7][9] = {};
void dfs(int x,int y){
    vis[y][x] = 1;
    if((black[y][x] >= '1' && black[y][x] <= '9') || black[y][x] == '.'){
        white[y][x] = black[y][x];
    }
    if(black[y][x] == '.'){
        for(int i = 0;i < 4;i++){
            int nx = x + dx[i],ny = y + dy[i];
            if(nx > 0 && ny > 0 && nx < 8 && ny < 6 && !vis[ny][nx]){
                dfs(nx,ny);
            }
        }
    }
}
int random(int x){
    srand(time(0));
    int m = rand() % x + 1;
    return m;
}
int flag,bomb;
void generate(){
    for(int i = 0;i < 7;i++){
        for(int j = 0;j < 9;j++){
            vis[i][j] = 0;
        }
    }
    for(int i = 0;i < 7;i++){
        for(int j = 0;j < 9;j++){
            black[i][j] = ' ';
        }
    }
    for(int i = 1;i < 6;i++){
        for(int j = 1;j < 8;j++){
            white[i][j] = '#';
        }
    }
    flag = 0,bomb = 0;
    int k1 = random(1),j1 = random(2);
    black[k1][j1] = '*';
    int k2 = random(2),j2 = random(3);
    black[k2][j2] = '*';
    int k3 = random(3),j3 = random(4);
    black[k3][j3] = '*';
    int k4 = random(4),j4 = random(5);
    black[k4][j4] = '*'; 
    int k5 = random(5),j5 = random(6);
    black[k5][j5] = '*';
    int k6 = random(6),j6 = random(7);
    black[k6][j6] = '*';
    int k7 = random(7),j7 = random(8);
    black[k7][j7] = '*';
    for(int i = 0;i < 7;i++){
        for(int j = 0;j < 9;j++){
            if(black[i][j] != '*' || i == 0 || j == 0 || i == 6 || j == 8){
                black[i][j] = ' ';
            }
        }
    }
    for(int i = 0;i < 6;i++){
        for(int j = 0;j < 8;j++){
            int sum = 0;
            if(black[i][j] != '*'){
                if(black[i - 1][j - 1] == '*'){
                    sum++;
                }
                if(black[i - 1][j] == '*'){
                    sum++;
                }
                if(black[i - 1][j + 1] == '*'){
                    sum++;
                }
                if(black[i][j - 1] == '*'){
                    sum++;
                }
                if(black[i][j + 1] == '*'){
                    sum++;
                }
                if(black[i + 1][j - 1] == '*'){
                    sum++;
                }
                if(black[i + 1][j] == '*'){
                    sum++;
                }
                if(black[i + 1][j + 1] == '*'){
                    sum++;
                }
                if(sum == 0){
                    black[i][j] = '.';
                }
                else if(sum == 1){
                    black[i][j] = '1';
                }
                else if(sum == 2){
                    black[i][j] = '2';
                }
                else if(sum == 3){
                    black[i][j] = '3';
                }
                else if(sum == 4){
                    black[i][j] = '4';
                }
                else if(sum == 5){
                    black[i][j] = '5';
                }
                else if(sum == 6){
                    black[i][j] = '6';
                }
                else if(sum == 7){
                    black[i][j] = '7';
                }
                else if(sum == 8){
                    black[i][j] = '8';
                }
            }
            else{
                flag += 1;
            }
        }
    }
    for(int i = 0;i < 7;i++){
        for(int j = 0;j < 9;j++){
            if(i == 0 || j == 0 || i == 6 || j == 8){
                black[i][j] = ' ';
            }
        }
    } 
    bomb = flag;
    return ;
}
void calculate(){
    for(int i = 0;i < 6;i++){
        for(int j = 0;j < 8;j++){
            int sum = 0;
            if(black[i][j] != '*'){
                if(black[i - 1][j - 1] == '*'){
                    sum++;
                }
                if(black[i - 1][j] == '*'){
                    sum++;
                }
                if(black[i - 1][j + 1] == '*'){
                    sum++;
                }
                if(black[i][j - 1] == '*'){
                    sum++;
                }
                if(black[i][j + 1] == '*'){
                    sum++;
                }
                if(black[i + 1][j - 1] == '*'){
                    sum++;
                }
                if(black[i + 1][j] == '*'){
                    sum++;
                }
                if(black[i + 1][j + 1] == '*'){
                    sum++;
                }
                if(sum == 0){
                    black[i][j] = '.';
                }
                else if(sum == 1){
                    black[i][j] = '1';
                }
                else if(sum == 2){
                    black[i][j] = '2';
                }
                else if(sum == 3){
                    black[i][j] = '3';
                }
                else if(sum == 4){
                    black[i][j] = '4';
                }
                else if(sum == 5){
                    black[i][j] = '5';
                }
                else if(sum == 6){
                    black[i][j] = '6';
                }
                else if(sum == 7){
                    black[i][j] = '7';
                }
                else if(sum == 8){
                    black[i][j] = '8';
                }
            }
            else{
                flag += 1;
            }
        }
    }
    for(int i = 0;i < 7;i++){
        for(int j = 0;j < 9;j++){
            if(i == 0 || j == 0 || i == 6 || j == 8){
                black[i][j] = ' ';
            }
        }
    } 
    bomb = flag;
}
int click = 0;
int main(){
    system("color F");
    int wintimes = 0;
    for(int i = 3;i > 0;i--){
        cout<<"生成随机种子中……"<<endl;
        cout<<"还有 "<<i<<" 秒开始游戏……"<<endl;
        wncls(1);
    }
    generate();
    while(true){
        cout<<"   -= 扫雷F版 Release v1.1 =-"<<endl;
        cout<<"     请输入操作符来进行操作"<<endl;
        cout<<"   q x y:打开位置在(x,y)的格子"<<endl;
        cout<<"w x y:将位置在(x,y)的格子插上旗帜"<<endl;
        cout<<"e x y:将位置在(x,y)的格子插上问号"<<endl; 
        cout<<"        g:打开游戏操作指南"<<endl;
        cout<<"          u:打开更新日志"<<endl; 
        cout<<"             连胜:"<<wintimes<<endl;
        cout<<"                :)       "<<endl;
        cout<<"    -======================-"<<endl;
        for(int i = 0;i < 6;i++){
            cout<<"        ";
            for(int j = 0;j < 8;j++){
                if(j != 0 && i != 0){
                    if(white[i][j] == '1'){
                        setColor(3);
                    }
                    else if(white[i][j] == '2'){
                        setColor(2);
                    }
                    else if(white[i][j] == '3'){
                        setColor(4);
                    }
                    else if(white[i][j] == '4'){
                        setColor(8);
                    }
                    else if(white[i][j] == '5'){
                        setColor(6);
                    }
                    else if(white[i][j] == '6'){
                        setColor(14);
                    }
                    else if(white[i][j] == '7'){
                        setColor(1);
                    }
                    else if(white[i][j] == '8'){
                        setColor(15);
                    }
                    else{
                        setColor(8);
                    }
                }
                else{
                    setColor(15);
                }
                cout<<white[i][j]<<" ";
                setColor(15);
            }
            cout<<endl;
        }
        cout<<"    -======================-"<<endl;
        cout<<"        你剩下的旗帜:";
        if(click == 0){
            cout<<"?"<<endl;
        }
        else{
            cout<<flag<<endl;
        }
        cout<<"输入操作|";
        char chose;
        int x,y; 
        cin>>chose; 
        if(chose == 'q' || chose == 'w' || chose == 'e'){
            cin>>x>>y;
        }
        if(chose == 'q' && x > 0 && y > 0 && x < 8 && y < 6){
            click++;
            if(black[y][x] != '*' || (black[y][x] == '*' && click == 1)){
                white[y][x] = black[y][x];
            }
            if(white[y][x] == '!'){
                flag += 1;
            }
            if(black[y][x] == '*'){
                if(click != 1){
                    cls();
                    cout<<"    -======================-"<<endl;
                    cout<<"             你炸了!"<<endl;
                    cout<<"               x("<<endl;
                    cout<<"    -======================-"<<endl;
                    wintimes = 0;
                    for(int i = 0;i < 6;i++){
                        cout<<"        ";
                        for(int j = 0;j < 8;j++){
                            if(j != 0 && i != 0){
                                if(black[i][j] == '1'){
                                    setColor(3);
                                }
                                else if(black[i][j] == '2'){
                                    setColor(2);
                                }
                                else if(black[i][j] == '3' || black[i][j] == '*'){
                                    setColor(4);
                                }
                                else if(black[i][j] == '4'){
                                    setColor(8);
                                }
                                else if(black[i][j] == '5'){
                                    setColor(6);
                                }
                                else if(black[i][j] == '6'){
                                    setColor(14);
                                }
                                else if(black[i][j] == '7'){
                                    setColor(1);
                                }
                                else if(black[i][j] == '8'){
                                    setColor(15);
                                }
                                else{
                                    setColor(8);
                                }
                                cout<<black[i][j]<<" ";
                            }
                            else{
                                setColor(15);
                                cout<<white[i][j]<<" ";
                            }
                            setColor(15);
                        }
                        cout<<endl;
                    }
                    cout<<"输入c再来一次,输入t退出游戏。"<<endl;
                    char continueOrNot;
                    cin>>continueOrNot;
                    if(continueOrNot == 'c'){
                        click = 0;
                        generate();
                    }
                    else{
                        break;
                        return 0;
                    }
                }
                else{
                    black[y][x] = '.';
                    calculate();
                }
            }
            else if(black[y][x] == '.'){
                dfs(x,y);
            }
        }
        else if(chose == 'w' && x > 0 && y > 0 && x < 8 && y < 6){
            white[y][x] = '!';
            flag -= 1;
            if(black[y][x] == '*'){
                bomb -= 1;
            }
        }
        else if(chose == 'e' && x > 0 && y > 0 && x < 8 && y < 6){
            white[y][x] = '?';
            if(white[y][x] == '!'){
                flag += 1;
            }
        }
        else if(chose == 'u'){
            cls();
            char version = 'a';
            while(true){
                cout<<"更新日志"<<endl;
                if(version == 'a'){
                    cout<<endl;
                    cout<<"2024/8/6 8:56 扫雷F版 Alpha v1.0.9:"<<endl;
                    cout<<"    ·增加了输后在这一局游戏的基础上再来一局的功能。"<<endl;
                    cout<<"    ·增加了赢后再来一局的功能。"<<endl;
                    cout<<endl;
                    cout<<"2024/8/5 11:20 扫雷F版 Alpha v1.0.8:"<<endl;
                    cout<<"    ·修复了显示空格时旁侧的数字会消失的BUG。"<<endl;
                    cout<<endl;
                    cout<<"2024/8/3 11:48 扫雷F版 Alpha v1.0.7:"<<endl;
                    cout<<"    ·更改了空格显示机制。"<<endl;
                    cout<<endl;
                    cout<<"2024/8/3 11:27 扫雷F版 Alpha v1.0.6:"<<endl;
                    cout<<"    ·添加了1个彩蛋。:)"<<endl;
                    cout<<endl;
                    cout<<"2024/8/3 10:24 扫雷F版 Alpha v1.0.5:"<<endl;
                    cout<<"    ·更改了操作符。"<<endl;
                    cout<<endl;
                    cout<<"2024/3/3 9:18 扫雷F版 Alpha v1.0.4:"<<endl;
                    cout<<"    ·添加了数字颜色。"<<endl;
                    cout<<endl; 
                    cout<<"2023/12/24 10:55 扫雷F版 Alpha v1.0.3:"<<endl;
                    cout<<"    ·优化了打开更新日志的方式。"<<endl;
                    cout<<"    ·缩短了开始时间。"<<endl;
                    cout<<endl;
                    cout<<"2023/12/10 10:49 扫雷F版 Alpha v1.0.2:"<<endl;
                    cout<<"    ·更改了底层代码。"<<endl;
                    cout<<endl;
                    cout<<"2023/11/12 11:45 扫雷F版 Alpha v1.0.1:"<<endl;
                    cout<<"    ·增加了“你赢了!”页面。"<<endl;
                    cout<<"    ·对“你炸了!”页面进行修改。"<<endl;
                    cout<<"    ·增加了游戏结束后的“游戏结束!”语句。"<<endl;
                    cout<<endl;
                    cout<<"2023/11/12 11:20 扫雷F版 Alpha v1.0:"<<endl;
                    cout<<"    ·增加了随机雷区。"<<endl;
                    cout<<"    ·增加了更新日志。"<<endl;
                    cout<<endl;
                }
                else if(version == 'b'){
                    cout<<endl;
                    cout<<"2024/11/3 11:58 扫雷F版 Beta v1.2.3:"<<endl;
                    cout<<"    ·增加了第一步保护机制,现在第一次点击必定不会是雷了。
                    "<<endl;
                    cout<<endl;
                    cout<<"2024/10/18 15:03 扫雷F版 Beta v1.2.2:"<<endl;
                    cout<<"    ·简化了游戏底层代码。"<<endl;
                    cout<<"    ·修改了失败后再来一局的机制,现在失败后再来一局是随机的一局新游戏了。"<<endl;
                    cout<<endl;
                    cout<<"2024/10/18 14:44 扫雷F版 Beta v1.2.1:"<<endl;
                    cout<<"    ·修复了再来一局后空格旁格显示有误的BUG。"<<endl;
                    cout<<endl;
                    cout<<"2024/10/13 10:45 扫雷F版 Beta v1.2:"<<endl;
                    cout<<"    ·完善了空格旁格显示机制。"<<endl;
                    cout<<endl;
                    cout<<"2024/8/6 17:30 扫雷F版 Beta v1.0"<<endl; 
                    cout<<"    ·修复了打开更新日志后关不掉的BUG。"<<endl;
                    cout<<"    ·修复了更新日志不会刷新页面的BUG。"<<endl;
                }
                else if(version == 'r'){
                    cout<<endl;
                    cout<<"2024/8/6 17:50 扫雷F版 Release v1.1:"<<endl;
                    cout<<"    ·添加了2个彩蛋。;D"<<endl;
                    cout<<"    ·对版本日志页面重新布局。"<<endl;
                    cout<<endl;
                    cout<<"2024/8/6 14:00 扫雷F版 Release v1.0:"<<endl;
                    cout<<"    ·正式版发布。"<<endl;
                    cout<<"    ·增加连胜显示。"<<endl;
                }
                else if(version == 't'){
                    break;
                }
                cout<<"输入a查看Alpha版本的版本日志,输入b查看先遣版(Beta)的版本日志,输入r查看正式版(Release)的版本日志,输入t关闭版本日志。"<<endl;
                cin>>version;
                system("cls");
            }
        }
        else if(chose == 'k'){
            cls();
            while(true){
                cout<<"嘟嘟嗒嘟嘟嗒·ω·"<<endl;
                cout<<"你找到了柯哀小彩蛋!"<<endl;
                cout<<"既然找到小彩蛋,不如休息一下吧qwq"<<endl;
                waitEnter();
                break;
            }
        }
        else if(chose == 'i'){
            cls();
            int egg = 7;
            while(true){
                cout<<"享受柯哀小音效吧=)"<<endl;
                cout<<"Enter关闭"<<endl;
                cout<<char(egg);
                cout<<char(egg);
                cout<<char(egg);
                waitEnter();
                break;
            }
        }
        else if(chose == 'f'){
            cls();
            while(true){
                cout<<"扫雷F版的作者是Flintmall,"<<endl;
                cout<<"这里有他想说的话。"<<endl;
                cout<<endl;
                cout<<"距离第一次开始开发扫雷类型的游戏,已经过去超过一年了。"<<endl;
                cout<<"为什么我一直坚持做扫雷?"<<endl;
                cout<<"扫雷是我童年在Windows自带游戏中唯一能玩懂的游戏,"<<endl;
                cout<<"它策略,它有趣,它简单,它几近完美。"<<endl;
                cout<<"而对扫雷的热爱,"<<endl;
                cout<<"驱使着我做完了这个游戏。"<<endl;
                cout<<"感谢你,也感谢所有游玩游戏的玩家。"<<endl;
                cout<<"(按下Enter退出)"<<endl;
                waitEnter();
                break;
            }
        }
        else{
            cout<<"NULL 请重启游戏 NULL";
        }
        if(bomb == 0 && flag == 0){
            cls();
            cout<<"    -======================-"<<endl;
            cout<<"             你赢了!"<<endl;
            cout<<"               :D"<<endl;
            cout<<"    -======================-"<<endl;
            for(int i = 0;i < 6;i++){
                cout<<"        ";
                for(int j = 0;j < 8;j++){
                    if(j != 0 && i != 0){
                        if(black[i][j] == '1'){
                            setColor(3);
                        }
                        else if(black[i][j] == '2'){
                            setColor(2);
                        }
                        else if(black[i][j] == '3' || black[i][j] == '*'){
                            setColor(4);
                        }
                        else if(black[i][j] == '4'){
                            setColor(8);
                        }
                        else if(black[i][j] == '5'){
                            setColor(6);
                        }
                        else if(black[i][j] == '6'){
                            setColor(14);
                        }
                        else if(black[i][j] == '7'){
                            setColor(1);
                        }
                        else if(black[i][j] == '8'){
                            setColor(15);
                        }
                        else{
                            setColor(8);
                        }
                        cout<<black[i][j]<<" ";
                    } 
                    else{
                        setColor(15);
                        cout<<white[i][j]<<" ";
                    }
                    setColor(15);
                }
                cout<<endl;
            }
            wintimes++;
            cout<<"输入a再来一局新游戏,输入t退出游戏。"<<endl;
            char againOrNot;
            cin>>againOrNot;
            if(againOrNot == 'a'){
                click = 0;
                generate();
            }
            else{
                break;
                return 0;
            }
        }
        cls();
    }
    cout<<"游戏结束!";
    system("pause");
    return 0;
}