扫雷游戏(用C语言实现)

目录

geme.h文件

test.c文件

game.c文件

致谢


去感受一棵草、一缕风、一场日落,去重新触摸真正的生活。 -- 高盛元

geme.h文件

#define _CRT_SECURE_NO_WARNINGS
#define ROW 9
#define LIN 9
#define ROWS ROW+2
#define LINS LIN+2
#define EASY_COUNT 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu();
void game();
void make_map(char arr[ROWS][LINS], int rows, int lines, char set);
void printf_map(char arr[ROWS][LINS], int rows, int lines);
void set_mine(char arr[ROWS][LINS], int row, int lin);
int get_mine_count(char mine[ROWS][LINS], int x, int y);
void find_mine(char mine[ROWS][LINS], char show[ROWS][LINS], int row, int lin);

1. 在创立的头文件中,存放各种函数声明、宏定义、以及引入不同库函数。
2. 使用宏定义时,可以更加方便的修改整个游戏的参数,不需要一个个改变量。 

test.c文件

#include "game.h"

void menu()//打印菜单函数
{
	printf("**欢迎来到扫雷游戏~**\n");
	printf("******( ̄▽ ̄~)~******\n");
	printf("**********************\n");
	printf("********1.PLAY********\n");
	printf("********0.EXIT********\n");
	printf("**********************\n");
}

void game()//游戏主体函数
{
	char mine[ROWS][LINS] = { 0 };//准备布置地雷的数组
	char show[ROWS][LINS] = { 0 };//准备展示地雷的数组
	make_map(mine, ROWS, LINS,'0');//形成布置地雷的数组(全为'0')(失败看到)
	make_map(show, ROWS, LINS, '*');//形成展示地雷的数组(全为'*')(成功看到)
	printf_map(show, ROW, LIN);//打印展示地雷'*'数组
	set_mine(mine, ROW, LIN);//随机生产地雷
	find_mine(mine,show ,ROW, LIN);//搜查九宫格的地雷数量
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//创立随机种子,为生成随机数做准备。
	do
	{
		menu();//先打印菜单函数
		printf("请选择:1或者0\n");
		scanf("%d", &input);//让玩家选择玩不玩
		switch (input)
		{
		case 1:
			printf("进入扫雷\n");
			game();//开始游戏函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;
		}
	} while (input);//如果是0则退出,如果1则进入游戏,如果是其他数字则再次循环重新选择。
	return 0;
}

game.c文件

#include "game.h"

void make_map(char arr[ROWS][LINS],int rows,int lines,char set)//制作地图函数
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < lines; j++)
		{
			arr[i][j] = set;
		}
	}
}

void printf_map(char arr[ROWS][LINS], int rows, int lines)
{
	int i = 0;
	printf("-------扫雷-------\n");//界面分开线
	printf("0");
	for (i = 1; i <= rows; i++)
	{
		printf(" %d", i);
	} //第一行的行标注数
	printf("\n");
	for (i = 1; i <= rows; i++)
	{
		int j = 0;
		printf("%d", i);//第一列的行标注数
		for (j = 1; j <= lines; j++)
		{
			printf(" %c", arr[i][j]);//这一行全部'*'号
		}
		printf("\n");//实现换行
	}
}

void set_mine(char arr[ROWS][LINS], int row, int lin)
{
	int count = EASY_COUNT;//确定地雷的数量
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % lin + 1;//保障产生地雷在规定范围之内
		if (arr[x][y] == '0')//避免重复布雷
		{
			arr[x][y] = '1';//'1'代表地雷
			count--;
		}
	}
}

int get_mine_count(char mine[ROWS][LINS],int x,int y)//每次玩家选择成功之后排查九宫格地雷数
{
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]  + mine[x][y + 1] +
		mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0');
}//字符可以以ASCLL编码的形式进行加减。

void find_mine(char mine[ROWS][LINS], char show[ROWS][LINS], int row, int lin)
//主要的操作函数
{
	int x = 0, y = 0,win =0;
	while (1)
	{
		printf("请输入你要排查的坐标\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= lin)//确保输入范围正确
		{
			if (mine[x][y] == '1')//中招了
			{
				printf("Game Over\n~( ̄▽ ̄~)~\n");
				printf("地雷图如下所示:\n");
				printf_map(mine, ROW, LIN);//失败后打印'0 1'图
				break;
			}
			else//成功
			{
				int count = get_mine_count(mine, x, y);
				show[x][y] = (count + '0');//在'*'图上展示数字(九宫格地雷数)
				printf_map(show, ROW, LIN);//失败后打印'* num'图
				win++;
			}
		}
		else
		{
			printf("请重新输入!\n");
		}
		if (win == row * lin - EASY_COUNT)
		{
			printf("排雷成功!\n~( ̄▽ ̄~)~\n");
			printf_map(mine, ROW, LIN);
		}
	}
}

致谢

  感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值