C语言 扫雷程序设计

目录

1.main函数

2.菜单打印menu函数

3.游戏game函数

4.宏定义

5.界面初始化

6.打印界面

7.设置雷

8.统计排查坐标周围雷的个数

9.排查雷

10.总代码

test.c代码

game.h代码

game.c代码

结语:


一个简单的扫雷游戏,通过宏定义可以修改行列的大小以及雷的数量,通过输入坐标选择要排查的位置。

1.main函数

cs 复制代码
int main()
{
	//设置随机数的生成
	 srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		printf("扫雷游戏\n");
		menu();
		printf("请选择(1/0):>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
		default:
			printf("输入错误\n");
		}
	}while (input);
	return 0;
}

2.菜单打印menu函数

cs 复制代码
//打印菜单
void menu()
{
	printf("******************\n");
	printf("*****  1.play  ***\n");
	printf("*****  0.exit  ***\n");
	printf("******************\n");

}

3.游戏game函数

cs 复制代码
void game()
{
	//布置好雷的信息
	char mine[ROWS][COLS] = {0};
	//排查出雷的信息
	char show[ROWS][COLS] = {0};
	//初始化数组的内容为指定内容
	//mine数组在没有布置雷的时候,都是'0'
	board_Init(mine,ROWS,COLS,'0');
	//show数组在没有排查雷的时候都是'*'
	board_Init(show,ROWS,COLS,'*');
	
	//打印数组
	//Display_board(mine, ROW, COL);
	//Display_board(show, ROW, COL);
	//设置雷
	Set_mine(mine, ROW, COL);
	//Display_board(mine, ROW, COL);
	Display_board(show, ROW, COL);
	//排查雷
	Fine_Mine(mine, show, ROW, COL);


		
}

4.宏定义

cs 复制代码
//设置行和列的大小
#define ROW 9
#define COL 9
cs 复制代码
//设置雷的数量
#define COUNT 80

5.界面初始化

初始化数组的内容为指定内容

mine数组在没有布置雷的时候,都是'0'

show数组在没有排查雷的时候都是'*'

cs 复制代码
//数组初始化
void board_Init(char board[ROWS][COLS], int rows, int cols,char x)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		
		for (j = 0; j < cols; j++)
		{
			board[i][j] = x;
		}
	}
}

6.打印界面

cs 复制代码
//打印数组
void Display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("-----扫雷游戏-----\n");
	printf("  ");
	for (j = 1; j <= col; j++)
	{
		
		printf("%d ", j);
	}
	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");
	printf("\n");

}

7.设置雷

cs 复制代码
//设置雷
void Set_mine(char board[ROWS][COLS], int row, int col)
{
	//定义雷的数量
	int count = COUNT;
	//行1-9
	//列1-9
	while (count)
	{
		int x = rand() % row + 1;//在一行中随机生成一个数
		int y = rand() % col + 1;//在一列中随机生成一个数
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
	
}

8.统计排查坐标周围雷的个数

cs 复制代码
//统计排查坐标周围雷的个数
int get_mine_count(char board[ROWS][COLS], int x, int y)
{

	return board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y + 1] +
		board[x + 1][y + 1] +
		board[x + 1][y] +
		board[x + 1][y - 1] +
		board[x][y - 1] - 8 * '0';
}

9.排查雷

cs 复制代码
//排查雷
void Fine_Mine(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-COUNT)
	{
		printf("请输入要排查的坐标>:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != 'x')
			{
				printf("该坐标已被排查过了,不能重复排查\n");
			}
			else
			{
				//如果是雷
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了\n");
					Display_board(mine, ROW, COL);
					break;
				}
				else//如果不是雷
				{
					win++;
					//统计mine数组中x,y坐标周围有几个雷
					int count = get_mine_count(mine, x, y);
					show[x][y] = count + '0';//转换成数字字符
					Display_board(show, ROW, COL);
				}
			}
			
		}
		else
			printf("输入坐标非法,请重新输入\n");
		
	}
	if (win == row*col - COUNT)
	{
		printf("恭喜你,排雷成功\n");
		Display_board(mine, ROW, COL);
	}
}

10.总代码

test.c代码

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"


//打印菜单
void menu()
{
	printf("******************\n");
	printf("*****  1.play  ***\n");
	printf("*****  0.exit  ***\n");
	printf("******************\n");

}
void game()
{
	//布置好雷的信息
	char mine[ROWS][COLS] = {0};
	//排查出雷的信息
	char show[ROWS][COLS] = {0};
	//初始化数组的内容为指定内容
	//mine数组在没有布置雷的时候,都是'0'
	board_Init(mine,ROWS,COLS,'0');
	//show数组在没有排查雷的时候都是'*'
	board_Init(show,ROWS,COLS,'*');
	
	//打印数组
	//Display_board(mine, ROW, COL);
	//Display_board(show, ROW, COL);
	//设置雷
	Set_mine(mine, ROW, COL);
	//Display_board(mine, ROW, COL);
	Display_board(show, ROW, COL);
	//排查雷
	Fine_Mine(mine, show, ROW, COL);


		
}
int main()
{
	//设置随机数的生成
	 srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		printf("扫雷游戏\n");
		menu();
		printf("请选择(1/0):>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
		default:
			printf("输入错误\n");
		}
	}while (input);
	return 0;
}

game.h代码

cs 复制代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//设置行和列的大小
#define ROW 9
#define COL 9


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

//设置雷的数量
#define COUNT 10
//初始化数组
void board_Init(char mine[ROWS][COLS], int rows, int cols, char x);
//打印数组
void Display_board(char board[ROWS][COLS], int row, int col);
//设置雷
void Set_mine(char board[ROWS][COLS], int row, int col);
//排查雷
void Fine_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c代码

cs 复制代码
define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"


//数组初始化
void board_Init(char board[ROWS][COLS], int rows, int cols,char x)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		
		for (j = 0; j < cols; j++)
		{
			board[i][j] = x;
		}
	}
}



//打印数组
void Display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("-----扫雷游戏-----\n");
	printf("  ");
	for (j = 1; j <= col; j++)
	{
		
		printf("%d ", j);
	}
	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");
	printf("\n");

}


//设置雷
void Set_mine(char board[ROWS][COLS], int row, int col)
{
	//定义雷的数量
	int count = COUNT;
	//行1-9
	//列1-9
	while (count)
	{
		int x = rand() % row + 1;//在一行中随机生成一个数
		int y = rand() % col + 1;//在一列中随机生成一个数
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
	
}


//统计排查坐标周围雷的个数
int get_mine_count(char board[ROWS][COLS], int x, int y)
{

	return board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y + 1] +
		board[x + 1][y + 1] +
		board[x + 1][y] +
		board[x + 1][y - 1] +
		board[x][y - 1] - 8 * '0';
}

//排查雷
void Fine_Mine(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-COUNT)
	{
		printf("请输入要排查的坐标>:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != 'x')
			{
				printf("该坐标已被排查过了,不能重复排查\n");
			}
			else
			{
				//如果是雷
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了\n");
					Display_board(mine, ROW, COL);
					break;
				}
				else//如果不是雷
				{
					win++;
					//统计mine数组中x,y坐标周围有几个雷
					int count = get_mine_count(mine, x, y);
					show[x][y] = count + '0';//转换成数字字符
					Display_board(show, ROW, COL);
				}
			}
			
		}
		else
			printf("输入坐标非法,请重新输入\n");
		
	}
	if (win == row*col - COUNT)
	{
		printf("恭喜你,排雷成功\n");
		Display_board(mine, ROW, COL);
	}
}

结语:

技术有限可能有些BUG没有发现,可以往里面添点有意思的程序,比如弄个关机程序进去,扫到雷直接关机,那样会很酷吧

相关推荐
严文文-Chris1 天前
【监督学习常用算法总结】
学习·算法
feifeigo1231 天前
电池的荷电状态(SOC)估计
算法
博语小屋1 天前
力扣 15.三数之和(medium)(双指针)
算法·leetcode·职场和发展
无敌最俊朗@1 天前
双指针-力扣hot100-移动零.283
算法·leetcode·职场和发展
练习时长一年1 天前
LeetCode热题100(腐烂的橘子)
算法·leetcode·职场和发展
Тиё Сиротака1 天前
红包分配算法的严格数学理论与完整实现
算法
hefaxiang1 天前
C语言常见概念(下)
c语言·开发语言
potato_may1 天前
链式二叉树 —— 用指针构建的树形世界
c语言·数据结构·算法·链表·二叉树
java修仙传1 天前
每日一题,力扣560. 和为 K 的子数组
算法·leetcode
ada7_1 天前
LeetCode(python)——148.排序链表
python·算法·leetcode·链表