C语言----扫雷游戏

目录

扫雷游戏功能说明

代码运行

test.c

game.h(头文件)

game.c


扫雷游戏功能说明

  • 使用控制台实现经典的扫雷游戏
  • 通过菜单实现继续或退出
  • 棋盘是9*9的格子
  • 默认随机布置10个累
  • 可以排查雷
  • 如果位置不是雷,就显示周围有几个雷
  • 如果位置是雷,炸死游戏结束
  • 把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束
  • test.c————main函数,主要是来测试游戏的主逻辑的
  • game.h————函数的声明
  • game.c————函数的实现

代码运行

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"


void menu()
{
    printf("****************\n");
    printf("***  1.play  ***\n");
    printf("***  0.exit  ***\n");
    printf("****************\n");

}
//完成扫雷游戏测试
void game()
{
    char mine[ROWS][COLS] = { 0 };   //存放布置好的雷的信息 -- '0'
    char show[ROWS][ROWS] = { 0 };   //存放排查出的雷的信息 -- '*'

    //初始化数组
    InitBoard(mine, ROWS, COLS,'0');
    InitBoard(show, ROWS, COLS,'*');

    //打印棋盘
    //DisplayBoard(mine, ROW, COL);
    //DisplayBoard(show, ROW, COL);

    //布置雷
    //DisplayBoard(mine, ROW, COL);
    SetMine(mine,ROW,COL);
    DisplayBoard(show, ROW, COL);
    
    //排查雷
    FineMine(mine,show,ROW,COL);
}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do 
    {
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    } while (input);
        return 0;
}

 宏定义:
#define _CRT_SECURE_NO_WARNINGS 1:这个宏定义通常用于Visual Studio环境中,以禁用关于不安全函数(如scanf)的安全警告。

头文件包含:
#include"game.h":包含了一个名为game.h的头文件,该头文件应该包含扫雷游戏所需的所有宏定义、函数原型等。但是,由于代码片段中没有提供game.h的内容,我们只能假设它包含了这些定义。

函数定义:
void menu():定义了一个菜单函数,用于显示游戏的主菜单选项(玩游戏和退出)。
void game():定义了一个游戏函数,但该函数目前只初始化了两个二维字符数组(mine和show),用于存储雷的信息和显示给玩家的信息。然后,它调用了几个未在当前代码片段中定义的函数(如InitBoard, SetMine, DisplayBoard, FineMine)来初始化棋盘、设置雷、显示棋盘和查找雷。然而,由于这些函数的具体实现未给出,我们只能猜测它们的功能。

主函数(main):
定义了游戏的入口点。它使用了一个do-while循环来不断显示菜单并允许用户选择游戏选项(玩游戏或退出)。根据用户的输入,它调用game()函数或退出程序。

game.h(头文件)

#pragma once

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

#define EASY_COUNT 10

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

//初始化棋盘
void InitBoard(char board[ROWS][COLS],int row,int col,char set);

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//排雷
void FineMine(char mine[ROWS][COLS], char show[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void InitBoard(char board[ROWS][COLS], int row, int col,char set)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = set;
        }
    }
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;

    printf("-------扫雷-------\n");

    for (i = 0; i <= col; i++)
    {
        printf("%d ", i);
    }
    printf("\n");

    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);
        for (j = 1; j <= col; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
    printf("-------扫雷-------\n");
}

void SetMine(char board[ROWS][COLS], int row, int col)
{
    //int count = 0;
    int count = EASY_COUNT;
    while (count)
    {
        //生成随机下标
        //x:1-9   y:1-9
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (board[x][y] != '1')
        {
            board[x][y] = '1';
            count--;
        }
    }
}

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
    return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] +
        mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0';
}

void FineMine(char mine[ROWS][COLS], char show[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;

    int win = 0;
    while (win<row*col-EASY_COUNT)
    {
        printf("请输入要排查的坐标:");
        scanf("%d %d", & x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (mine[x][y] == '1')
            {
                printf("很遗憾遇到雷,被炸死\n");
                DisplayBoard(mine, ROW, COL);
                break;
            }
            else
            {
                win++;
                printf("还需要排查%d个位置\n", row * col - EASY_COUNT - win);
                //统计xy坐标周围雷的个数
                int c = GetMineCount(mine,x,y);
                show[x][y] = c + '0';
                DisplayBoard(show, ROW, COL);

            }
        }
        else
        {
            printf("输入的坐标有误,请重新输入\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功\n");
        DisplayBoard(mine, ROW, COL);
    }
}
 

InitBoard 函数:
功能:初始化棋盘,将棋盘上的所有位置都设置为给定的字符(通常是 '0' 表示空地或未探索的区域)。
修改点:原函数中的 row 和 col 参数是多余的,因为您已经定义了 ROWS 和 COLS 宏来确定棋盘的大小。所以,直接使用 ROWS 和 COLS 来循环初始化即可。


DisplayBoard 函数:
功能:打印棋盘,包括行号和列号,以及棋盘上的内容。
修改点:
列号应该在棋盘上方单独打印一行。
棋盘内容的打印应该从索引 1 开始(因为用户可能期望从 1 开始计数),但内部数组索引仍然从 0 开始。


SetMine 函数:
功能:在棋盘上随机设置指定数量的雷('1')。
修改点:
在设置雷之前,应该先初始化整个棋盘为非雷状态(例如,全部设为 '0')。
确保在设置雷时不会覆盖已经设置为雷的位置(尽管在您当前的实现中,由于棋盘初始为空,这不是问题,但在其他上下文中可能是必要的)。


FineMine 函数(即扫雷过程):
功能:允许用户输入坐标来排查雷,根据排查结果更新显示棋盘,直到用户排查完所有非雷区域或遇到雷为止。


注意事项:
确保 show 数组的大小与 mine 数组相同,即 [ROWS][COLS]。
在用户输入坐标时,要进行有效性验证,确保坐标在棋盘范围内。
如果用户排查到雷,应立即结束游戏并显示棋盘。
如果用户成功排查完所有非雷区域,应宣布游戏胜利并显示棋盘。


随机数生成:
在调用 rand() 函数之前,使用 srand(time(NULL)) 来初始化随机数生成器的种子,以确保每次运行程序时都能生成不同的随机数序列。


GetMineCount 函数:
功能:计算给定坐标周围(通常是 8 个相邻位置)的雷的数量。 

排雷游戏完成!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值