C语言实现简单扫雷游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

`
扫雷是一款经典的电脑小游戏,它的游戏规则是在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家在一定时间内依照翻开方块的提示逐个翻开不是雷方块,以找出所有地雷为最终游戏目标,如果踩到雷游戏就结束。
在这里插入图片描述


一、总体思路

1.扫雷游戏要2两个二位数组,一个存放雷的信息,一个存放布置好的雷的信息。
2.将’ 1’ ,'0’放进存放雷的信息的数组中.(用’1’表示雷)。
3.在排雷时输入要排查的坐标,如果不是雷则显示周围8个坐标里雷的个数直到10个雷全被找出。游戏结束。如要排查的坐标是雷,游戏结束。

二、代码实现步骤

1.头文件

代码如下(示例):

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

#define EASY_COUNT 10

#define ROW 9
#define COL 9

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

void  memu();//打印菜单 

void game();//游戏主体

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

void PrintfBoard(char board[ROWS][COLS],int row,int col);//打印游戏棋盘

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

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

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

int GetMineCount(char mine[ROWS][COLS],int x,int y);//统计输入要排查的坐标周围8个坐标内雷的个数并返回

2.创建游戏菜单

代码如下(示例):

void menu()
{
	printf("*****************************\n");
	printf("*********1. play ************\n");
	printf("*********0. exit ************\n");
	printf("*****************************\n");
}

3.主函数框架

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

运用switch语句,输入1进入游戏,输入0退出游戏。通过do while语句先执行,后判断来实现可游玩多次。同时用input控制循环,当选择0时正好不符合while的条件退出循环。

4.初始化游戏棋盘和创建数组

1)创建数组

  1. 创建mine数组来存放地雷的信息,当玩家输入要排查的坐标时调用mine数组来判断。创建show数组,将棋盘和排查雷的信息显示给玩家。
  2. 当玩家输入的要查找的棋子坐标在边缘时,排查该坐标周围雷个数会越界访问,因此要将mine和show两个数组同时增加两行两列,由99变成1111**(用宏定义ROW
    COL为 9,ROWS和COLS为ROW+2,便于棋盘大小的更改和游戏难度的提升(暂未实现))

2)初始化

有mine和show两个数组,因此同事初始化。将show数组初始化为’*‘,mine数组初始化为’0’.

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;
		}
	}
}
//初始化棋盘
	//1.mine数组初始化为'0'
	//2.show数组初始化为'*' 
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*'); 

2)打印棋盘信息

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

3)设置地雷

通过生成随机数来设置地雷,存放地雷信息的mine数组之前被全被初始化为’0’,现在让电脑随机更改10个mine数组的值为’1’来表示放置地雷。(count表示的是地雷的个数,每次成功生成一个雷时,count就减1,直到count减到0时,跳出循环。雷布置完毕。

void PutMine(char board[ROWS][COLS],int row,int col)
{
	//布置10个雷
	//生成随机的坐标,布置雷 
	int count = EASY_COUNT;  
	while(count)
	{
	   int x = 0,y = 0;
	       x = rand() % row + 1;
           y = rand() % col + 1;
		   if(board[x][y] == '0')
		   {
		   	board[x][y] = '1';
		   	count--;
		   }
    }	
}

4)排查雷

1.首先定义全局变量win,每查找一个坐标win加1,直到win =行数*列数-雷的数量时,玩家排雷成功,并打印出雷的信息。
2.宏定义雷的数量为10,方便后续地雷数量的更改。
3.玩家输入要查找的坐标时,判断在mine函数中,该坐标值是否为’1’。若为1则玩家排雷失败,游戏结束、当该坐标值为’0’时,统计该坐标周围中雷的个数并赋值给show函数对应坐标中。

void FindMine(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- EASY_COUNT)
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				PrintfBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有几个雷
				int count=GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				PrintfBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	PrintfBoard(mine, ROW, COL);
	}
}


5)统计要查找的坐标周围8个坐标中雷的个数

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

三、完整代码

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

#define EASY_COUNT 10

#define ROW 9
#define COL 9

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

void  memu();//打印菜单 

void game();//游戏主体

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

void PrintfBoard(char board[ROWS][COLS],int row,int col);//打印游戏棋盘

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

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

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

int GetMineCount(char mine[ROWS][COLS],int x,int y);//统计输入要排查的坐标周围8个坐标内雷的个数并返回
void menu()
{
	printf("*****************************\n");
	printf("*********1. play ************\n");
	printf("*********0. exit ************\n");
	printf("*****************************\n");
}
void game()
{
	char mine[ROWS][COLS];//存放布置好的雷 
	char show[ROWS][COLS];//存放排查雷的信息、
	//初始化棋盘
	//1.mine数组初始化为'0'
	//2.show数组初始化为'*' 
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*'); 
	//打印棋盘
	PrintfBoard(show,ROW,COL); 
	//布置雷 
	PutMine(mine,ROW,COL);
    //排雷
	FindMine(mine,show,ROW,COL);
	 
} 

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 PrintfBoard(char board[ROWS][COLS],int row,int col)
{
	int  i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%C ", board[i][j]);
		}
		printf("\n");
	}
}
void PutMine(char board[ROWS][COLS],int row,int col)
{
	//布置10个雷
	//生成随机的坐标,布置雷 
	int count = EASY_COUNT;  
	while(count)
	{
	   int x = 0,y = 0;
	       x = rand() % row + 1;
           y = rand() % col + 1;
		   if(board[x][y] == '0')
		   {
		   	board[x][y] = '1';
		   	count--;
		   }
    }	
}
void FindMine(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- EASY_COUNT)
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				PrintfBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有几个雷
				int count=GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				PrintfBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	PrintfBoard(mine, ROW, COL);
	}
}

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 main()
{
   
	int input = 0;
    srand((unsigned int)time(NULL));	
	do
	{
	    menu();
	    printf("请选择:>");
    	scanf("%d",&input);
        switch(input)
       {
    	 case 1:
    	    game();
        	break;
         case 0:
            printf("退出游戏!"); 
    	    break;
    	 default:
    	 printf("选择错误,重新选择!");
    	
	   }
    }while(input);
    return 0;  
}

总结

以上就是C语言实现简单的扫雷游戏,本文仅仅简单实现了扫雷的基本功能,而改变难度难度,排雷展开等还为未实现。但是比较适合新手练习。如果本文对你起到了帮助,你可以点个赞,谢谢支持。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值