C语言实现简易的扫雷小游戏

打印菜单

首先我们需要一个简易的游戏菜单,以供玩家选择;

这里我选择用do-while语句来实现:


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

int main()
{
    int input;
    srand((unsigned int)time(NULL));
    do
    {
        meau();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误\n");
            break;
        }

    } while (input);
    
}

其中之所以采用数字0和1来进行选择,是因为当玩家选择0时,do-while语句为假,就能够退出游戏;选择1时,就能够进入游戏;选择其他数,就能够让玩家重新选择,直到进入或者退出游戏。

运行结果如下:

初始化棋盘

我们需要创建两个11*11的二维数组,一组用于安置雷,全部初始化为’0‘,另一组用于展示,全部初始化为’*‘,但只在中间9*9的数组里进行操作,目的是为了方便玩家输入常规坐标,也方便电脑统计坐标周围雷的数量。


void InitBoard(char board[ROWS][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;
        }
    }
}

其中如果传入数组为安置雷的,set则为’0‘,如果为展示的,set则为’*‘。

打印棋盘

为了让玩家能够清楚的知道每一个点的坐标,我在每行每列前加上了对应的数字。展示数组为第一个,雷数组为第二个(还未安置雷),但在进行游戏时雷数组是不会显示出来的,扫雷成功或者扫雷失败则会出现。


void Display(char board[ROWS][COLS], int row, int col)
{
    int i, j;
    printf("\n*******扫雷*******\n");
    for (j = 0; j <= row; j++)
    {
        printf("%d ", j);
    }
    printf("\n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);
        for (j = 1; j <= col; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
}

运行结果为:

安置雷

电脑需要随机生成坐标来安置雷,故需要一个随机数生成器,即rand( ),但在调用rand( )之前,需要在主函数中调用srand( ),引用的库函数为<stdlib.h>,还需要在头文件中定义一个雷的数量,以便控制游戏的难易程度。


void SetMine(char mine[ROWS][COLS], int row, int col)
{
    int count = Easy_Count;
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }
}

其中我用1来代替0,即1就为雷。因为控制了雷的数量为10个,故在棋盘中间9*9的格子里共有10个雷,即有10个1。

扫雷

玩家输入一个要搜索的坐标,然后判断该位置是否已经被搜索,如果被搜索过,则需要重新选择坐标搜索,如果未被搜索,则需要统计以自身为中心周围一圈所存在的雷的个数,并填入坐标内,重复操作,直到将所有不是雷的坐标搜索了,才能扫雷成功。


void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x, y;
    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很遗憾,你被炸死了\n");
                Display(mine, ROW, COL);
                break;
            }
            else
            {
                //该坐标不是雷,则统计其周围雷的个数
                int count = GetMineCount(mine, x, y);
                show[x][y] = count + '0';
                Display(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("坐标错误,请重新输入\n");
        }
    }
    if (win == row * col - Easy_Count)
    {
        printf("\n恭喜你,扫雷成功\n");
    }
}

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');
}

下面是我把雷的个数调为了80个,并将雷数组打印了出来,所得到的游戏结果。

完整代码


//game.h头文件里的代码



#pragma once

//头文件的包含
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define Easy_Count 80

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

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

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

//扫雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);

//test.c文件里的代码



#define _CRT_SECURE_NO_WARNINGS

#include "game.h"
void meau()
{
    printf("******************\n");
    printf("******1.play******\n");
    printf("******0.exit******\n");
    printf("******************\n");
}
void game()
{
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    //初始化棋盘
    InitBoard(mine, ROWS, COLS, '0');
    InitBoard(show, ROWS, COLS, '*');
    //打印棋盘
    Display(show, ROW, COL);
    //布置雷
    SetMine(mine, ROW, COL);
    //Display(mine, ROW, COL);
    //排查雷
    FindMine(mine, show, ROW, COL);
}
int main()
{
    int input;
    srand((unsigned int)time(NULL));
    do
    {
        meau();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误\n");
            break;
        }

    } while (input);
    
}

//game.c里的代码



#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void InitBoard(char board[ROWS][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 Display(char board[ROWS][COLS], int row, int col)
{
    int i, j;
    printf("\n*******扫雷*******\n");
    for (j = 0; j <= row; j++)
    {
        printf("%d ", j);
    }
    printf("\n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);
        for (j = 1; j <= col; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
}

void SetMine(char mine[ROWS][COLS], int row, int col)
{
    int count = Easy_Count;
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x, y;
    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很遗憾,你被炸死了\n");
                Display(mine, ROW, COL);
                break;
            }
            else
            {
                //该坐标不是雷,则统计其周围雷的个数
                int count = GetMineCount(mine, x, y);
                show[x][y] = count + '0';
                Display(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("坐标错误,请重新输入\n");
        }
    }
    if (win == row * col - Easy_Count)
    {
        printf("\n恭喜你,扫雷成功\n");
    }
}

以上就是这个小游戏的全部代码,大家还有什么不懂的或者建议都可以在评论区中发出来,我们可以共同讨论学习,共同进步。最后还请各位多多点赞,谢谢大家了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值