用C语言从零开始设计属于自己的扫雷游戏

扫雷作为经典的电脑游戏,曾令很多人着迷,今天我就用C语言实现这个游戏。 

我本人用的是vscode。

1.扫雷的游戏逻辑

1.1游戏规则

扫雷的详细规则是随便点开一个方格,根据展开方格的数字去推断其相邻九宫格内未展开方格下面是否是地雷,最终任务就是点开所有没有地雷的方格,以找出所有的地雷。

用C语言来实现扫雷

由于此游戏 所需的代码量稍多,所以我们从三个部分来写

1.test.c用于写主函数

2.game.c用于写有关扫雷的函数

3.game.h用于定义函数

接下来大致介绍一下我的实现扫雷游戏的思路

1.设计主菜单

2.设计扫雷游戏(包括棋盘的初始化、打印扫雷棋盘、设置雷、排查雷)

接下来开始逐一详细介绍

首先就是游戏主体的实现

让玩家可以自行选择开始或者结束游戏



void menu()    //游戏菜单
{
    printf("*********************************\n");
    printf("************  1.piay   **********\n");
    printf("************  0.exit   **********\n");
    printf("*********************************\n");
}

void game()
{
    //游戏施行代码
}

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

    return 0;
    
}

接着就是game的实现

首先我们需要的就是打印棋盘,在这里我们是游戏的设计者,所以我们可以打印两种棋盘,一种是提供给玩家展示,一种是给我们设计者来观察测试运行效果,我们可以根据自己的喜好设计棋盘,在这里我将用'*'来给玩家提供展示,用'0'给我们设计者观察测试。

效果如下:

​​​​​​​

第一个满是'*'号的棋盘就是给玩家展示的

第二个布满0,1的棋盘就是给我们自己所展示的,其中0表示着安全,1表示着雷,(这里为什么用0,1代表安全与雷,在下面再进行解释)

1.初始化棋盘 

在初始化时有我们需要注意的细节,我们首先设计一个9x9的棋盘(当然可以根据自己的所喜欢的难度进行调整),这里借助二维数组

char mine[ROWS][COLS];//存放布置好的雷的信息
char show[ROWS][COLS];//存放的是排查雷的信息

 注:

#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)
{
	int i = 0, j = 0;
	for(i = 0;i < rows;i++)
	{
		for (j = 0;j < cols;j++)
		{
			board[i][j] = set;
		}
	}
}

//初始化棋盘
	Initboard(mine, ROWS, COLS, '0');
	Initboard(show,ROWS, COLS, '*');

我们通过此函数,来给棋盘进行初始化,实现上述效果图所展示的

相信大家到这里也发现了我们想打印9x9的棋盘,但是为什么我们要加2,变为11x11的棋盘,难道是我们写错了吗,其实不是,我们都明白,扫雷是要随便点开一个方格,然后此方格呈现一个数字告诫我们这个方格周围有几个雷,例如下图:

图中的2表示说明这个格子周围8个格子中存在2个雷,所以在设计算法时要统计点击处周围8个方位雷的个数,假如要统计边缘边缘处的雷时,就会造成数组越界,影响程序的实现,所以想要打印9x9的棋盘时,我们要专门打印11x11的棋盘,多出来的我们不要展示即可。

2.进行打印棋盘

//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
    int i=0;
    printf("-------- 扫雷 --------\n");
    //打印列号
    for(i=0;i<=row;i++)
    {
        printf("%d ",i);
    }
    printf("\n");
    for(i=1;i<=row;i++)
    {
        int j=0;
        //打印行号
        printf("%d ",i);
        for(j=1;j<=col;j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
}

//void game()
{

    DisplayBoard(mine,ROW,COL);
    DisplayBoard(show,ROW,COL);
}

这样一个棋盘就打印好了,效果图下 

3.布置雷

首先要明白的是雷的位置是随机的(所以这里借助随机数rand),其次还要自己设置雷的个数(用宏定义实现),同时注意雷所在的位置是在9x9棋盘上,不要打印到边缘圈上

#define EASY_COUNT 10  //雷的个数,可以根据自己设计个数
//布置雷
void SetMine(char board[ROWS][COLS],int row,int col)
{
    int count = EASY_COUNT;
    while(count)
    {
        int x=rand()%row+1;//0~8+1->1~9  用到rand,注意主函数要使用srand((unsigned)time(NULL));
        int y=rand()%col+1;

        if(board[x][y]=='0')//用字符0,不要用数字0  //(x,y)坐标处没有雷
        {
            board[x][y]='1';//用字符1,不要用数字1
            count--;
        }
    }
}

4.雷的位置已经就位,接下来就是排雷了

//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col )
{
	int win = 0;
	while (win<row*col-EASY_COUNT)
	{
		printf("请输入要排查的坐标: ");
		int x = 0, y = 0;
		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 - EASY_COUNT)
	{
		printf("恭喜你排雷成功\n");
		DisplayBoard(mine, row, col);
	}

}

win代表我们所探的地方,如果该处安全则win增加,同时还需要进行统计所探出雷的个数我们用以下函数实现

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

也可以这么写

int GetMineCount(char mine[ROWS][COLS],int x, int y)
{
	int i = 0, j = 0, sum = 0;
	for (i = x - 1;i <= x + 1;i++)
	{
		for (j = y - 1;j <= y + 1;j++)
		{
			sum += mine[i][j];
		}

	}
	return sum - 9 * '0';
}

这里就对应开头提出的问题,为什么用0与1来表示安全与雷,主要是为了我们统计雷的个数算法的简便性!

如果我们用其他的字符代替,就会增大运算量,也不会像此函数一样简便,这里依旧存在着一个细节,如图

我们初始化的0与1是字符1与字符0,而不是简单的数字1与0

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

 同时值得注意的还有此处,如果我们仅仅将count赋给该坐标,(以count==2为例)代表的是以2为ascll值得字符,所以要将他赋值成字符2(赋值字符2的原因是我们初始化就为字符),就要加上一个字符0

到此最简单版本的扫雷已经完成了

完整的代码如下:

//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 10
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col);

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

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

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



//game.c

#include "game.h"


//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
    int i=0;
    printf("-------- 扫雷 --------\n");
    //打印列号
    for(i=0;i<=row;i++)
    {
        printf("%d ",i);
    }
    printf("\n");
    for(i=1;i<=row;i++)
    {
        int j=0;
        //打印行号
        printf("%d ",i);
        for(j=1;j<=col;j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
}

//棋盘初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
    int i=0;
    for(i=0;i<rows;i++)
    {
        int j=0;
        for(j=0;j<cols;j++)
        {
            board[i][j]=set;
        }
    }
}


//布置雷
void SetMine(char board[ROWS][COLS],int row,int col)
{
    int count = EASY_COUNT;
    while(count)
    {
        int x=rand()%row+1;//0~8+1->1~9  用到rand,注意主函数要使用srand((unsigned)time(NULL));
        int y=rand()%col+1;

        if(board[x][y]=='0')//用字符0,不要用数字0  //(x,y)坐标处没有雷
        {
            board[x][y]='1';//用字符1,不要用数字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 win = 0;
	while (win<row*col-EASY_COUNT)
	{
		printf("请输入要排查的坐标: ");
		int x = 0, y = 0;
		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 - EASY_COUNT)
	{
		printf("恭喜你排雷成功\n");
		DisplayBoard(mine, row, col);
	}

}



//test.c


#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include "game.h"
#include "game.c"
void menu()
{
    printf("*********************************\n");
    printf("************  1.piay   **********\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,'*');

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

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

    DisplayBoard(show,ROW,COL);

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

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

    return 0;
    
}

接下来就是实现展开

各位可以根据自己的想象进行扩展

以下是我的扩展思路

1.这个坐标没有雷
2.这个坐标周围没有雷
3.这个坐标没有被排查过

可以通过递归来实现

void openMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	int ret = GetMineCount(mine, x, y);
	if (ret == 0)
	{
		show[x][y] = ' ';
		if ((x - 1) > 0 && (y - 1) > 0 && (show[x - 1][y - 1] == '*'))
			openMine(mine, show, x - 1, y - 1);
		if ((x - 1) > 0 && (y) > 0 && (show[x - 1][y] == '*'))
			openMine(mine, show, x - 1, y);
		if ((x - 1) > 0 &&(y + 1) > 0 && (show[x - 1][y + 1] == '*'))
			openMine(mine, show, x - 1, y + 1);
		if ((x) > 0 &&(y - 1) > 0 && (show[x][y - 1] == '*'))
			openMine(mine, show, x, y - 1);
		if ((x) > 0 && (y + 1) > 0 && (show[x][y + 1] == '*'))
			openMine(mine, show, x, y + 1);
		if ((x + 1) > 0 && (y - 1) > 0 && (show[x + 1][y - 1] == '*'))
			openMine(mine, show, x + 1, y - 1);
		if ((x + 1) > 0 && (y) > 0 && (show[x + 1][y] == '*'))
			openMine(mine, show, x + 1, y);
		if ((x + 1) > 0 && (y + 1) > 0 && (show[x + 1][y + 1] == '*'))
			openMine(mine, show, x + 1, y + 1);
	}
	else
		show[x][y] = ret + '0';
}

 在写一个判断是否排雷成功的函数

//判断是否排雷成功
int IsWin(char show[ROWS][COLS])
{
	int count = 0;
	for (int i = 1;i < ROWS - 1;++i) {
		for (int j = 1;j < COLS - 1;++j) {
			if (show[i][j] != '*') {
				++count;
			}
		}
	}
	if(count==ROW*COL-EASY_COUNT)
	{
		return 1;
	}
	return 0;
}

至于为什么要写一个判断是否扫雷成功的函数以及修改排查雷的函数?

因为前面我们写的基本的排查雷函数中判断是否扫雷成功是通过判断玩家输入71次后没有碰到雷则判定为成功,这样写实在是太麻烦了,所以改进一下用递归函数将所选坐标周围没有雷的坐标全都变成空白,这样输入的坐标次数就大大减少了。

判断是否扫雷成功的函数的原理是遍历整个show[ROWS][COLS]数组,遇到'*',就加1。如果最后总数为10,则扫雷成功。

同时在排查雷的函数上稍微进行修改

//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col )
{
	int x=0,y=0;

	while (1)
	{
		printf("请输入要排查的坐标: ");
		
		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
			{
				if(show[x][y]!='*')
				{
					printf("该坐标已经排查过了,无需再排查\n");
				}
				else
				{
				    int count = GetMineCount(mine, x, y);
				    
                    if(count==0)
                    {
                        openMine(mine,show,x,y);
                    }
					else
					    show[x][y] = count + '0';
					
				    DisplayBoard(show,row,col);
				
				    if(IsWin(show))
				    {
					    printf("恭喜您,排雷成功!\n");
					    break;
				    }
				}
			}
		}
		else
		{
			printf("该坐标不合法,请重新输入");
		}
	}
	
	

}

效果图如下:

接着我们再做一个扩展,用来标注雷的位置或者取消标注雷的位置

//菜单栏
void menu2()
{
    printf("请选择:\n");
    printf("-->1.继续排雷\n");
    printf("-->0.标注雷\n");
	printf("-->2.删除标注\n");
}

//标记雷
void Flag(char board[ROWS][COLS])
{
	int x=0,y=0;
	while(1)
	{
	
		printf("请输入您要标记的坐标:\n");
		scanf("%d %d",&x,&y);
		if(board[x][y]=='*')
		{
            board[x][y]='$';
			break;
		}
		else
		{
			printf("无法标记,重新输入坐标!\n");
		}
	}
}

//删除标注
void DeleteFlag(char board[ROWS][COLS])
{
    int x=0,y=0;
	while(1)
	{
	
		printf("请输入您要取消标记的坐标:\n");
		scanf("%d %d",&x,&y);
		if(board[x][y]=='$')
		{
            board[x][y]='*';
			break;
		}
		else
		{
			printf("无法标记,重新输入坐标!\n");
		}
	}
}

这时我们还要把判断是否扫雷成功进行修改一下 

int IsWin(char show[ROWS][COLS])
{
	int count = 0;
	for (int i = 1;i < ROWS - 1;++i) {
		for (int j = 1;j < COLS - 1;++j) {
			if (show[i][j] != '*'||show[i][j]!='$') {  //之前是show[i][j]!='*'
				++count;
			}
		}
	}
	if(count==ROW*COL-EASY_COUNT)
	{
		return 1;
	}
	return 0;
}

 接下来就是对排查雷的代码进行一下小改动,用switch语句来实现选择

//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col )
{
	int x=0,y=0;

	while (1)
	{
		menu2();
		int chose=0;
		printf("请选择:>");
		scanf("%d",&chose);
		switch(chose)
		{
			case 1:
		        printf("请输入要排查的坐标: ");
		        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
			        {
				        if(show[x][y]!='*')
				        {
					        printf("该坐标已经排查过了,无需再排查\n");
				        }
				        else
				        {
				            int count = GetMineCount(mine, x, y);
				    
                            if(count==0)
                            {
                                openMine(mine,show,x,y);
                            }
					        else
					            show[x][y] = count + '0';
					
				            DisplayBoard(show,row,col);
					
				
				            if(IsWin(show))
				            {
					            printf("排雷成功!\n");
					            break;
				            }
				        }
			        }
		        }
		        else
		        {
			        printf("该坐标不合法,请重新输入");
		        }
				break;
			case 0:
			//标记雷的实现
			    Flag(show);
			    DisplayBoard(show,row, col);
				break;
			case 2:
			//取消标记的雷
			    DeleteFlag(show);
				DisplayBoard(show,row, col);
				break;
			default:
			    printf("未知选项,请重新选择!\n");
				break;

		}
	}
	
	

}

效果图如下:

​​​​​​​ 

以上就是我设计的属于我的扫雷游戏,大家可以在此基础上进行扩展,发挥大家的想象,可以一起来完善这个扫雷游戏。

以下是完整的代码

//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 10
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col);

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

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

//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col );
//game.c

#include "game.h"


//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
    int i=0;
    printf("-------- 扫雷 --------\n");
    //打印列号
    for(i=0;i<=row;i++)
    {
        printf("%d ",i);
    }
    printf("\n");
    for(i=1;i<=row;i++)
    {
        int j=0;
        //打印行号
        printf("%d ",i);
        for(j=1;j<=col;j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
}

//棋盘初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
    int i=0;
    for(i=0;i<rows;i++)
    {
        int j=0;
        for(j=0;j<cols;j++)
        {
            board[i][j]=set;
        }
    }
}


//布置雷
void SetMine(char board[ROWS][COLS],int row,int col)
{
    int count = EASY_COUNT;
    while(count)
    {
        int x=rand()%row+1;//0~8+1->1~9  用到rand,注意主函数要使用srand((unsigned)time(NULL));
        int y=rand()%col+1;

        if(board[x][y]=='0')//用字符0,不要用数字0  //(x,y)坐标处没有雷
        {
            board[x][y]='1';//用字符1,不要用数字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 openMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	int ret = GetMineCount(mine, x, y);
	if (ret == 0)
	{
		show[x][y] = ' ';
		if ((x - 1) > 0 && (y - 1) > 0 && (show[x - 1][y - 1] == '*'))
			openMine(mine, show, x - 1, y - 1);
		if ((x - 1) > 0 && (y) > 0 && (show[x - 1][y] == '*'))
			openMine(mine, show, x - 1, y);
		if ((x - 1) > 0 &&(y + 1) > 0 && (show[x - 1][y + 1] == '*'))
			openMine(mine, show, x - 1, y + 1);
		if ((x) > 0 &&(y - 1) > 0 && (show[x][y - 1] == '*'))
			openMine(mine, show, x, y - 1);
		if ((x) > 0 && (y + 1) > 0 && (show[x][y + 1] == '*'))
			openMine(mine, show, x, y + 1);
		if ((x + 1) > 0 && (y - 1) > 0 && (show[x + 1][y - 1] == '*'))
			openMine(mine, show, x + 1, y - 1);
		if ((x + 1) > 0 && (y) > 0 && (show[x + 1][y] == '*'))
			openMine(mine, show, x + 1, y);
		if ((x + 1) > 0 && (y + 1) > 0 && (show[x + 1][y + 1] == '*'))
			openMine(mine, show, x + 1, y + 1);
	}
	else
		show[x][y] = ret + '0';
}

//判断是否排雷成功
int IsWin(char show[ROWS][COLS])
{
	int count = 0;
	for (int i = 1;i < ROWS - 1;++i) {
		for (int j = 1;j < COLS - 1;++j) {
			if (show[i][j] != '*'||show[i][j]!='$') {
				++count;
			}
		}
	}
	if(count==ROW*COL-EASY_COUNT)
	{
		return 1;
	}
	return 0;
}

//菜单栏
void menu2()
{
    printf("请选择:\n");
    printf("-->1.继续排雷\n");
    printf("-->0.标注雷\n");
	printf("-->2.删除标注\n");
}

//标记雷
void Flag(char board[ROWS][COLS])
{
	int x=0,y=0;
	while(1)
	{
	
		printf("请输入您要标记的坐标:\n");
		scanf("%d %d",&x,&y);
		if(board[x][y]=='*')
		{
            board[x][y]='$';
			break;
		}
		else
		{
			printf("无法标记,重新输入坐标!\n");
		}
	}
}

//删除标注
void DeleteFlag(char board[ROWS][COLS])
{
    int x=0,y=0;
	while(1)
	{
	
		printf("请输入您要取消标记的坐标:\n");
		scanf("%d %d",&x,&y);
		if(board[x][y]=='$')
		{
            board[x][y]='*';
			break;
		}
		else
		{
			printf("无法标记,重新输入坐标!\n");
		}
	}
}


//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col )
{
	int x=0,y=0;

	while (1)
	{
		menu2();
		int chose=0;
		printf("请选择:>");
		scanf("%d",&chose);
		switch(chose)
		{
			case 1:
		        printf("请输入要排查的坐标: ");
		        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
			        {
				        if(show[x][y]!='*')
				        {
					        printf("该坐标已经排查过了,无需再排查\n");
				        }
				        else
				        {
				            int count = GetMineCount(mine, x, y);
				    
                            if(count==0)
                            {
                                openMine(mine,show,x,y);
                            }
					        else
					            show[x][y] = count + '0';
					
				            DisplayBoard(show,row,col);
					
				
				            if(IsWin(show))
				            {
					            printf("排雷成功!\n");
					            break;
				            }
				        }
			        }
		        }
		        else
		        {
			        printf("该坐标不合法,请重新输入");
		        }
				break;
			case 0:
			//标记雷的实现
			    Flag(show);
			    DisplayBoard(show,row, col);
				break;
			case 2:
			//取消标记的雷
			    DeleteFlag(show);
				DisplayBoard(show,row, col);
				break;
			default:
			    printf("未知选项,请重新选择!\n");
				break;

		}
	}
	
	

}





//test.c

#include<stdio.h>
#include "game.h"
#include "game.c"   //因为我用的是vscode,如果不加这个,会报错。如果用的是vs,就不用加

void menu()
{
    printf("*********************************\n");
    printf("************  1.piay   **********\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,'*');

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

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

    DisplayBoard(show,ROW,COL);

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

    
}

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

    return 0;
    
}

感谢各位的耐心阅读!!!

谢谢各位的支持!!! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值