1. 首页
  2. AI V2.0
  3. 公告
  1. 登录
  2. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文

2025tyoi1471

UID: 15377, 注册于 2025-7-3 15:43:36, 最后登录于 2026-6-3 16:43:14, 最后活动于 2026-5-29 22:05:15.

解决了 69 道题目,RP: 262.42 (No. 77)

♂
  • 个人简介

    本人蒟蒻,啥也不会

    扫雷(小游戏)

    //记得加上-std=c++11
    #include <windows.h>
    #include <iostream>
    #include <vector>
    #include <string>
    #include <iomanip>
    #include <cstdlib>
    #include <ctime>
    #include <conio.h>
    #include <fstream>
    
    #define FG_BLACK        0
    #define FG_BLUE         FOREGROUND_BLUE
    #define FG_GREEN        FOREGROUND_GREEN
    #define FG_RED          FOREGROUND_RED
    #define FG_CYAN         (FOREGROUND_BLUE | FOREGROUND_GREEN)
    #define FG_MAGENTA      (FOREGROUND_RED | FOREGROUND_BLUE)
    #define FG_YELLOW       (FOREGROUND_RED | FOREGROUND_GREEN)
    #define FG_WHITE        (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
    #define FG_INTENSITY    FOREGROUND_INTENSITY
    
    #define BG_BLACK        0
    #define BG_BLUE         BACKGROUND_BLUE
    #define BG_GREEN        BACKGROUND_GREEN
    #define BG_RED          BACKGROUND_RED
    #define BG_CYAN         (BACKGROUND_GREEN | BACKGROUND_BLUE)
    #define BG_MAGENTA      (BACKGROUND_RED | BACKGROUND_BLUE)
    #define BG_YELLOW       (BACKGROUND_RED | BACKGROUND_GREEN)
    #define BG_WHITE        (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE)
    #define BG_INTENSITY    BACKGROUND_INTENSITY
    
    #define COLOR_UNOPEN    (FG_BLACK | BG_GRAY)
    #define COLOR_FLAG      (FG_WHITE | FG_INTENSITY | BG_RED)
    #define COLOR_MINE      (FG_RED | FG_INTENSITY | BG_BLACK)
    #define COLOR_EMPTY     (FG_BLACK | BG_WHITE)
    #define COLOR_CURSOR_HIGHLIGHT (FG_BLACK | BG_YELLOW | BG_INTENSITY)
    
    #define BG_GRAY         (BACKGROUND_INTENSITY)
    
    enum GameState { PLAYING, WIN, LOSE };
    
    double totalScore = 0.0;
    
    struct Cell {
        bool isMine;
        bool isRevealed;
        bool isFlagged;
        int adjacentMines;
        Cell() : isMine(false), isRevealed(false), isFlagged(false), adjacentMines(0) {}
    };
    
    class Minesweeper {
    private:
        int width, height;
        int totalMines;
        int flagsPlaced;
        int revealedCount;
        bool firstMove;
        GameState state;
        std::vector<std::vector<Cell>> board;
        int cursorRow, cursorCol;
        int difficultyIndex;
    
        HANDLE hConsole;
    
    public:
        Minesweeper() : hConsole(GetStdHandle(STD_OUTPUT_HANDLE)) {
            srand((unsigned)time(nullptr));
            hideCursor();
            cursorRow = cursorCol = 0;
            difficultyIndex = 0;
        }
    
        void hideCursor() {
            CONSOLE_CURSOR_INFO cursorInfo;
            GetConsoleCursorInfo(hConsole, &cursorInfo);
            cursorInfo.bVisible = FALSE;
            SetConsoleCursorInfo(hConsole, &cursorInfo);
        }
    
        void gotoxy(int x, int y) {
            COORD coord = { (SHORT)x, (SHORT)y };
            SetConsoleCursorPosition(hConsole, coord);
        }
    
        void setColor(int color) {
            SetConsoleTextAttribute(hConsole, color);
        }
    
        void initGame(int w, int h, int mines, int diffIdx) {
            width = w;
            height = h;
            totalMines = mines;
            difficultyIndex = diffIdx;
            flagsPlaced = 0;
            revealedCount = 0;
            firstMove = true;
            state = PLAYING;
            cursorRow = cursorCol = 0;
            board.assign(height, std::vector<Cell>(width));
        }
    
        void placeMines(int excludeRow, int excludeCol) {
            int cells = width * height;
            int minesToPlace = totalMines;
            if (minesToPlace > cells - 1) minesToPlace = cells - 1;
            while (minesToPlace > 0) {
                int idx = rand() % cells;
                int r = idx / width;
                int c = idx % width;
                if ((r == excludeRow && c == excludeCol) || board[r][c].isMine)
                    continue;
                board[r][c].isMine = true;
                minesToPlace--;
            }
            calculateAdjacentNumbers();
        }
    
        void calculateAdjacentNumbers() {
            for (int r = 0; r < height; ++r) {
                for (int c = 0; c < width; ++c) {
                    if (board[r][c].isMine) {
                        board[r][c].adjacentMines = -1;
                    } else {
                        int count = 0;
                        for (int dr = -1; dr <= 1; ++dr) {
                            for (int dc = -1; dc <= 1; ++dc) {
                                if (dr == 0 && dc == 0) continue;
                                int nr = r + dr;
                                int nc = c + dc;
                                if (nr >= 0 && nr < height && nc >= 0 && nc < width && board[nr][nc].isMine)
                                    count++;
                            }
                        }
                        board[r][c].adjacentMines = count;
                    }
                }
            }
        }
    
        void revealCell(int row, int col) {
            if (row < 0 || row >= height || col < 0 || col >= width) return;
            Cell& cell = board[row][col];
            if (cell.isRevealed || cell.isFlagged || state != PLAYING) return;
            
            if (firstMove) {
                firstMove = false;
                if (cell.isMine) {
                    for (int r = 0; r < height; ++r)
                        for (int c = 0; c < width; ++c)
                            board[r][c].isMine = false;
                    placeMines(row, col);
                } else {
                    bool hasMine = false;
                    for (int r = 0; r < height && !hasMine; ++r)
                        for (int c = 0; c < width && !hasMine; ++c)
                            if (board[r][c].isMine) hasMine = true;
                    if (!hasMine) placeMines(row, col);
                }
            }
            
            Cell& current = board[row][col];
            if (current.isMine) {
                state = LOSE;
                revealAllMines();
                return;
            }
            
            current.isRevealed = true;
            revealedCount++;
            
            if (current.adjacentMines == 0) {
                for (int dr = -1; dr <= 1; ++dr) {
                    for (int dc = -1; dc <= 1; ++dc) {
                        if (dr == 0 && dc == 0) continue;
                        int nr = row + dr;
                        int nc = col + dc;
                        if (nr >= 0 && nr < height && nc >= 0 && nc < width) {
                            if (!board[nr][nc].isRevealed && !board[nr][nc].isFlagged) {
                                revealCell(nr, nc);
                            }
                        }
                    }
                }
            }
            checkWinCondition();
        }
    
        void toggleFlag(int row, int col) {
            if (row < 0 || row >= height || col < 0 || col >= width) return;
            if (state != PLAYING) return;
            Cell& cell = board[row][col];
            if (cell.isRevealed) return;
            cell.isFlagged = !cell.isFlagged;
            flagsPlaced += cell.isFlagged ? 1 : -1;
        }
    
        void chordReveal(int row, int col) {
            if (row < 0 || row >= height || col < 0 || col >= width) return;
            if (state != PLAYING) return;
            Cell& cell = board[row][col];
            if (!cell.isRevealed) return;
            int flagCount = 0;
            for (int dr = -1; dr <= 1; ++dr) {
                for (int dc = -1; dc <= 1; ++dc) {
                    if (dr == 0 && dc == 0) continue;
                    int nr = row + dr;
                    int nc = col + dc;
                    if (nr >= 0 && nr < height && nc >= 0 && nc < width && board[nr][nc].isFlagged)
                        flagCount++;
                }
            }
            if (flagCount == cell.adjacentMines) {
                for (int dr = -1; dr <= 1; ++dr) {
                    for (int dc = -1; dc <= 1; ++dc) {
                        if (dr == 0 && dc == 0) continue;
                        int nr = row + dr;
                        int nc = col + dc;
                        if (nr >= 0 && nr < height && nc >= 0 && nc < width) {
                            if (!board[nr][nc].isRevealed && !board[nr][nc].isFlagged)
                                revealCell(nr, nc);
                        }
                    }
                }
            }
        }
    
        void revealAllMines() {
            for (int r = 0; r < height; ++r)
                for (int c = 0; c < width; ++c)
                    if (board[r][c].isMine)
                        board[r][c].isRevealed = true;
        }
    
        void checkWinCondition() {
            if (revealedCount == width * height - totalMines) {
                state = WIN;
                
                double add = (double)totalMines / width;
                totalScore += add;
                saveScore();
    
                for (int r = 0; r < height; ++r)
                    for (int c = 0; c < width; ++c)
                        if (board[r][c].isMine && !board[r][c].isFlagged) {
                            board[r][c].isFlagged = true;
                            flagsPlaced++;
                        }
            }
        }
    
        void moveCursor(int dr, int dc) {
            if (state != PLAYING) return;
            int nr = cursorRow + dr;
            int nc = cursorCol + dc;
            if (nr >= 0 && nr < height && nc >= 0 && nc < width) {
                cursorRow = nr;
                cursorCol = nc;
            }
        }
    
        int getCellColor(const Cell& cell) const {
            if (!cell.isRevealed) {
                return cell.isFlagged ? COLOR_FLAG : COLOR_UNOPEN;
            } else {
                if (cell.isMine) return COLOR_MINE;
                if (cell.adjacentMines == 0) return COLOR_EMPTY;
                int fg;
                switch(cell.adjacentMines) {
                    case 1: fg = FG_BLUE  | FG_INTENSITY; break;
                    case 2: fg = FG_GREEN | FG_INTENSITY; break;
                    case 3: fg = FG_RED   | FG_INTENSITY; break;
                    case 4: fg = FG_BLUE;                      break;
                    case 5: fg = FG_RED;                       break;
                    case 6: fg = FG_CYAN  | FG_INTENSITY; break;
                    case 7: fg = FG_MAGENTA | FG_INTENSITY; break;
                    case 8: fg = FG_BLACK | FG_INTENSITY; break;
                    default: fg = FG_BLACK;
                }
                return fg | BG_WHITE;
            }
        }
    
        void draw() {
            gotoxy(0, 0);
            
            setColor(FG_WHITE | BG_BLACK);
            std::cout << "========== 扫雷 ===========" << std::endl;
            
            int remainingMines = totalMines - flagsPlaced;
            std::cout << "剩余雷数: ";
            setColor(FG_RED | FG_INTENSITY | BG_BLACK);
            std::cout << remainingMines << "  ";
            
            if (state == PLAYING) {
                setColor(FG_GREEN | FG_INTENSITY | BG_BLACK);
                std::cout << "[游戏中]";
            } else if (state == WIN) {
                setColor(FG_CYAN | FG_INTENSITY | BG_BLACK);
                std::cout << "[你赢了!]";
            } else if (state == LOSE) {
                setColor(FG_RED | FG_INTENSITY | BG_BLACK);
                std::cout << "[游戏结束]";
            }
            setColor(FG_WHITE | BG_BLACK);
            std::cout << "    光标: (" << cursorRow << "," << cursorCol << ")" << std::endl;
            
            std::cout << "  +";
            for (int c = 0; c < width; ++c) std::cout << "--";
            std::cout << "+" << std::endl;
            
            for (int r = 0; r < height; ++r) {
                std::cout << "  |";
                
                for (int c = 0; c < width; ++c) {
                    const Cell& cell = board[r][c];
                    bool isCursor = (r == cursorRow && c == cursorCol);
                    
                    char content;
                    if (!cell.isRevealed) {
                        content = cell.isFlagged ? 'F' : '#';
                    } else {
                        if (cell.isMine) content = '*';
                        else if (cell.adjacentMines == 0) content = ' ';
                        else content = '0' + cell.adjacentMines;
                    }
                    
                    int color = getCellColor(cell);
                    if (isCursor) {
                        int fg = color & 0x0F;
                        color = fg | COLOR_CURSOR_HIGHLIGHT;
                    }
                    
                    setColor(color);
                    if (isCursor) std::cout << '>';
                    else std::cout << ' ';
                    std::cout << content;
                }
                
                setColor(FG_WHITE | BG_BLACK);
                std::cout << "|" << std::endl;
            }
            
            std::cout << "  +";
            for (int c = 0; c < width; ++c) std::cout << "--";
            std::cout << "+" << std::endl;
            
            setColor(FG_WHITE | BG_BLACK);
            std::cout << "\n操作:";
            setColor(FG_CYAN | FG_INTENSITY | BG_BLACK);   std::cout << " W/A/S/D ";
            setColor(FG_WHITE | BG_BLACK);                 std::cout << "移动  ";
            setColor(FG_CYAN | FG_INTENSITY | BG_BLACK);   std::cout << "空格";
            setColor(FG_WHITE | BG_BLACK);                 std::cout << "翻开  ";
            setColor(FG_CYAN | FG_INTENSITY | BG_BLACK);   std::cout << "F";
            setColor(FG_WHITE | BG_BLACK);                 std::cout << "插旗  ";
            setColor(FG_CYAN | FG_INTENSITY | BG_BLACK);   std::cout << "C";
            setColor(FG_WHITE | BG_BLACK);                 std::cout << "快速翻开  ";
            setColor(FG_CYAN | FG_INTENSITY | BG_BLACK);   std::cout << "Q";
            setColor(FG_WHITE | BG_BLACK);                 std::cout << "返回菜单" << std::endl;
        }
    
        void runCursorMode() {
            while (state == PLAYING) {
                draw();
                int ch = _getch();
                if (ch >= 'A' && ch <= 'Z') ch += 32;
                switch (ch) {
                    case 'w': moveCursor(-1, 0); break;
                    case 's': moveCursor(1, 0); break;
                    case 'a': moveCursor(0, -1); break;
                    case 'd': moveCursor(0, 1); break;
                    case ' ': revealCell(cursorRow, cursorCol); break;
                    case 'f': toggleFlag(cursorRow, cursorCol); break;
                    case 'c': chordReveal(cursorRow, cursorCol); break;
                    case 'q': return;
                    default: break;
                }
            }
            draw();
            std::cout << "\n游戏结束,按任意键返回菜单...";
            _getch();
        }
    
        void clearScreen() {
            system("cls");
        }
    
        void saveScore() {
            std::ofstream file("score.txt");
            if (file.is_open()) {
                file << totalScore << std::endl;
                file.close();
            }
        }
    
        void loadScore() {
            std::ifstream file("score.txt");
            if (file.is_open()) {
                file >> totalScore;
                file.close();
            }
        }
    };
    
    void loadScore() {
        std::ifstream file("score.txt");
        if (file.is_open()) {
            file >> totalScore;
            file.close();
        }
    }
    
    void showCustomMenu() {
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, FG_WHITE | BG_BLACK);
        system("cls");
    
        std::cout << "========================================" << std::endl;
        std::cout << "                 扫 雷                 " << std::endl;
        std::cout << "========================================" << std::endl;
        std::cout << "  总积分:";
        SetConsoleTextAttribute(hConsole, FG_CYAN | FG_INTENSITY | BG_BLACK);
        std::cout << std::fixed << std::setprecision(2) << totalScore << std::endl << std::endl;
        SetConsoleTextAttribute(hConsole, FG_WHITE | BG_BLACK);    
        std::cout << "  1. 开始游戏" << std::endl;
        std::cout << "  0. 退出游戏" << std::endl;
        std::cout << "----------------------------------------" << std::endl;
        std::cout << "  请输入选项 (0/1): ";
    }
    
    int main() {
        SetConsoleTitle("扫雷");
        loadScore();
    
        int choice;
        bool exitProgram = false;
        
        while (!exitProgram) {
            showCustomMenu();
            std::cin >> choice;
            std::cin.ignore();
    
            if (choice == 0) {
                exitProgram = true;
                continue;
            }
            if (choice != 1) {
                continue;
            }
    
            int size, mines;
            system("cls");
            std::cout << "========= 扫雷 =========\n";
            std::cout << "请输入棋盘边长(5~50): ";
            std::cin >> size;
            if (size < 5) size = 5;
            if (size > 50) size = 50;
    
            std::cout << "请输入地雷数量(1~" << size*size-1 << "): ";
            std::cin >> mines;
            if (mines < 1) mines = 1;
            if (mines >= size*size) mines = size*size - 1;
    
            Minesweeper game;
            game.clearScreen();
            game.initGame(size, size, mines, -1);
            game.runCursorMode();
        }
        
        system("cls");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FG_WHITE | BG_BLACK);
        std::cout << "感谢游玩,再见!" << std::endl;
        return 0;
    }
    
  • 最近活动

    • 2026年春季班Class10-区间型动态规划2-区间合并 作业
    • 2026年春季班Class10-区间型动态规划1-区间分割 作业
    • 2026年春季班Class9-背包动态规划2 作业
    • 2026年春季班Class8-背包动态规划(背包DP) 作业
    • TYOI2026年普及组模拟赛### OI
    • TYOI2026年普及组模拟赛#10 OI
    • TYOI2026年普及组模拟赛#12 OI
    • TYOI2026年普及组模拟赛#09 OI
    • TYOI2026年普及组模拟赛#08 OI
    • 第五届铁一校园程序设计竞赛(TYCPC‘5th)重现赛 XCPC
    • 2026年春季班Class7-最长公共子序列 作业
    • TYOI2026年普及组模拟赛#11 OI
    • 2026年春季班Class6-线性动规练习题 作业
    • TYOI2026年普及组模拟赛#07 OI
    • 2026年春季班Class5-最长不下降子序列(LIS) 作业
    • TYOI2026年普及组模拟赛#06 OI
    • TYOI2026年普及组模拟赛#05 OI
    • 2026年小六春季班Class3-单调队列 作业
    • TYOI2026年普及组模拟赛#04 OI
    • 2026年小六春季班Class2-优先队列 作业
    • 2026年小六春季班Class2-哈希表 作业
    • TYOI2026年普及组模拟赛#03 OI
    • 2026年小六春季班Class1-链表与List 作业
    • TYOI2026年普及组模拟赛#02 OI
    • 2026年春季班Class4-一维动规 作业
    • TYOI冬令营(2026)阶段测试3 IOI
    • 2025铁一集团新苗秋冬令营5——二分搜索2(最小值最大) 作业
    • 2025铁一集团新苗秋冬令营4——二分搜索1(最大值最小) 作业
    • TYOI冬令营(2026)阶段测试2 IOI
    • 2025铁一集团新苗秋冬令营3---《广度优先搜索2》 作业
    • 2025铁一集团新苗秋冬令营2---《广度优先搜索1》 作业
    • 2025铁一集团新苗秋冬令营1---《队列》 作业
    • 2025铁一集团新苗秋季班作业11---《深度优先搜索算法2》 作业
    • 2025铁一集团新苗秋季班作业10----《深度优先搜索算法1》 作业
    • 2025铁一集团新苗秋季班作业9----《递归算法》 作业
    • 2025铁一集团新苗秋季班作业8----《栈结构》 作业
    • 2025OiClass入门组周赛计划#03 OI
    • 2025铁一集团新苗秋季班作业7----《前缀和&差分前缀和》 作业
    • 2025铁一集团新苗秋季班作业7----贪心+递推 作业
    • 2025oiClass入门组周赛计划#01 OI
    • 2025铁一集团新苗秋季班作业5----《枚举算法》 作业
    • 2025铁一集团新苗秋季班作业4----《模拟算法》 作业
    • 2025铁一集团新苗秋季班作业6----《排序和结构体排序》 作业
    • 2025铁一集团新苗秋季班作业3------《位运算》 作业
    • 2025铁一集团新苗秋季班作业2----《进制转换》 作业
    • 2025 CSP-J1初赛模拟测试9 OI
    • 2025 CSP-J1初赛模拟测试2 OI
    • 第六届oiclass信息学夏令营---巩固练习2 IOI(严格)
    • 第六届oiclass信息学夏令营---巩固练习1 IOI(严格)
    • 第六届oiclass信息学夏令营-正式线上选拔赛3 OI
    • 第六届oiclass信息学夏令营-正式线上选拔赛2 OI
    • 第六届oiclass信息学夏令营-正式线上选拔赛1 IOI(严格)
    • 第六届oiclass信息学夏令营-模拟测试2 IOI(严格)
    • 第六届oiclass信息学夏令营Class15-函数 作业
    • 第六届oiclass信息学夏令营Class14-字符串 作业
    • 第六届oiclass信息学夏令营Class13-字符和字符数组 作业
    • 第六届oiclass信息学夏令营Class11-二维数组 作业
    • 第六届oiclass信息学夏令营-模拟测试1 IOI(严格)
    • 第六届oiclass信息学夏令营Class10-一维数组进阶 作业
    • 第六届oiclass信息学夏令营Class9-一维数组的定义和基础应用 作业
    • 第六届oiclass信息学夏令营Class8-循环嵌套 作业
    • 第六届oiclass信息学夏令营Class7-循环结构-while语句 作业
    • 第六届oiclass信息学夏令营Class6-循环结构-for语句进阶 作业
    • 20250807铁外1夏令营作业-循环结构2 作业
    • 第六届oiclass信息学夏令营Class5-循环结构-for语句基础 作业
    • 第六届oiclass信息学夏令营Class4作业-多分支结构-if语句 作业
    • 第六届oiclass信息学夏令营Class3作业-if语句 作业
    • 第六届oiclass信息学夏令营Class2作业-表达式 作业
    • 第六届oiclass信息学夏令营Class1作业-程序结构 作业
    • 2025铁一集团新苗秋季班作业1-二维数组和二维字符数组 作业
    • 2024小六秋季班第七课《前缀和&差分前缀和》 作业
    • 2024小六秋季班第三课《排序和结构体排序》 作业
  • Stat

  • 能力评级

879
已递交
69
已通过
0
题解被赞

状态

  • 评测队列
  • 服务状态

开发

  • 开源

支持

  • 帮助
  • 联系我们

关于

  • 关于
  • 隐私
  • 服务条款
  • 版权申诉
  1. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
  2. 兼容模式
  3. 主题
    1. 亮色
    2. 暗色
  1. 粤ICP备2024335011号
  2. Worker 0, 25ms
  3. Powered by Hydro v5.0.1 Community
关闭

登录

使用您的 oiClass 通用账户

忘记密码或者用户名?