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之间。
  • 这个版本的游戏没有实现撤销功能或者标记地雷功能,这些可以作为进一步的扩展。
相关推荐
black0moonlight10 分钟前
ISAAC Gym 7. 使用箭头进行数据可视化
开发语言·python
时光の尘35 分钟前
C语言菜鸟入门·关键字·int的用法
c语言·开发语言·数据结构·c++·单片机·链表·c
sjsjs1135 分钟前
【数据结构-表达式解析】【hard】力扣224. 基本计算器
数据结构·算法·leetcode
C++忠实粉丝37 分钟前
计算机网络socket编程(6)_TCP实网络编程现 Command_server
网络·c++·网络协议·tcp/ip·计算机网络·算法
坊钰39 分钟前
【Java 数据结构】时间和空间复杂度
java·开发语言·数据结构·学习·算法
Edward-tan41 分钟前
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
c语言·开发语言·链表
武昌库里写JAVA1 小时前
一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍
c语言·开发语言·数据结构·算法·二维数组
苹果酱05671 小时前
windows安装redis, 修改自启动的redis服务的密码
java·开发语言·spring boot·mysql·中间件
禊月初三1 小时前
LeetCode 4.寻找两个中序数组的中位数
c++·算法·leetcode
学习使我飞升1 小时前
spf算法、三类LSA、区间防环路机制/规则、虚连接
服务器·网络·算法·智能路由器