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之间。
  • 这个版本的游戏没有实现撤销功能或者标记地雷功能,这些可以作为进一步的扩展。
相关推荐
马浩同学26 分钟前
【GD32】从零开始学GD32单片机 | DAC数模转换器 + 三角波输出例程
c语言·单片机·嵌入式硬件·mcu
我要学编程(ಥ_ಥ)29 分钟前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
埃菲尔铁塔_CV算法31 分钟前
FTT变换Matlab代码解释及应用场景
算法
一个没有本领的人36 分钟前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
一只自律的鸡1 小时前
C项目 天天酷跑(下篇)
c语言·开发语言
源码哥_博纳软云1 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
沐泽Mu1 小时前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习
小板凳-BGM1 小时前
C# 第二阶段 modbus
开发语言·ui·c#
许野平1 小时前
Rust: enum 和 i32 的区别和互换
python·算法·rust·enum·i32
问道飞鱼1 小时前
【Python知识】Python进阶-什么是装饰器?
开发语言·python·装饰器