#include <bits/stdc++.h> #include <windows.h> using namespace std; const int MAXN = 35; int a[MAXN][MAXN], c[MAXN][MAXN], op, l, ls, x, y, cnt = 0, cnt1 = 0, hard[7] = {0, 10, 8, 6, 5, 4}; int dx[4] = {-1, 0, 0, 1}; int dy[4] = {0, -1, 1, 0}; bool b[MAXN][MAXN], d[MAXN][MAXN], boom = 1; int main(); void init(); int rand1(int); int r(int); void dfs(int, int); void print(); bool judge(int); void startGame(); void play(); int rand1(int num){ return 1LL * rand() % num + 1; }

int r(int num){ return 1LL * rand1(num) % num * rand1(num) % num + 1; }

void dfs(int xa, int ya){ if(xa < 1 || ya < 1 || xa > l || ya > l || b[xa][ya]){ return; } c[xa][ya] = 1; d[xa][ya] = 1; if(a[xa][ya]){ return; } for(int i = 0;i < 4;i++){ if(!d[xa + dx[i]][ya + dy[i]]){ dfs(xa + dx[i], ya + dy[i]); } } }

void print(){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("x\y "); for(int i = 1;i <= l;i++){ printf("%d ", i); if(i < 10){ printf(" "); } } printf("\n"); for(int i = 1;i <= l;i++){ printf("\n%d", i); if(i >= 10){ printf(" "); } else{ printf(" "); } for(int j = 1;j <= l;j++){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if(c[i][j] == 1){ if(a[i][j] < 2){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); } else if(a[i][j] < 4){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE); } else if(a[i][j] < 5){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); } else{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); } printf("%d ", a[i][j]); } else if(c[i][j] == 2){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf("* "); } else{ printf("? "); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } printf("\n"); } printf("\n---------------\n数字为周围 8 格中雷的数量,* 为标记为雷,? 为未知\n"); }

bool judge(int x){ if(x >= 1 && x <= l){ return false; } else{ return true; } }

void init(){ srand(time(0)); printf("扫雷 v1.5.3,若有新版本,我会立即更新。\n作者:路子峰1\n若有建议请提出,谢谢\n"); system("pause"); system("cls"); startGame(); } void startGame(){ printf("请输入方阵的长(5-30之间):"); scanf("%d", &op); while(op < 5 || op > 30){ printf("不在范围内,请重新输入:"); scanf("%d", &op); } l = op; printf("请设置难度(1-5):"); scanf("%d", &op); while(op < 1 || op > 5){ printf("不在范围内,请重新输入:"); scanf("%d", &op); } ls = l * l / hard[op]; printf("本局共 %d 个雷\n", ls); while(cnt < ls){ x = r(l); y = r(l); if(!b[x][y]){ b[x][y] = 1; cnt++; } } for(int i = 1;i <= l;i++){ for(int j = 1;j <= l;j++){ if(!b[i][j]){ a[i][j] = b[i - 1][j - 1] + b[i - 1][j] + b[i - 1][j + 1] + b[i][j - 1] + b[i][j + 1] + b[i + 1][j - 1] + b[i + 1][j] + b[i + 1][j + 1]; } } } cnt = 0; play(); } int main(){ init(); return 0; } void play(){ while(cnt < ls && cnt1 < l * l - ls){ system("pause"); system("cls"); print(); read: printf("\n---------\n翻开输入 1,标记输入 2,撤销标记输入 3:\n"); scanf("%d", &op); if(op == 1){ printf("请输入要翻开的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while(judge(x) || judge(y)){ printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将翻开 x = %d, y = %d 的格子。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if(op){ goto read; } if(c[x][y] == 1){ printf("已经被翻开过了\n"); continue; } else if(c[x][y] == 2){ printf("已被标记为雷,请撤销标记后重试\n"); continue; } c[x][y] = 1; cnt1++; if(b[x][y] == 1){ printf("BOON\n你踩到了雷,游戏结束\n"); boom = 0; break; } else{ c[x][y] = 1; if(a[x][y] == 0){ dfs(x, y); } } } else if(op == 2){ printf("请输入要标记的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while(judge(x) || judge(y)){ printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将标记 x = %d, y = %d 的格子为雷。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if(op){ goto read; } if(c[x][y] == 1){ printf("已经翻开过并且不是雷,请重新输入\n"); continue; } else if(c[x][y] == 2){ printf("已被标记为雷,请重新输入\n"); continue; } c[x][y] = 2; if(b[x][y] == 1){ cnt++; } } else if(op == 3){ printf("请输入要取消标记的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while(judge(x) || judge(y)){ printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将取消在 x = %d, y = %d 的格子上的雷标记。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if(op){ goto read; } if(c[x][y] != 2){ printf("未被标记,请重新输入\n"); continue; } c[x][y] = 0; if(b[x][y] == 1){ cnt--; } } } if(boom){ printf("恭喜你胜利!\n"); } system("pause"); system("cls"); printf("终局:\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("x\y "); for(int i = 1;i <= l;i++){ printf("%d ", i); if(i < 10){ printf(" "); } } printf("\n"); for(int i = 1;i <= l;i++){ printf("\n%d", i); if(i >= 10){ printf(" "); } else{ printf(" "); } for(int j = 1;j <= l;j++){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if(!b[i][j]){ if(a[i][j] < 2){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); } else if(a[i][j] < 4){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE); } else if(a[i][j] < 5){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); } else{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); } printf("%d ", a[i][j]); } else{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf("* "); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } printf("\n"); } printf("\n----------------\n数字为周围 8 格中雷的数量,* 为雷\n"); Sleep(2000); system("pause"); system("cls"); printf("请问是否要重新开始游戏?是请输入 1,不是请输入 2:\n"); scanf("%d", &op); if(op == 1){ memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); memset(d, 0, sizeof(d)); cnt = 0; cnt1 = 0; boom = 1; startGame(); } else{ printf("游戏结束!\n"); } }

6 条评论

  • 我是继承丁泓森帮你写代码块的

    #include <bits/stdc++.h>
    #include <windows.h>
    using namespace std;
    const int MAXN = 35;
    int a[MAXN][MAXN], c[MAXN][MAXN], op, l, ls, x, y,
        cnt = 0, cnt1 = 0, hard[7] = {0, 10, 8, 6, 5, 4};
    int dx[4] = {-1, 0, 0, 1};
    int dy[4] = {0, -1, 1, 0};
    bool b[MAXN][MAXN], d[MAXN][MAXN], boom = 1;
    int main();
    void init();
    int rand1(int);
    int r(int);
    void dfs(int, int);
    void print();
    bool judge(int);
    void startGame();
    void play();
    int rand1(int num) { return 1LL * rand() % num + 1; }
    
    int r(int num) { return 1LL * rand1(num) % num * rand1(num) % num + 1; }
    
    void dfs(int xa, int ya) {
        if (xa < 1 || ya < 1 || xa > l || ya > l || b[xa][ya]) {
            return;
        }
        c[xa][ya] = 1;
        d[xa][ya] = 1;
        if (a[xa][ya]) {
            return;
        }
        for (int i = 0; i < 4; i++) {
            if (!d[xa + dx[i]][ya + dy[i]]) {
                dfs(xa + dx[i], ya + dy[i]);
            }
        }
    }
    
    void print() {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                FOREGROUND_INTENSITY | FOREGROUND_RED |
                                    FOREGROUND_GREEN | FOREGROUND_BLUE);
        printf("x\y ");
        for (int i = 1; i <= l; i++) {
            printf("%d ", i);
            if (i < 10) {
                printf(" ");
            }
        }
        printf("\n");
        for (int i = 1; i <= l; i++) {
            printf("\n%d", i);
            if (i >= 10) {
                printf(" ");
            } else {
                printf(" ");
            }
            for (int j = 1; j <= l; j++) {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                        FOREGROUND_INTENSITY | FOREGROUND_RED |
                                            FOREGROUND_GREEN | FOREGROUND_BLUE);
                if (c[i][j] == 1) {
                    if (a[i][j] < 2) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_GREEN);
                    } else if (a[i][j] < 4) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_BLUE);
                    } else if (a[i][j] < 5) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_GREEN |
                                                    FOREGROUND_BLUE);
                    } else {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_RED |
                                                    FOREGROUND_BLUE);
                    }
                    printf("%d ", a[i][j]);
                } else if (c[i][j] == 2) {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                            FOREGROUND_INTENSITY | FOREGROUND_RED);
                    printf("* ");
                } else {
                    printf("? ");
                }
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                        FOREGROUND_INTENSITY | FOREGROUND_RED |
                                            FOREGROUND_GREEN | FOREGROUND_BLUE);
            }
            printf("\n");
        }
        printf("\n---------------\n数字为周围 8 格中雷的数量,* 为标记为雷,? "
               "为未知\n");
    }
    
    bool judge(int x) {
        if (x >= 1 && x <= l) {
            return false;
        } else {
            return true;
        }
    }
    
    void init() {
        srand(time(0));
        printf(
            "扫雷 "
            "v1.5."
            "3,若有新版本,我会立即更新。\n作者:路子峰1\n若有建议请提出,谢谢\n");
        system("pause");
        system("cls");
        startGame();
    }
    void startGame() {
        printf("请输入方阵的长(5-30之间):");
        scanf("%d", &op);
        while (op < 5 || op > 30) {
            printf("不在范围内,请重新输入:");
            scanf("%d", &op);
        }
        l = op;
        printf("请设置难度(1-5):");
        scanf("%d", &op);
        while (op < 1 || op > 5) {
            printf("不在范围内,请重新输入:");
            scanf("%d", &op);
        }
        ls = l * l / hard[op];
        printf("本局共 %d 个雷\n", ls);
        while (cnt < ls) {
            x = r(l);
            y = r(l);
            if (!b[x][y]) {
                b[x][y] = 1;
                cnt++;
            }
        }
        for (int i = 1; i <= l; i++) {
            for (int j = 1; j <= l; j++) {
                if (!b[i][j]) {
                    a[i][j] = b[i - 1][j - 1] + b[i - 1][j] + b[i - 1][j + 1] +
                              b[i][j - 1] + b[i][j + 1] + b[i + 1][j - 1] +
                              b[i + 1][j] + b[i + 1][j + 1];
                }
            }
        }
        cnt = 0;
        play();
    }
    int main() {
        init();
        return 0;
    }
    void play() {
        while (cnt < ls && cnt1 < l * l - ls) {
            system("pause");
            system("cls");
            print();
        read:
            printf("\n---------\n翻开输入 1,标记输入 2,撤销标记输入 3:\n");
            scanf("%d", &op);
            if (op == 1) {
                printf("请输入要翻开的 x, y 坐标(从1开始到%d为止):", l);
                scanf("%d%d", &x, &y);
                while (judge(x) || judge(y)) {
                    printf("范围错误,请重新输入:\n");
                    scanf("%d%d", &x, &y);
                }
                printf("您将翻开 x = %d, y = %d 的格子。请输入数字 0 确认操作:", x,
                       y);
                scanf("%d", &op);
                if (op) {
                    goto read;
                }
                if (c[x][y] == 1) {
                    printf("已经被翻开过了\n");
                    continue;
                } else if (c[x][y] == 2) {
                    printf("已被标记为雷,请撤销标记后重试\n");
                    continue;
                }
                c[x][y] = 1;
                cnt1++;
                if (b[x][y] == 1) {
                    printf("BOON\n你踩到了雷,游戏结束\n");
                    boom = 0;
                    break;
                } else {
                    c[x][y] = 1;
                    if (a[x][y] == 0) {
                        dfs(x, y);
                    }
                }
            } else if (op == 2) {
                printf("请输入要标记的 x, y 坐标(从1开始到%d为止):", l);
                scanf("%d%d", &x, &y);
                while (judge(x) || judge(y)) {
                    printf("范围错误,请重新输入:\n");
                    scanf("%d%d", &x, &y);
                }
                printf(
                    "您将标记 x = %d, y = %d 的格子为雷。请输入数字 0 确认操作:",
                    x, y);
                scanf("%d", &op);
                if (op) {
                    goto read;
                }
                if (c[x][y] == 1) {
                    printf("已经翻开过并且不是雷,请重新输入\n");
                    continue;
                } else if (c[x][y] == 2) {
                    printf("已被标记为雷,请重新输入\n");
                    continue;
                }
                c[x][y] = 2;
                if (b[x][y] == 1) {
                    cnt++;
                }
            } else if (op == 3) {
                printf("请输入要取消标记的 x, y 坐标(从1开始到%d为止):", l);
                scanf("%d%d", &x, &y);
                while (judge(x) || judge(y)) {
                    printf("范围错误,请重新输入:\n");
                    scanf("%d%d", &x, &y);
                }
                printf("您将取消在 x = %d, y = %d 的格子上的雷标记。请输入数字 0 "
                       "确认操作:",
                       x, y);
                scanf("%d", &op);
                if (op) {
                    goto read;
                }
                if (c[x][y] != 2) {
                    printf("未被标记,请重新输入\n");
                    continue;
                }
                c[x][y] = 0;
                if (b[x][y] == 1) {
                    cnt--;
                }
            }
        }
        if (boom) {
            printf("恭喜你胜利!\n");
        }
        system("pause");
        system("cls");
        printf("终局:\n");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                FOREGROUND_INTENSITY | FOREGROUND_RED |
                                    FOREGROUND_GREEN | FOREGROUND_BLUE);
        printf("x\y ");
        for (int i = 1; i <= l; i++) {
            printf("%d ", i);
            if (i < 10) {
                printf(" ");
            }
        }
        printf("\n");
        for (int i = 1; i <= l; i++) {
            printf("\n%d", i);
            if (i >= 10) {
                printf(" ");
            } else {
                printf(" ");
            }
            for (int j = 1; j <= l; j++) {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                        FOREGROUND_INTENSITY | FOREGROUND_RED |
                                            FOREGROUND_GREEN | FOREGROUND_BLUE);
                if (!b[i][j]) {
                    if (a[i][j] < 2) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_GREEN);
                    } else if (a[i][j] < 4) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_BLUE);
                    } else if (a[i][j] < 5) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_GREEN |
                                                    FOREGROUND_BLUE);
                    } else {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                                FOREGROUND_INTENSITY |
                                                    FOREGROUND_RED |
                                                    FOREGROUND_BLUE);
                    }
                    printf("%d ", a[i][j]);
                } else {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                            FOREGROUND_INTENSITY | FOREGROUND_RED);
                    printf("* ");
                }
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                        FOREGROUND_INTENSITY | FOREGROUND_RED |
                                            FOREGROUND_GREEN | FOREGROUND_BLUE);
            }
            printf("\n");
        }
        printf("\n----------------\n数字为周围 8 格中雷的数量,* 为雷\n");
        Sleep(2000);
        system("pause");
        system("cls");
        printf("请问是否要重新开始游戏?是请输入 1,不是请输入 2:\n");
        scanf("%d", &op);
        if (op == 1) {
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(c, 0, sizeof(c));
            memset(d, 0, sizeof(d));
            cnt = 0;
            cnt1 = 0;
            boom = 1;
            startGame();
        } else {
            printf("游戏结束!\n");
        }
    }
    
  • 您确定您这是自己做的?

  • @ 2023-3-5 12:03:35

    您好,这是 python 社区,请您在适当的社区里发言,谢谢合作~

    • @ 2023-3-4 21:07:34

      代码块记得点一下,,,

      • @ 2023-3-5 19:24:46
        #include <bits/stdc++.h> 
        #include <windows.h> 
        using namespace std; 
        const int MAXN = 35; 
        int a[MAXN][MAXN], c[MAXN][MAXN], op, l, ls, x, y, cnt = 0, cnt1 = 0, hard[7] = {0, 10, 8, 6, 5, 4}; 
        int dx[4] = {-1, 0, 0, 1}; 
        int dy[4] = {0, -1, 1, 0}; 
        bool b[MAXN][MAXN], d[MAXN][MAXN], boom = 1; 
        int main(); 
        void init(); 
        int rand1(int);
         int r(int); 
        void dfs(int, int); 
        void print(); 
        bool judge(int);
         void startGame(); 
        void play(); int rand1(int num){ 
            return 1LL \* rand() % num + 1; 
        }
        int r(int num){ 
            return 1LL \* rand1(num) % num \* rand1(num) % num + 1; 
        }
        void dfs(int xa, int ya){ 
            if(xa < 1 || ya < 1 || xa > l || ya > l || b[xa][ya]){ 
                return; 
            } 
            c[xa][ya] = 1; 
            d[xa][ya] = 1; 
            if(a[xa][ya]){ 
                return; 
            } 
            for(int i = 0;i < 4;i++){
                 if(!d[xa + dx[i]][ya + dy[i]]){ 
                     dfs(xa + dx[i], ya + dy[i]); 
                 } 
            } 
        }
        

        前面大概就是这样,后面我都不想改了

      • @ 2023-3-6 20:19:48

        @ 您至于这么累吗,休息休息吧,我帮您继续完成

        其实不用这么麻烦的兄弟

    • @ 2023-3-4 20:05:15

      这是什么???

      • @ 2023-3-4 20:04:41

        呃呃呃.....................................................................................

        • 1