C语言实现扫雷【经典】下

简介: C语言实现扫雷【经典】下
+关注继续查看

2.4 布置雷

在game.h文件中先定义全局变量EASY_COUNT,控制雷的数量


#define EASY_COUNT 10


在布置雷时,要先生成随机坐标,然后判断该坐标是否可以放雷


  • 用rand函数产生随机值
  • 每一个格子只能存放一个雷,前面初始化棋盘时,已经将所有的格子(11x11)全初始化为’0’,所以在布置雷,只能在为’0’的格子中存放
//game.c

void SetMine(char board[ROWS][COLS], int row, int col)
{
    //布置雷
    //生成随机的坐标,布置雷
    int count = 10;
    while (count)
    {
        int x = rand() % row + 1;//为了控制随机值大小,防止越界,范围:1-9
        int y = rand() % col + 1;
        if (board[x][y] == '0')
        {
            board[x][y] = '1';
            count--;
        }
    }
}

🍤 调用头文件:


//game.h

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

2.5 排除雷

玩游戏选择坐标时,会有三种结果:


1. 选择存放了雷的坐标,游戏结束


玩家先输入坐标,该坐标行列大小在定义的范围内,然后判断是否是存放了雷的坐标。


在之前我们已经初始化了所有位置都是‘0’,只有随机存放了雷的位置,会变为‘1’,而当输入的坐标的内容为‘1’时,即玩家踩雷了,游戏结束。


2. 选择了安全的坐标,且显示周围8个坐标的雷的数量


如果输入的坐标的内容为‘0’,则计算出周围8个位置的雷的数量,并打印在此坐标上。


在这里,我们用GetMineCount函数单独计算,返回雷的数量


假设已知坐标x,y,其他周围的坐标就可以表示为:

000a1705775b404d48a3ba48d41cd7e0_706652b3c3e64d328426f283669d7e04.png


🍤 代码实现:


//game.c

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

🍩游戏胜利的实现


定义一个变量win,在每次选择非雷的坐标后累加1,当win=棋盘总个数(9x9)-存放了雷的个数,即win==row* col - EASY_COUNT,也就排除了所有的雷,游戏胜利。


3. 坐标选择错误


当我们选择的行列坐标超出设定的范围,就提示玩家输入错误,重新输入。


printf("坐标非法,重新输入!\n");


2.5.1 代码实现

//game.c

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0, y = 0;
    int win = 0;
    while (win<row*col-EASY_COUNT)
    {
        printf("请输入要排查的坐标,如:1 2:>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (mine[x][y] == '1')
            {
                printf("很遗憾,你被炸死了");
                DisplayBoard(mine, ROW, COL);
                break;
            }
            else
            {
                int count=GetMineCount(mine, x, y);//统计周围8个位置的雷的数量
                show[x][y] = count + '0';
                DisplayBoard(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("坐标非法,重新输入!\n");
        }
    }
    if(win == row* col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功…^-^…");
        DisplayBoard(mine, ROW, COL);
    }
}


3. 总结


3.1 game.h文件所有内容

#include<stdlib.h>
#include<time.h>
#include<windows.h>//声明Sleep函数
#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 rows,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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

3.2 game()游戏函数整体

//test.c

void game()
{
    char mine[ROWS][COLS];//存放布置好的雷
    char show[ROWS][COLS];//存放排查出的雷的信息

    //初始化棋盘
    //1.mine数组最开始全‘0’、
    //show数组最开始全‘*’
    InitBoard(mine,ROWS,COLS,'0');
    InitBoard(show,ROWS,COLS,'*');

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

    //1.布置雷
    SetMine(mine,ROW,COL);

    //2.排查雷
    FindMine(mine, show, ROW, COL);
}

🍩注: 每一个.c文件最前面,需要用 #include "game.h" 进行声明


f026a33d2986aae38b0107c161a3cb45_bf16a39b076049c89dac19f404a11e42-00003_auth_key=4842865137-0-0-5f445ac4f5131cf41e7d8b688f6fa287.jpg


相关文章
|
4天前
|
C语言
C语言-扫雷游戏的实现(上)
C语言-扫雷游戏的实现
19 0
|
4天前
|
人机交互 C语言
c语言实现扫雷
c语言实现扫雷
12 0
|
4天前
|
C语言
C语言之扫雷游戏
C语言之扫雷游戏
|
4天前
|
C语言
C语言 7 扫雷游戏
C语言 7 扫雷游戏
10 0
|
4天前
|
C语言
C语言-扫雷游戏的实现(下)
C语言-扫雷游戏的实现
22 0
|
15天前
|
C语言
C语言之扫雷游戏实现篇
C语言之扫雷游戏实现篇
21 0
|
20天前
|
C语言
C语言经典小游戏-三子棋+扫雷
C语言经典小游戏-三子棋+扫雷
11 1
|
22天前
|
安全 C语言
【C语言小游戏】扫雷(下)
【C语言小游戏】扫雷
26 0
【C语言小游戏】扫雷(下)
|
22天前
|
C语言
【C语言小游戏】扫雷(上)
【C语言小游戏】扫雷(上)
33 0
【C语言小游戏】扫雷(上)
|
22天前
|
C语言
C语言实现扫雷游戏
C语言实现扫雷游戏
推荐文章
更多