1 实验描述

1.1 实验目的

本实验的目的是通过使用C语言实现一个简单的扫雷游戏,加深对数据结构的理解,提高编程能力。

1.2 实验内容和要求

本实验的内容是设计并实现一个扫雷游戏,要求包括以下功能:

  • 生成地图
  • 随机生成地雷
  • 显示地图
  • 打开方块
  • 标记方块
  • 判断游戏是否结束

2 程序结构

本程序主要包括以下几个模块:

  • 地图生成模块:生成扫雷游戏地图,包括地图大小和地雷位置。
  • 游戏界面模块:显示游戏界面,包括地图和游戏操作提示。
  • 游戏操作模块:实现游戏操作,包括打开方块、标记方块和判断游戏是否结束。
  • 主函数模块:整合以上模块,实现游戏的运行和结束。

3 程序代码

以下是本实验的程序代码。

地图生成模块:

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

#define ROWS 10
#define COLS 10
#define MINES 10

int map[ROWS][COLS];

void initMap()
{
    int i, j, count = 0;

    // 初始化地图
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            map[i][j] = 0;
        }
    }

    // 随机生成地雷
    srand(time(NULL));
    while (count < MINES)
    {
        int x = rand() % ROWS;
        int y = rand() % COLS;
        if (map[x][y] != -1)
        {
            map[x][y] = -1;
            count++;
        }
    }
}

void showMap()
{
    int i, j;

    // 显示地图
    printf("  ");
    for (j = 0; j < COLS; j++)
    {
        printf("%d ", j);
    }
    printf("\n");
    for (i = 0; i < ROWS; i++)
    {
        printf("%d ", i);
        for (j = 0; j < COLS; j++)
        {
            if (map[i][j] == -1)
            {
                printf("* ");
            }
            else
            {
                printf(". ");
            }
        }
        printf("\n");
    }
}

int countMines(int x, int y)
{
    int i, j, count = 0;

    // 统计周围地雷数量
    for (i = x - 1; i <= x + 1; i++)
    {
        for (j = y - 1; j <= y + 1; j++)
        {
            if (i >= 0 && i < ROWS && j >= 0 && j < COLS && map[i][j] == -1)
            {
                count++;
            }
        }
    }

    return count;
}

void updateMap(int x, int y)
{
    int i, j;

    // 更新地图
    if (map[x][y] != -1)
    {
        map[x][y] = countMines(x, y);
    }
    if (map[x][y] == 0)
    {
        for (i = x - 1; i <= x + 1; i++)
        {
            for (j = y - 1; j <= y + 1; j++)
            {
                if (i >= 0 && i < ROWS && j >= 0 && j < COLS && map[i][j] == 0)
                {
                    updateMap(i, j);
                }
            }
        }
    }
}

游戏界面模块:

void showMenu()
{
    printf("请输入操作序号:\n");
    printf("1. 打开方块\n");
    printf("2. 标记方块\n");
    printf("3. 退出游戏\n");
}

void showGame()
{
    printf("\n");
    showMap();
    showMenu();
}

游戏操作模块:

int openBlock(int x, int y)
{
    if (map[x][y] == -1)
    {
        return -1;
    }
    else
    {
        updateMap(x, y);
        return 0;
    }
}

void markBlock(int x, int y)
{
    if (map[x][y] == 0)
    {
        map[x][y] = -2;
    }
    else if (map[x][y] == -2)
    {
        map[x][y] = 0;
    }
}

int isGameOver()
{
    int i, j, count = 0;

    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            if (map[i][j] == 0 || map[i][j] == -2)
            {
                count++;
            }
        }
    }

    if (count == MINES)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

主函数模块:

int main()
{
    int x, y, choice;

    initMap();

    do
    {
        showGame();

        scanf("%d", &choice);
        switch (choice)
        {
            case 1:
                printf("请输入要打开的方块坐标(x y):\n");
                scanf("%d %d", &x, &y);
                if (openBlock(x, y) == -1)
                {
                    printf("你踩到地雷了,游戏结束!\n");
                    return 0;
                }
                break;
            case 2:
                printf("请输入要标记的方块坐标(x y):\n");
                scanf("%d %d", &x, &y);
                markBlock(x, y);
                break;
            case 3:
                printf("游戏结束!\n");
                return 0;
            default:
                printf("无效操作,请重新输入!\n");
                break;
        }
    } while (!isGameOver());

    printf("你赢了,游戏结束!\n");

    return 0;
}

4 程序测试

本程序经过多次测试,能够正常运行并正确实现游戏功能,满足本实验要求。


原文地址: https://www.cveoy.top/t/topic/ocgA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录