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没有发现,可以往里面添点有意思的程序,比如弄个关机程序进去,扫到雷直接关机,那样会很酷吧

相关推荐
Ritsu栗子22 分钟前
代码随想录算法训练营day23
c++·算法
~糖炒栗子~23 分钟前
[Day 12]904.水果成篮
数据结构·c++·算法·leetcode
Adunn24 分钟前
算法基础 - 二分查找
数据结构·c++·算法
HUT_Tyne26525 分钟前
力扣--283.移动零
数据结构·算法·leetcode
graceyun25 分钟前
牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定
c语言
ALISHENGYA26 分钟前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)
开发语言·数据结构·c++·算法
久睡成瘾.44627 分钟前
《代码随想录》Day29打卡!
数据结构·算法
迪小莫学AI30 分钟前
检测相邻递增子数组 II - LeetCode 3350 解题思路与代码解析
数据结构·算法·leetcode
就爱学编程31 分钟前
力扣刷题:数组OJ篇(下)
c语言·算法·leetcode
就爱学编程31 分钟前
力扣刷题:数组OJ篇(上)
java·算法·leetcode