【C语言】基于 DEV C++的简单扫雷游戏

目录

一、 代码

二、实训报告

三、答辩PPT


一、 代码

 这学期C语言大作业选题:基于 DEV C++的简单扫雷游戏,以下是dev c++适配代码。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROWS 9
#define COLS 9
#define MINE_COUNT 10

void InitBoard(char board[][COLS], int rows, int cols, char set);
void SetMine(char board[][COLS], int row, int col);
void PrintBoard(char board[][COLS], int row, int col);
int GetMineCount(char mine[][COLS], int x, int y);

int main()
{
    char mine[ROWS][COLS]; // 扫雷区域
    char show[ROWS][COLS]; // 显示区域

    int x = 0, y = 0; // 将变量声明移到函数的开头

    srand((unsigned int)time(NULL));
    InitBoard(mine, ROWS, COLS, '0'); // 初始化扫雷区域
    InitBoard(show, ROWS, COLS, '*'); // 初始化显示区域
    SetMine(mine, ROWS, COLS); // 布雷
    PrintBoard(show, ROWS, COLS); // 打印扫雷区域

    while (1)
    {
        printf("请输入要扫描的坐标(x,y):");
        scanf("%d,%d", &x, &y);

        if (mine[x][y] == '1') // 踩雷了,游戏结束
        {
            printf("Game Over!\n");
            show[x][y] = 'X';
            PrintBoard(show, ROWS, COLS);
            break;
        }
        else // 没有踩到雷,继续游戏
        {
            int count = GetMineCount(mine, x, y);
            show[x][y] = count + '0';
            PrintBoard(show, ROWS, COLS);

            if (count == 0) // 周围没有雷,自动扩展
            {
                int i, j; // 将变量声明移到函数的开头
                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 && show[i][j] == '*')
                        {
                            x = i;
                            y = j;
                            i = x + 1; // 跳出外层循环
                            break; // 跳出内层循环
                        }
                    }
                }
            }
        }
    }

    return 0;
}

// 初始化扫雷区域
void InitBoard(char board[][COLS], int rows, int cols, char set)
{
    int i, j; // 将变量声明移到函数的开头
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            board[i][j] = set;
        }
    }
}

// 布雷
void SetMine(char board[][COLS], int row, int col)
{
    int count = MINE_COUNT;
    while (count > 0)
    {
        int x = rand() % row;
        int y = rand() % col;

        if (board[x][y] == '0')
        {
            board[x][y] = '1';
            count--;
        }
    }
}

// 打印扫雷区域
void PrintBoard(char board[][COLS], int row, int col)
{
    printf("  ");
    int i; // 将变量声明移到函数的开头
    for (i = 0; i < col; i++)
    {
        printf("%d ", i);
    }
    printf("\n");

    int j; // 将变量声明移到函数的开头
    for (i = 0; i < row; i++)
    {
        printf("%d ", i);
        for (j = 0; j < col; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
}

// 获取指定坐标周围的雷数
int GetMineCount(char mine[][COLS], int x, int y)
{
    int count = 0;
    int i, j; // 将变量声明移到函数的开头
    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 && mine[i][j] == '1')
            {
                count++;
            }
        }
    }
    return count;
}

 

二、实训报告

 以下是扫雷实训报告样例:

目录

一、 任务需求

二、总体设计

2.1开发平台

2.2 总体思路

三、功能模块设计

3.1 扫雷游戏实现:

3.2功能实现:

3.3游戏流程:

四、系统测试

五、系统改编说明

、对本门课程教学的改进建议

一、任务需求

开发一个命令行扫雷游戏,实现基本的扫雷功能。具体要求包括:

游戏板初始化:创建并显示一个初始状态为覆盖状态的游戏板。

地雷布置:在游戏板上随机布置指定数量的地雷。

游戏交互:允许用户通过输入坐标来揭开格子,根据揭开的结果更新游戏板。

游戏结束判断:当用户揭开地雷格子时,游戏结束。

自动扩展:当用户揭开没有地雷且周围没有地雷的区域时,自动揭开周围的区域。

用户界面:游戏通过命令行界面进行展示和交互。

扫雷游戏作为经典的单人电脑游戏,在计算机科学教学和编程练习中具有重要意义。本论文详细介绍了基于 DEV C++ 的简单扫雷游戏的设计、实现和优化过程。通过使用 DEV C++ 开发环境,我设计一款功能完备、界面友好的扫雷游戏,并通过测试验证了其稳定性和可玩性。论文将深入探讨游戏规则、技术背景、程序设计、功能实现、界面设计、测试验证、总结展望等方面。

、总体设计

2.1开平台

本次扫雷游戏在DEV-C++轻量级编译器下实现,并且通过C语言编写该程序。

2.2 总体思路

游戏规则

扫雷是一款经典的单人益智游戏,玩家需要在一个矩形网格中找出所有的地雷,而不触发任何一个地雷。游戏开始时,所有方格都是隐藏的。玩家可以选择一个方格进行扫描,如果方格中有地雷,则游戏结束;如果方格周围没有地雷,则显示周围有多少个地雷。玩家可以通过逻辑推理和猜测来揭示地雷的位置,最终标记出所有地雷并胜利。

技术背景

本程序使用C语言编写,利用二维数组来表示游戏板。程序利用随机数生成器布置地雷,并提供函数来初始化游戏板、布置地雷、打印游戏板、计算周围地雷数以及处理玩家输入。整体设计遵循模块化和结构化编程原则,确保代码清晰、易读和易于维护。

程序设计

初始化游戏板:

使用InitBoard函数初始化两个9x9的二维数组,一个用于存储地雷分布(mine数组),一个用于显示玩家看到的网格(show数组)。

布置地雷:使用SetMine函数随机在mine数组中布置10个地雷。

打印游戏板:PrintBoard函数负责打印show数组,显示给玩家当前的游戏状态。

计算周围地雷数:

GetMineCount函数根据指定的坐标计算周围8个方格内地雷的数量。

处理玩家输入:

main函数循环接收玩家输入的坐标,并根据玩家的选择更新show数组。如果玩家扫描到地雷,游戏结束;否则,显示周围地雷数量或自动展开周围无地雷的区域。

功能实现

初始化功能:

InitBoard函数将所有的方格初始化为指定字符,初始化两个游戏板。

布置地雷功能:

SetMine函数利用随机数生成器在mine数组中布置地雷,确保地雷的位置随机且不重复。

显示游戏板功能:

PrintBoard函数按照指定格式打印当前的游戏状态,包括列和行的编号以及每个方格的内容。

计算周围地雷数功能:

GetMineCount函数根据传入的坐标计算周围8个方格内地雷的数量,并返回计数结果。

处理玩家输入功能:

main函数循环接收玩家输入的坐标,根据坐标更新show数组,并根据游戏规则判断是否结束游戏或展开周围区域。

界面设计

游戏界面基于控制台文本界面,简洁直观:

初始化界面:

游戏开始时显示一个9x9的网格,所有方格均为隐藏状态。

输入提示:

程序提示玩家输入要扫描的坐标,格式为(x,y)。

结果显示:

根据玩家的输入更新显示网格,显示方格周围地雷数量或地雷位置。游戏结束时显示游戏结果。

测试验证

为确保程序的正确性和稳定性,进行以下测试:

初始化测试:

验证InitBoard函数是否正确初始化了游戏板。

地雷布置测试:

使用SetMine函数布置地雷,验证地雷数量和位置是否符合预期。

周围地雷数计算测试:

使用GetMineCount函数计算不同位置周围地雷数量,验证计算结果的准确性。

游戏流程测试:

模拟玩家的各种输入情况,包括选择地雷区域、选择非地雷区域以及游戏结束条件,确保程序正确处理各种情况并给出正确的结果。

边界条件测试:

测试边界坐标(如(0,0)、(8,8)等),确保程序在边界情况下能正确运行和处理。

三、功能模块设计

3.1 扫雷游戏实现:

  • 一个简单的扫雷游戏,使用二维数组表示游戏板。
  • 游戏板的大小为9x9 (`ROWS` 和 `COLS` 定义为9)。
  • 在游戏板上随机布置10个地雷 (`MINE_COUNT` 定义为10)。

3.2功能实现:

  • 初始化游戏板:提供 `InitBoard` 函数来初始化扫雷区域和显示区域,其中扫雷区域存储地雷信息,显示区域用于显示游戏过程中的状态。
  • 布雷:使用 `SetMine` 函数随机在扫雷区域布置地雷,确保地雷不会重叠。
  • 打印游戏板:提供 `PrintBoard` 函数用于打印游戏板,包括显示区域和当前状态。
  • 游戏逻辑:
  1. 玩家输入坐标 `(x, y)`,根据输入判断是否踩雷。
  2. 如果踩雷,则游戏结束并显示游戏板,否则显示当前周围地雷数并继续。
  3. 如果周围没有地雷,自动扩展(递归或循环方式)显示空白区域直到边界或有地雷为止。
  4. 计算周围地雷数: 使用 `GetMineCount` 函数来计算指定坐标周围的地雷数量

3.3游戏流程:

  • 游戏开始时,随机生成地雷位置并初始化游戏板。
  • 玩家通过输入坐标进行操作,直到踩到地雷或者完成所有非地雷区域的扫描。
  • 游戏结束时,显示最终游戏板和游戏结果。

流程图如下:

四、系统测试

功能测试: 确保游戏初始化正确,并且地雷布置、周围地雷计算、自动扩展等功能按预期工作。

界面测试:确保游戏界面清晰、用户交互流畅,用户能够准确理解游戏状态和下一步操作。

边界测试:测试输入非法坐标或在边界操作的情况,确保程序能够正确处理并给出合理的提示或响应。

经过测试以上游戏代码运行正常

五、系统改编说明

错误处理增强:增加对输入坐标是否在有效范围内的检查,以及其他输入错误的检测和处理,增强程序的健壮性。

界面优化:调整游戏界面的打印方式,使其更加清晰易读,考虑添加颜色或其他装饰来提升用户体验。

功能扩展:可以考虑添加计时器、计分器等额外功能,提升游戏的趣味性和挑战性,或者增加不同难度级别供用户选择。

本程序实现了基础的扫雷游戏功能,具有一定的可玩性和挑战性。未来可以进一步改进和扩展,包括但不限于:

  • 难度级别设置:提供多个难度级别选择,如不同大小的网格和地雷数量。
  • 用户交互改进:改进用户界面,提升用户体验,例如增加菜单选择、颜色显示等。
  • 多平台支持:将游戏移植到图形用户界面(GUI)或移动设备平台,增加跨平台的可访问性。
  • 游戏统计和记录:添加游戏统计功能,记录玩家的最佳成绩和游戏历史,增加游戏的长期吸引力。

通过持续改进和优化,扫雷游戏能够在保持经典玩法的基础上,吸引更多的玩家,并提供更好的游戏体验和乐趣。

六、对本门课程教学的改进建议

  • 增加更多实际项目开发的案例,涵盖不同的应用场景和复杂度,帮助学生更好地理解和应用所学的算法和数据结构。
  • 强调团队合作和项目管理的重要性,通过团队项目来培养学生的团队合作能力和项目管理能力。
  • 提供更多的编码实践机会和实时反馈,包括代码评审和改进建议,帮助学生在实际项目中快速成长和进步。

 

三、答辩PPT

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值