用C语言实现扫雷游戏:二维数组初探

什么是扫雷游戏?

扫雷游戏是一种经典的单人电脑游戏。玩家的目标是清除一个包含隐藏“地雷”的方格矩阵,而不触发任何地雷。玩家点击方格来揭示它下面的内容:可能是一个数字(表示周围地雷的数量)或一个地雷。

二维数组简介

在C语言中,数组是用来存储相同数据类型的集合。二维数组是数组的一种特殊形式,它可以用来表示矩阵或表格形式的数据。这正好符合我们对扫雷游戏的需求:一个二维网格。

一个简单的二维数组声明如下:

int grid[10][10];

这表示一个10x10的整数矩阵,其中每个元素都可以通过`grid[row][col]`来访问。

设计扫雷游戏

我们将使用一个二维数组来表示扫雷游戏的网格。每个数组元素可以表示三种情况之一:
1. 一个隐藏的空方格。
2. 一个显示的数字方格,表示附近有多少地雷。
3. 一个地雷。

1. 初始化网格
首先,我们需要初始化网格,并随机布置地雷。


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

#define SIZE 10
#define MINES 10

void initializeGrid(char grid[SIZE][SIZE], int mines[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            grid[i][j] = '-';  // '-' 表示未揭示的方格
            mines[i][j] = 0;   // 0 表示该位置没有地雷
        }
    }
}
 

2. 随机布置地雷
我们可以用随机数生成器来随机布置地雷。


void placeMines(int mines[SIZE][SIZE]) {
    srand(time(NULL));
    int placed = 0;
    
    while (placed < MINES) {
        int row = rand() % SIZE;
        int col = rand() % SIZE;
        
        if (mines[row][col] == 0) {  // 该位置没有地雷
            mines[row][col] = 1;
            placed++;
        }
    }
}
 

3. 计算周围地雷的数量
为了让游戏更加有趣,我们需要计算每个非雷方格周围有多少地雷。


int countAdjacentMines(int row, int col, int mines[SIZE][SIZE]) {
    int count = 0;
    for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
            int r = row + i;
            int c = col + j;
            if (r >= 0 && r < SIZE && c >= 0 && c < SIZE) {
                count += mines[r][c];
            }
        }
    }
    return count;
}
 

4. 显示网格
为了让玩家看到当前的游戏状态,我们需要一个函数来显示网格。


void displayGrid(char grid[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%c ", grid[i][j]);
        }
        printf("\n");
    }
}
 

5. 处理玩家的选择
当玩家选择一个方格时,游戏会根据该位置是否有地雷做出相应的反应。


void revealSquare(char grid[SIZE][SIZE], int mines[SIZE][SIZE], int row, int col) {
    if (mines[row][col] == 1) {
        printf("Boom! You hit a mine.\n");
        grid[row][col] = '*';  // '*' 表示地雷
    } else {
        int adjacentMines = countAdjacentMines(row, col, mines);
        grid[row][col] = '0' + adjacentMines;  // 显示周围地雷数
    }
}
 

6. 主循环
最后,我们将这些部分组合在一起,形成游戏的主循环。


int main() {
    char grid[SIZE][SIZE];
    int mines[SIZE][SIZE];
    initializeGrid(grid, mines);
    placeMines(mines);
    
    int gameOver = 0;
    while (!gameOver) {
        int row, col;
        displayGrid(grid);
        printf("Enter row and column: ");
        scanf("%d%d", &row, &col);
        revealSquare(grid, mines, row, col);
        
        if (grid[row][col] == '*') {
            gameOver = 1;
            printf("Game Over!\n");
        }
    }
    return 0;
}
 

总结

通过这个简单的扫雷游戏,我们实践了C语言中的二维数组操作,并学会了如何通过编程实现一个基础的游戏。虽然这个版本的扫雷游戏非常简单,但它为更复杂的游戏奠定了基础。你可以尝试添加更多功能,例如防止玩家踩到地雷后结束游戏,或者让玩家标记疑似地雷的位置。

希望你在实现这个项目的过程中学到了不少!如果你有任何问题或改进建议,欢迎留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值