C语言实现扫雷游戏(完整版)

C语言实现扫雷游戏(完整版),第1张

目录

一、函数声明部分 

二、函数定义部分

1、菜单函数以及主函数定义

2、游戏实现函数

 3、布置地雷

4、游戏规则设定

三、总结


一、函数声明部分 

下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现

宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布局

如图:

代码如下:

#include
#include
#include

#define ROW 9
#define COL 9

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

#define MINE_COUNT 10//地雷个数


void play();//游戏实现
int menu();//菜单界面
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 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);//布置地雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);//扫雷

二、函数定义部分 1、菜单函数以及主函数定义

这里是进入游戏的一个简单的选择菜单界面,通过选择(1/2)来执行相应的 *** 作,调用该游戏实现函数以及退出游戏和错误判断

如图:

代码如下:

int main()
{
    menu();
    return 0;
}

int menu()
{
    int input = 0,choose = 0;
    printf("&---------------------------&\n");
    printf("|        1、扫雷            |\n");
    printf("|---------------------------|\n");
    printf("|        2、退出            |\n");
    printf("&---------------------------&\n");
    printf("请选择(1/2)>:");
    do
    {
        scanf("%d",&input);
        switch(input)
        {
            case 1:
                while(1)
                {
                    printf("\n");
                    play();
                    printf("&---------------------------&\n");
                    printf("|        1、继续            |\n");
                    printf("|---------------------------|\n");
                    printf("|        2、退出            |\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;
}


2、游戏实现函数

首先先初始化游戏布局并打印出来,之后进行布置地雷以及计算周围八个方格中地雷的数量,最后开始扫雷

如图:

代码如下:

void play()
{
    srand((unsigned int)time(NULL));
    char mine[ROWS][COLS] = {0};//布置地雷
    char show[ROWS][COLS] = {0};//排查地雷

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

    //DisplayBoard(mine,ROW,COL);//显示地雷
    SetMine(mine,ROW,COL);
    FindMine(mine,show,ROW,COL);
}

 3、布置地雷

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

扩展:

在C语言中,我们一般使用 头文件中的 rand() 函数来生成随机数

int rand (void);        //void 表示不需要传递参数。

但是多次运行上面的代码,你会发现每次产生的随机数都一样

实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”,我们可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。

void srand (unsigned int seed);

它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。

使用 头文件中的 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;
        int y = rand() % col + 1;
        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]);
        }
        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;
        }
    }
}

4、游戏规则设定

这里使用了函数递归的方式来实现周围8个方格如果都没有地雷的话就一次性展开使用空格来填补,以及通过字符的ASCII码值来计算周围八个方格中地雷的数量以数字形式显示周围地雷个数。

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

如图:

扩展:

递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。

代码如下:

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);
 
	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 ");
loop:
        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 
            {
                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;
        }
    }
}


三、总结

以上就是个人分享的关于扫雷游戏所有的代码,用C语言简单的实现了扫雷这个小游戏,虽然在界面和功能的实现上都很粗糙,但是对于一个初学C语言小白的我来讲也是一个小小的进步,也希望自己继续加油之后写出更优秀的代码


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1324364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存