c语言初学者如何代码实现 扫雷 游戏

扫雷游戏的简介

uu们,相信大家应该对扫雷游戏不陌生,你们知道这个游戏的实现原理吗?

让我们一起通过代码和解析来了解它吧!

我这里是用c语言实现的。

这个游戏代码可放在三个文件,分别为test.c game.c game.h

接下来会一一细讲。

game.h

这是头文件,可在此定义一些整个项目常用到的固定变量,如

#define ROW 9
#define COL 9 这是定义雷阵的大小,9行9列

头文件也用于声明函数,在项目的其余文件引用该文件,即可调用头文件中声明的函数

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define COL 9		//打印出来的雷阵数组大小 9*9
#defineROWS 11
#define COLS 11		//便于计算雷数目的雷阵数组的实际大小 11*11
#define COUNT 10
void qingkong(char board[ROWS][COLS], int row, int col,char set);//在test.c引用该头文件即可调用以下函数,
void setboard(char board[ROWS][COLS], int row, int col);//函数的定义则放在game.c文件中
Display(char board[ROWS][COLS], int row, int col);


void pailei(char board[ROWS][COLS], char show[ROWS][COLS], int rows, int cols, int row, int col);

test.c

test.c 是游戏的实现逻辑


#include"game.h"		//记得引用头文件方可调用函数


int main()
{
    
    
	test();		//主函数应简洁明了
		return 0;
}


void test()
{
    
    
	int input = 0;
	srand((unsigned int)time(NULL));	//设置随机数生成的函数,用于设置雷的产生位置
	do
	{
    
    
		menu();
		printf("请玩家选择:>");	//玩家输入数字选择,1则进入游戏;0则退出游戏
		scanf("%d", &input);
		switch (input)
		{
    
    
		case 1:
			game();		//游戏的实现函数
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;

		}
	} while (input);
}

void game()
{
    
    
	char  board[ROWS][COLS] = {
    
     0 };		//定义雷阵二维数组
	char show[ROWS][COLS] = {
    
     0 };			//show 展示出来的雷阵数组
	qingkong(board, ROWS, COLS,'0');		//初始化雷阵二维数组,使得数组元素为同一元素,雷阵数组全部为'0'
	qingkong(show, ROWS, COLS,'*');			//展示打印数组全部为'*'
	setboard(board, ROW, COL);				//布置雷阵,存放雷
	
	Display(show, ROW, COL);				//打印数组的函数
	pailei(board, show, ROWS, COLS,ROW,COL);	//排雷的函数
}
void menu()
{
    
    
	printf("***** 扫雷游戏  *****\n");		//菜单选择界面
	printf("*****   1 play  *****\n");
	printf("*****   0 exit  *****\n");
	printf("*********************\n");
}

game.c

该文件用于定义函数

#include"game.h"	//该文件亦需要引用头文件,例如#define ROW 9 需要用到这些变量

//初始化二维数组
void qingkong(char board[ROWS][COLS], int rows, int cols,char set )
{
    
    
	int i = 1;						//初始化二维数组,使其全部元素相同
	int j = 1;
	for (i = 0; i < rows; i++)
	{
    
    
		for (j = 0; j< cols; j++)
		{
    
    
			board[i][j] = set;
		}
	}
}

//存放雷
void setboard(char board[ROWS][COLS], int row, int col)
{
    
    
	int count = COUNT;
	while (count)
	{
    
    
		int x = rand() % row + 1;		//存放雷,一共十个雷
		int y=rand() % col + 1;			//生成随机坐标对应二维数组元素,布置雷,放于1—9列;1—9行 中
		
		if (board[x][y] == '0')
		{
    
    

			
			board[x][y] = '1';
			count--;
		}
	}
}


//打印雷阵数组
Display(char board[ROWS][COLS], int row, int col)
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i <= row; i++)			//打印雷阵二维数组
	{
    
    
		printf("%d ", i);
	}									//打印出来的雷阵数组
        printf("\n");					//0 1 2 3 4 5 6 7 8 9		
                                //1 * * * * * * * * *
                                //2 * * * * * * * * *
                                //3 * * * * * * * * *
                                //4 * * * * * * * * *
                                //5 * * * * * * * * *
                                //6 * * * * * * * * *
                                //7 * * * * * * * * *
                                //8 * * * * * * * * *
                                //9 * * * * * * * * *
	for (i = 1; i <= row; i++)
	{
    
    
		
		printf("%d ",i);
		for (j = 1; j <= col; j++)
		{
    
    
			
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

//排雷函数的定义
void pailei(char board[ROWS][COLS], char show[ROWS][COLS], int rows, int cols, int row, int col)
{
    
    
	int a = 0;
	while(a<row*col-10)		//循环次数为9*9-10(10为雷的数目)
	{
    
    
		printf("请输入坐标进行排雷>:");
		int n = 0;
		int m = 0;						//输入坐标如 9 9 进行选择排雷
		scanf("%d%d", &n, &m);
		if (n >= 1 && n <= row && m >= 1 && m <= col)
		{
    
    
			if (board[n][m]=='0')
			{
    
    
				int r = num(board, n, m);		//r为周围雷数目;该数目需要我们定义函数实现
				show[n][m] = r+'0';				//数字加'0'等于对应的数字字符,参考ascii码表
				a++;
				system("cls");					//清屏,使得屏幕只有一个雷阵
				Display(show, ROW, COL);
			}
			else
			{
    
    
				printf("很遗憾你被炸死了\n");
				Display(board, ROW, COL);		//游戏结束后展示雷的存放位置
				break;
			}
		}
		else
		{
    
    
			printf("坐标非法,无法排雷\n");
		}
	}
	
}

//求坐标周围雷的数目
static int num(char board[ROWS][COLS], int n, int m)
{
    
    
	return board[n - 1][m - 1] +		//查看坐标周围的八个坐标,雷坐标字符则为'1';非雷坐标则为'0'
		board[n - 1][m] +
		board[n - 1][m + 1] +			//数字字符减去'0'为对应的数字,不理解可参考ascii码表
		board[n][m - 1] +
		board[n][m + 1] +
		board[n + 1][m - 1] +
		board[n + 1][m] +
		board[n + 1][m + 1] - 8* '0';
}

该程序代码的不足之处

该程序只能一次只能排雷一个,如果坐标周围没有雷,也不会展开一片

就像这样

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

最后

谢谢大家的观看浏览,本人也是c语言初学者,希望大家能多多评论提出建议

后面的雷阵展开一片,我也会努力将其实现!有不懂的小伙伴亦可关注我看后续。

猜你喜欢

转载自blog.csdn.net/m0_63062581/article/details/121503901