扫雷(c++98)

一、整体思路

  1. 游戏布局
    • 扫雷游戏有一个包含地雷和空白格(数字表示周围地雷数量)的棋盘。我们可以用二维数组来表示这个棋盘。
    • 例如,用char类型的二维数组,'*'表示地雷,数字字符'1' - '8'表示周围地雷的数量,'0'表示空白格。
  2. 游戏流程
    • 游戏开始时,初始化棋盘,随机在棋盘上布置一定数量的地雷。
    • 玩家输入坐标来翻开格子。如果翻开的是地雷,游戏结束;如果是空白格,需要显示周围地雷的数量,并根据情况自动翻开周围的空白格(递归操作)。
    • 游戏持续进行直到玩家翻开所有非地雷的格子。

二、代码实现

#include  
#include  
#include  
 
// 游戏棋盘的大小 
const int ROW = 9; 
const int COL = 9; 
// 地雷的数量 
const int MINE_NUM = 10; 
 
// 初始化棋盘 
void initBoard(char board[][COL], int row, int col) { 
    for (int i = 0; i < row; i++) { 
        for (int j = 0; j < col; j++) { 
            board[i][j]='0'; 
        } 
    } 

 
// 布置地雷 
void setMine(char board[][COL], int row, int col) { 
    int count = 0; 
    while (count < MINE_NUM) { 
        int x = rand() % row; 
        int y = rand() % col; 
        if (board[x][y]!= '*') { 
            board[x][y]='*'; 
            count++; 
        } 
    } 

 
// 计算周围地雷的数量 
int getMineCount(const char mineBoard[][COL], int x, int y, int row, int col) { 
    int count = 0; 
    for (int i = std::max(x - 1, 0); i <= std::min(x + 1, row - 1); i++) { 
        for (int j = std::max(y - 1, 0); j <= std::min(y + 1, col - 1); j++) { 
            if (mineBoard[i][j] == '*') { 
                count++; 
            } 
        } 
    } 
    return count; 

 
// 翻开格子并处理相关逻辑 
void openBoard(char showBoard[][COL], const char mineBoard[][COL], int x, int y, int row, int col) { 
    if (showBoard[x][y]!= '0') { 
        return; 
    } 
    int count = getMineCount(mineBoard, x, y, row, col); 
    if (count > 0) { 
        showBoard[x][y]=count + '0'; 
        return; 
    } 
    showBoard[x][y]='0'; 
    for (int i = std::max(x - 1, 0); i <= std::min(x + 1, row - 1); i++) { 
        for (int j = std::max(y - 1, 0); j <= std::min(y + 1, col - 1); j++) { 
            if (showBoard[i][j] == '0' && mineBoard[i][j]!= '*') { 
                openBoard(showBoard, mineBoard, i, j, row, col); 
            } 
        } 
    } 

 
// 打印棋盘 
void printBoard(char board[][COL], int row, int col) { 
    std::cout << "  "; 
    for (int i = 0; i < col; i++) { 
        std::cout << i << " "; 
    } 
    std::cout << std::endl; 
    for (int i = 0; i < row; i++) { 
        std::cout << i << " "; 
        for (int j = 0; j < col; j++) { 
            std::cout << board[i][j] << " "; 
        } 
        std::cout << std::endl; 
    } 

 
int main() { 
    char mineBoard[ROW][COL]; 
    char showBoard[ROW][COL]; 
    srand(static_cast(time(0))); 
 
    initBoard(mineBoard, ROW, COL); 
    initBoard(showBoard, ROW, COL); 
    setMine(mineBoard, ROW, COL); 
 
    int x, y; 
    while (true) { 
        printBoard(showBoard, ROW, COL); 
        std::cout << "请输入要翻开的坐标(行 列):"; 
        std::cin >> x >> y; 
        if (mineBoard[x][y] == '*') { 
            std::cout << "你踩到地雷了,游戏结束!" << std::endl; 
            break; 
        } 
        openBoard(showBoard, mineBoard, x, y, ROW, COL); 
        bool win = true; 
        for (int i = 0; i < ROW; i++) { 
            for (int j = 0; j < COL; j++) { 
                if (showBoard[i][j] == '0' && mineBoard[i][j]!= '*') { 
                    win = false; 
                    break; 
                } 
            } 
            if (!win) { 
                break; 
            } 
        } 
        if (win) { 
            std::cout << "恭喜你,你赢了!" << std::endl; 
            break; 
        } 
    } 
    return 0; 

三、代码解释

  1. initBoard函数
    • 这个函数用于初始化棋盘,将棋盘的每个格子初始化为'0',表示空白格。
  2. setMine函数
    • 它通过随机数来在棋盘上布置地雷。在布置时,会检查要布置的格子是否已经是地雷,以确保地雷数量正确。
  3. getMineCount函数
    • 用于计算给定坐标周围的地雷数量。通过遍历周围九宫格内的格子来统计地雷个数。
  4. openBoard函数
    • 当玩家翻开一个格子时调用这个函数。如果翻开的格子周围有地雷,就显示周围地雷的数量;如果周围没有地雷,会递归地翻开周围的空白格。
  5. printBoard函数
    • 用于打印棋盘,在游戏过程中让玩家看到当前棋盘的状态。
  6. main函数
    • 首先初始化两个棋盘(一个用于显示给玩家,一个用于存储地雷信息),然后布置地雷。在游戏循环中,玩家输入坐标,程序判断是否踩到地雷或者是否赢得游戏,直到游戏结束。

你可能感兴趣的:(c++,开发语言)