C语言实现扫雷游戏(新手小白所写代码,记得关注呦!)

文章目录

前言

游戏设计思路

头文件定义、函数的声明

函数定义

游戏规则声明

地雷的布置

游戏实现函数

主函数的定义以及菜单函数

总结

前言

扫雷游戏是一款非常经典的小游戏,也能在一定程度上锻炼我们的思维,激发我们脑部的思维能力以及创造力。那么我们如何用C语言实现一个扫雷游戏呢,这次我们就用一些最基本的C语言语法来具体实现扫雷游戏。

游戏设计思路

我们会定义两个数组,一个数组用来存放布置好的雷的信息,另外一个数组用来存放排查出来雷的信息(用于和玩家进行交互),通过修改第二个数组的信息来】以达到排雷的目的。在计算边界为1的周围雷数时,数组会越界,所以为了防止这个现象,我们可以在周围多留一圈,例如如果我们要玩9✖9的,那么我们就定义11✖11的数组大小。

头文件定义、函数声明

接下来,将要展现的是扫雷中所使用到的所有函数,为了方便调用,我将所有代码都放在了一个C语言文件夹中来实现。

0  1  2  3  4  5  6  7  8  9  
1  *  *  *  *  *  *  *  *  *
2  *  *  *  *  *  *  *  *  *
3  *  *  *  *  *  *  *  *  *
4  *  *  *  *  *  *  *  *  *
5  *  *  *  *  *  *  *  *  *
6  *  *  *  *  *  *  *  *  *
7  *  *  *  *  *  *  *  *  *
8  *  *  *  *  *  *  *  *  *
9  *  *  *  *  *  *  *  *  *

代码如下:

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

//布局9*9方格
#define ROW 9
#define COL 9

//防止在计算边界为1的周围雷数时,数组越界,所以我们将数组扩大,防止数组越界。
#define ROWS    ROW + 2
#define COLS    COL + 2

#define MINE_COUNT 10//地雷个数



//游戏实现
void play();
//初始化界面布局
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印布局
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//布置地雷
void SetMine(char board[ROWS][COLS], int row, int col);
//判断成功排除后剩下的方格数是否等于地雷数
int IsWin(char show[ROWS][COLS], int row, int col);
//使用递归函数来实现周围没地雷时展开多个
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
//计算周围地雷个数
int mine_count(char mine[ROWS][COLS], int x, int y); 
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//递归实现连续排除周围地雷
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);


函数定义
游戏规则

首先,使用了函数递归的方式来实现周围8个方格,如果没有地雷的话就一次性展开,以及使用ASC||码值来计算周围8个方格中的数量,并且将用数字的方式展现出来周围的地雷个数。

接下来,就可以进行简单的排雷操作,输入坐标进行排雷,直到排完所有的雷则会通过游戏,如果输入的坐标数正好是布置的地雷坐标数。那么恭喜你,你踩到了雷,那么游戏就会结束,你可以选择继续玩或者退出。

开始

代码如下:

int IsWin(char show[ROWS][COLS], int row, int col)
{
    
    
    int num = 0;
    //排除一个地雷时便进行累加
    for (int i = 1; i <= row; i++)
    {
    
    
        for (int j = 1; j <= col; j++)
        {
    
    
            if (show[i][j] == '*')
                num++;
        }
    }
    return num;
}

void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
    
    
    int count = mine_count(mine, x, y);//周围地雷的个数(此时是字符的ASCII码值)

    if (count == 0)
    {
    
    
        show[x][y] = ' ';
        int i = 0, j = 0;

        for (i = -1; i <= 1; i++)
        {
    
    
            for (j = -1; j <= 1; j++)
            {
    
    
                //连续排除时限制范围在棋盘范围内
                if ((x + i) > 0 && (y + i) > 0 && (x + i < ROWS) && (y + j < COLS) && show[x + i][y + j] == '*')
                {
    
            
                    spread(mine, show, x + i, y + j);//递归实现周围如果都没地雷连续排除
                }
            }
        }
    }
    else
    {
    
    
        show[x][y] = count + '0';//将字符ASCII码值转换为数字从而显示
    }
}

int mine_count(char mine[ROWS][COLS], int x, int y)
{
    
    
    //将周围八个方格中字符的ASCII码值之和减去八个‘0’的值得到周围地雷个数
    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 = 0, y = 0;

    while (1)
    {
    
    
        printf("请输入排雷坐标:>");
    loop:
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法
        {
    
    
            if (mine[x][y] == '1')//‘1’为地雷
            {
    
    
                printf("你已踩到雷,游戏结束\n");
                DisplayBoard(mine, ROW, COL);
                break;
            }
            else
            {
    
    
                spread(mine, show, x, y);//计算周围地雷数量,连续排除无雷的方格
                DisplayBoard(show, ROW, COL);
            }
        }
        else
        {
    
    
            printf("请输入正确的坐标:");
            goto loop;
        }
        int ret = IsWin(show, row, col);
        if (ret == MINE_COUNT)//当累加的地雷数量等于布置地雷的数量则说明地雷全部排除
        {
    
    
            printf("恭喜你,通关成功!\n");
            break;
        }
    }
}

游戏结束

布置地雷

这里使用了rand()函数在该方格没有地雷的情况下随机布置相应的地雷,有地雷的方格值为1,没有地雷的方格值为0,布置完地雷后再使用打印函数将界面打印出来。

在C语言中,我们一般使用<stdlib.h>头文件中的rand()函数来生成随机数。
但是我们通过使用可以发现,我们每次地雷产生的地点都是相同的,也就是说明我们每次使用rand()函数产生的随机数都是相同的。
实际上,我们使用的rand()函数产生的随机数都是伪随机数,这个数据其实是按照某一个公式推算出来的,我们通常称这个数值为“种子”,但是,我们可以通过srand()函数来重新分配随机数,这样我们的随机数就可以变得不一样,我们就可以随机放置地雷的位置。

void srand(unsigned int seed);

但是我们需要一个unsinged int 类型的参数,在实际代码编写中,我们可以用时间作为参数,只要我们每次播种的时间不同,那么我们生成的随机数也就不同。

那么我们就可以使用到<time.h>头文件中的time()函数就可以得到当前时间
如下:

srand((unsigned)time(NULL));

void SetMine(char board[ROWS][COLS], int row, int col)
{
    
    
    int count = MINE_COUNT;//布置地雷数量
    while (count)
    {
    
    
        //当该方格内没有地雷时随机布置相应数量地雷
        int x = rand() % row + 1;//(行,随机数范围1~9)
        int y = rand() % col + 1;//(列,随机数范围1~9)
        if (board[x][y] == '0')//判断没有地雷
        {
    
    
            board[x][y] = '1';//布置地雷
            count--;//直到布置完所有地雷
        }
    }
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    
    
    int i = 0, j = 0;
    
    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]);//打印9*9方格内字符布局
        }
        printf("\n");
    }
    printf("\n");
}

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
    
    
    int i = 0, j = 0;
    for (i = 0; i < rows; i++)
    {
    
    
        for (j = 0; j < cols; j++)
        {
    
    
            board[i][j] = set;//初始化所有方格内的字符
        }
    }
}

游戏实现函数

首先我们要初始化游戏布局并且打印出开,之后进行布置地雷(也就是我们上方所要实现的函数)以及计算周围8个方格中的地雷个数,并且标注出来附近地雷数量,最后我们就可以开始进行扫雷。

void SetMine(char board[ROWS][COLS], int row, int col)
{
    
    
    int count = MINE_COUNT;//布置地雷数量
    while (count)
    {
    
    
        //当该方格内没有地雷时随机布置相应数量地雷
        int x = rand() % row + 1;//(行,随机数范围1~9)
        int y = rand() % col + 1;//(列,随机数范围1~9)
        if (board[x][y] == '0')//判断没有地雷
        {
    
    
            board[x][y] = '1';//布置地雷
            count--;//直到布置完所有地雷
        }
    }
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    
    
    int i = 0, j = 0;
    
    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]);//打印9*9方格内字符布局
        }
        printf("\n");
    }
    printf("\n");
}

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
    
    
    int i = 0, j = 0;
    for (i = 0; i < rows; i++)
    {
    
    
        for (j = 0; j < cols; j++)
        {
    
    
            board[i][j] = set;//初始化所有方格内的字符
        }
    }
}

主函数定义以及菜单函数
这里是进行游戏的一个简单选择界面,就和市场上的绝大多数游戏一样,我编写的扫雷同样也具有菜单选择功能。通过选择其中一个选项来执行相应的操作。调用该游戏或者退出游戏,以及在输入错误选项后,进行正确选项提示。

int main()
{
    
    
    //菜单选择界面
    int input = 0, choose = 0;
    printf("&---------------------------&\n");
    printf("|        1、扫雷  Play          |\n");
    printf("|---------------------------|\n");
    printf("|        2、退出  Exit         |\n");
    printf("&---------------------------&\n");
    printf("请选择(1/2)>:");
    do
    {
    
    
        scanf("%d", &input);
        switch (input)
        {
    
    
        case 1:
            while (1)
            {
    
    
                printf("\n");
                play();
                printf("&---------------------------&\n");
                printf("|        1、继续  Continue  |\n");
                printf("|---------------------------|\n");
                printf("|        2、退出  Exit      |\n");
                printf("&---------------------------&\n");
                printf("请输入你的选择:");
            loop:
                scanf("%d", &choose);
                switch (choose)
                {
    
    
                case 1:
                    break;
                case 2:
                    return 0;
                default:
                    printf("请输入正确的选项:");
                    goto loop;
                }
            }
        case 2:
            printf("退出成功!\n");
            return 0;
        default:
            printf("请输入正确的选项:");
            break;
        }
    } while (input);

    return 0;
}

总结
这些就是关于所有扫雷这款游戏的全部代码。我们使用C语言来完成了这款代码,如果想要深入学习的同学,可以在b站中寻找有关扫雷这款游戏的讲解。虽然这款扫雷的界面以及实现都非常粗糙,但是这也是对我的一种小小的进步。也希望看到这篇文章的朋友继续加油。继续成长!

请添加图片描述

猜你喜欢

转载自blog.csdn.net/z2004cx/article/details/128546650