C语言扫雷小游戏

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

cs 复制代码
#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之间。
  • 这个版本的游戏没有实现撤销功能或者标记地雷功能,这些可以作为进一步的扩展。
相关推荐
lly2024063 分钟前
Docker 安装 Node.js
开发语言
明天会有多晴朗9 分钟前
C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
c语言·开发语言·算法
泽虞13 分钟前
《Qt应用开发》笔记p3
linux·开发语言·数据库·c++·笔记·qt·面试
晓风残月淡14 分钟前
JVM字节码与类的加载(一):类的加载过程详解
开发语言·jvm·python
XXYBMOOO17 分钟前
如何自定义 Qt 日志处理并记录日志到文件
开发语言·数据库·qt
玖釉-19 分钟前
三维模型数据结构与存储方式解析
数据结构·算法·图形渲染
知南x20 分钟前
【QT界面设计学习篇】qt快速开发技巧
开发语言·qt
hqyjzsb23 分钟前
2025 年项目管理转型白皮书:AI 驱动下的能力重构与跨域突破
开发语言·人工智能·重构·产品经理·编程语言·caie
奶茶树36 分钟前
【C++】12.多态(超详解)
开发语言·c++
草莓熊Lotso37 分钟前
《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置
开发语言·c++·算法