C语言写一个扫雷游戏

今天学习了鹏哥讲的扫雷,特此记录一下自己的实现过程。首先就是画图,理清自己的思路:

 这里的扫雷呢?没有图形化的界面啊?只有内部的逻辑。

先看看执行的效果吧!

 输入要扫雷的坐标后,如果是雷就game over了,被炸死了,如果不是雷,就要检测这个坐标周围一圈的坐标内有几个雷,然后显示在当前的坐标内,提示一下玩家周围有几个雷。

废话不多说,直接看看文件关系及代码吧!

当前是test.c文件也是程序入口所在的文件。

 接下来是game.h头文件,里面写的是关于游戏实现的可暴露在外的部分函数声明

 最后是游戏实现的全部函数:

// 下面是game.c    文件的全部代码


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化函数
void InitArr(char arr[ROWS][COLS], int row, int col, char set)
{
	int i = 0, j = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			arr[i][j] = set;
		}
	}
}



// 3、 打印数组
void display(char arr[ROWS][COLS], int row, int col)
{
	printf("*******************    扫雷游戏    *************************\n");
	int i = 0, j = 0;
	for (j = 0; j <= col; j++)
	{
		printf("  %d  ", j);
	}
	printf("\n");
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("  %d  ", i);
		for (j = 1; j <= col; j++)
		{
			printf("  %c  ", arr[i][j]);
		}
		printf("\n");
		printf("\n");
	}
	printf("*******************    扫雷游戏    *************************\n");
}




// 4、生成地雷
void ShengChengLei(char arr_lei[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i < LEI; i++)
	{
		while (1)
		{
			int x = rand() % row;       // 生成随机函数
			int y = rand() % col;       // 生成随机列数
			if (arr_lei[x][y] == '0')
			{
				arr_lei[x][y] = '1';
				break;
			}
		}
	}
}

//检测输入坐标周围的8个坐标下雷的个数
int JianCe(char arr_lei[ROWS][COLS], int x, int y)
{
	
	// 打印一下 ‘0’+‘0’+‘0’+‘0’+‘0’+‘0’‘0’+‘1’ 的值就明白了,想要得到1,就得减去8个48
	return arr_lei[x - 1][y - 1] + arr_lei[x][y - 1] + arr_lei[x + 1][y - 1] +
		   arr_lei[x - 1][y] +                         arr_lei[x + 1][y] +
		   arr_lei[x - 1][y + 1] + arr_lei[x][y + 1] + arr_lei[x + 1][y + 1] - 48 * 8;
}


// 5、扫雷
void ClearLEI(char arr[ROWS][COLS], char arr_lei[ROWS][COLS], int row, int col)
{
	int x = 0, y = 0;
	int count = 0;
	while (1)
	{
		printf("请输入你要扫雷的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//如果输入的行列数合法
			//检测该坐标下是不是雷
			if (arr_lei[x][y] == '1')
			{
				printf("你挖到了地雷,被炸死了!\n");
				break;
			}
			if (arr_lei[x][y] == '0')
			{
				// 如果这个坐标下不是0,就要设置成周围雷的个数
				int num = JianCe(arr_lei, x, y);  //  此处返回的是数字(周围雷的个数)
				arr[x][y] = num + 48;              // 比如雷的个数是2,如果直接放2,打印数组时什么都打不出来,2要加上48=50正好是ASCII码的2的值
				count++;
				// 打印数组
				display(arr_lei, ROW, COL);
				display(arr, ROW, COL);
			}
			if (count == row * col - LEI)
			{
				printf("扫雷完毕!恭喜你清除了所有的雷!\n");
				break;
			}
		}
		else
		{ 
			//如果输入的数不合法就重新输入
			printf("输入的有错误,请重新输入!\n");
		}
		

	}
}

//****************************************************************************************

// 下面是game.h 头文件的全部代码
#pragma once
#include"stdio.h"
#include"time.h"
#include"stdlib.h"

// 声明常量
#define ROW 9
#define COL 9
#define LEI 10 // 雷的数量

#define ROWS 9+2
#define COLS 9+2



//***************声明函数**************

//初始化函数
void InitArr(char arr[ROWS][COLS], int row, int col, char set);


// 3、 打印数组
void display(char arr[ROWS][COLS], int row, int col);

// 4、生成地雷
void ShengChengLei(char arr_lei[ROWS][COLS], int row, int col);

// 5、扫雷
void ClearLEI(char arr[ROWS][COLS], char arr_lei[ROWS][COLS], int row, int col);




//***********************************************************************************
//下面是test.c的全部代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

// 开始菜单
void menu()
{
	printf("************************************\n");
	printf("**********   1、开始游戏   **********\n");
	printf("***********  0、结束游戏   **********\n");
	printf("************************************\n");
}

//游戏主函数
void game()
{
	//  1、创建数组
	char arr[ROWS][COLS] = { 0 };
	char arr_lei[ROWS][COLS] = { 0 };

	// 2、 初始化数组
	InitArr(arr, ROW, COL, '*');
	InitArr(arr_lei, ROW, COL, '0');

	// 3、 打印数组
	display(arr, ROW, COL);
	//display(arr_lei, ROW, COL);

	// 4、生成地雷
	ShengChengLei(arr_lei, ROW, COL);

	// 5、扫雷
	ClearLEI(arr, arr_lei, ROW, COL);
	
}


int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入你的选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("游戏结束!\n");
			break;
		case 1:
			printf("游戏开始!\n");
			game();
			break;
		default:
			printf("输入错我,请重新输入!\n");
			break;
		}

	} while (input);

	return 0;
}





猜你喜欢

转载自blog.csdn.net/xingyuncao520025/article/details/131151916