C语言实现扫雷游戏

在写代码之前,我们应当了解扫雷这款游戏所需要的基本要素

1.棋盘

2.坐标

3.判断

棋盘:

        9*9的格子

        随机布置10个雷

坐标:

        运用基础的二维数组,在棋盘周围打上坐标

判断:

        判断选中位置是否是雷

        是,则游戏失败

        若不是,则计算周围雷的数量

棋盘:

        因为最边缘的坐标在计算周围雷的个数的时候,会以自身为中心向周围“扫描”

所以在制作代表棋盘的二维数组时候,我们可以将数组的范围扩大一圈

如同右侧图片所显示的一样,我们可以将绿色的范围输入字符'0'。这样计算周围雷的数量时,会方便不少。

雷的随机生成:

我们采用伪随机数【rand()函数】的方式来布置雷

首先需要头文件:#include <time.h>和#include <sedlib.h>

随后在函数中使用srand((unsigned int)time(NULL));来生成一段伪随机数

使用起来也非常简单,比如 int a = rand(); 这样a就是一段随机数

我们使棋盘中的 x轴 和y轴为随机数,这样就能随机生成雷了

为了后文方便计算,可以令雷的位置='1'

为了防止同一个地方重复生成雷,我们需要添加一个if条件,判断该地方为'0'后,再令其='1'

注意,文中所说的'0'和'1'均为字符,'0'在ASCII码中为48,'1'为49

判断周围雷的数量:

        因为周围都是字符'0'或者'1',他们的ASCII码为48、49

        因此我们可以做一个简单的运算,得出周围雷的数量

        如:

其中return的返回值,就是雷的数量,但是我们不能直接运用在数列中。

因为我们设置的数列内容是“字符”

我们需要得到的结果(return的返回值) + '0'

        如: 2 + '0' = 50                50在ASCII码对照表中就是'2'

随后可以令选中的位置 = '2'

假如选中的位置是 x y

列出来的等式就是:int count = GetnMineCount(mine, x,y)  (函数的返回值为上文return的返回值)

                                show[x][y] =  count + '0';

较难的地方就是这些,剩下的就是函数实现了

函数如下:

test.h

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

#define ROW  9
#define COL  9

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

#define NUMBER 10


int start();
void InitBoard(char board[ROWS][COLS], int row, int cols, 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[ROWS][COLS], int row, int col);
 

text.c

#include "test.h"

int start()
{
    printf("****************\n");
    printf("****************\n");
    printf("****1. play ****\n");
    printf("****0. exit ****\n");
    printf("****************\n");
    printf("****************\n");
    return 0;
}

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
    int a = 0;
    for (a = 0; a < rows; a++) {
        int b = 0;
        for (b = 0; b < cols; b++) {
            board[a][b] = set;
        }
    }
}

void Displayboard(char board[ROWS][COLS], int row, int col)
{
    int a = 0;
    printf("--------扫雷游戏-------\n");
    for (a = 0; a <= col; a++) {
        printf("%d ", a);
    }
    printf("\n");
    for (a = 1; a <= row; a++) {
        printf("%d ", a);
        int b = 0;
        for (b = 1; b <= row; b++) {
            printf("%c ", board[a][b]);
        }
        printf("\n");
    }
}

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

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

void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0; 
    int win = 0;
    while (win < row*col - NUMBER) {
        printf("请输入要排查的坐标\n");
        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 {
                int count = GetMineCount(mine, x, y);
                show[x][y] =  count + '0';
                Displayboard(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("输入错误,请重新输入");    
        }
    }
    if (win == row * col - NUMBER)
    {
        printf("恭喜你,排雷成功");
        Displayboard(show, ROW, COL);
    }
}

game.c

#include "test.h"

void game()
{
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };

    InitBoard(mine, ROWS, COLS, '0');
    InitBoard(show, ROWS, COLS, '*');

    Displayboard(show, ROW, COL);

    Setmine(mine, ROW, COL);
    
    Finemine(mine, show, ROW, COL);
}

int main()
{
    int judment = 0;
    printf("请选择\n");    
    do {
        start();
        scanf("%d", &judment);
        if (judment == 1) {
            srand((unsigned int)time(NULL));
            game();
            break;
        }
        else {
            printf("输入错误,请重新输入\n");
        }
    } while (judment != 0);
    return 0;
}

  • 46
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值