自学内容网 自学内容网

C语言扫雷小游戏

这个游戏会在控制台中运行,并且包含基本的功能,如生成雷区、显示雷区状态、用户输入和判断是否踩到雷。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10
#define MINE_COUNT 15

void initializeBoard(char board[SIZE][SIZE], char visibleBoard[SIZE][SIZE]);
void placeMines(char board[SIZE][SIZE], int mineCount);
void printBoard(char board[SIZE][SIZE], char visibleBoard[SIZE][SIZE]);
int countAdjacentMines(char board[SIZE][SIZE], int row, int col);
void revealCell(char board[SIZE][SIZE], char visibleBoard[SIZE][SIZE], int row, int col);
int checkWin(char visibleBoard[SIZE][SIZE]);

int main() {
    char board[SIZE][SIZE];
    char visibleBoard[SIZE][SIZE];
    int row, col;

    srand(time(NULL));
    initializeBoard(board, visibleBoard);
    placeMines(board, MINE_COUNT);

    do {
        printBoard(board, visibleBoard);
        printf("\\n请输入坐标(行 列): ");
        scanf("%d %d", &row, &col);

        if (board[row][col] == '*') {
            printf("很遗憾,你踩到了地雷!\\n");
            return 0;
        }

        revealCell(board, visibleBoard, row, col);
    } while (!checkWin(visibleBoard));

    printBoard(board, visibleBoard);
    printf("恭喜你,你赢了!\\n");

    return 0;
}

void initializeBoard(char board[SIZE][SIZE], char visibleBoard[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            board[i][j] = ' ';
            visibleBoard[i][j] = '#';
        }
    }
}

void placeMines(char board[SIZE][SIZE], int mineCount) {
    int minesPlaced = 0;
    while (minesPlaced < mineCount) {
        int row = rand() % SIZE;
        int col = rand() % SIZE;

        if (board[row][col] != '*') {
            board[row][col] = '*';
            minesPlaced++;
        }
    }
}

void printBoard(char board[SIZE][SIZE], char visibleBoard[SIZE][SIZE]) {
    printf("  ");
    for (int i = 0; i < SIZE; i++) {
        printf("%2d ", i);
    }
    printf("\\n");

    for (int i = 0; i < SIZE; i++) {
        printf("%2d ", i);
        for (int j = 0; j < SIZE; j++) {
            printf("%2c ", visibleBoard[i][j]);
        }
        printf("\\n");
    }
}

int countAdjacentMines(char board[SIZE][SIZE], int row, int col) {
    int count = 0;
    for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
            if (i == 0 && j == 0) continue;
            int newRow = row + i;
            int newCol = col + j;
            if (newRow >= 0 && newRow < SIZE && newCol >= 0 && newCol < SIZE && board[newRow][newCol] == '*') {
                count++;
            }
        }
    }
    return count;
}

void revealCell(char board[SIZE][SIZE], char visibleBoard[SIZE][SIZE], int row, int col) {
    if (visibleBoard[row][col] != '#') return;

    int adjacentMines = countAdjacentMines(board, row, col);
    if (adjacentMines > 0) {
        visibleBoard[row][col] = '0' + adjacentMines;
    } else {
        visibleBoard[row][col] = '.';
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                int newRow = row + i;
                int newCol = col + j;
                if (newRow >= 0 && newRow < SIZE && newCol >= 0 && newCol < SIZE) {
                    revealCell(board, visibleBoard, newRow, newCol);
                }
            }
        }
    }
}

int checkWin(char visibleBoard[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            if (visibleBoard[i][j] == '#') return 0;
        }
    }
    return 1;
}

游戏说明:

  • 玩家需要输入要打开的格子的行和列坐标。
  • 如果玩家打开的位置有地雷,则游戏结束。
  • 如果打开的位置没有地雷,程序会自动显示周围地雷的数量或递归地打开周围所有没有地雷的格子。
  • 当所有非雷格子都被打开时,玩家胜利。

注意事项:

  • 本代码假设输入的坐标是有效的,即在0到9之间。
  • 这个版本的游戏没有实现撤销功能或者标记地雷功能,这些可以作为进一步的扩展。

 


原文地址:https://blog.csdn.net/lxsxjsj/article/details/143521133

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!