C语言实现:幼儿版扫雷

外部架构代码

好不容易抽出时间码完了这个幼儿版扫雷,马上就来这里和小伙伴们分享啦!在这种小游戏的制作代码分享,因为程序复杂程度和注意的事项比较多,所以我觉得相较于知识点的讲解方法,一个内容一个注解,我认为保持思维的连贯性是更为必要的。所以我除了大框架思路的构思分享外,在这里不作过多的分割,而是直接上代码,尽量将代码连片的展现给友友们,再在程序中对相应的语句进行注解。不过我会尽量将代码易读性弄高点,希望友友们能耐心看完。

首先,我们还是先将游戏的外部框架设计好。即为游戏的测试程序和游戏菜单的设计。

void menu()      //菜单
{
	printf(" ###############\n");
    printf("##### 1.PLAY #####\n");  //这里将 1 设为进入游戏,0 设为退出游戏在下面的条件语句中有妙用
    printf("##### 0.EXIT #####\n");
    printf(" ###############\n");
}
void test()     //这里是游戏的测试程序
{
	
	int input;
	srand((unsigned)time(NULL));    //在用srand()生成随机数种子时不需要进行循环,所以直接放这。并且srand()要用time()函数来获取时间戳来生成随机数种子。time函数声明头文件<time.h>
	do                 //以do while 循环作为外部框架先执行一次程序再进行循环。
	{
		menu();       //这里是游戏菜单的函数
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出成功!");
		default:
			printf("请重新输入:> ");
			break;
		}
	} while (input);      //上面菜单的设定使得这里巧妙的用input的值来做判断条件
	

}
int main()
{
	test();
	return 0;
}

游戏所需代码声明

接着就是将game()函数里的内部逻辑(扫雷的内部逻辑)进行相关的编写了。

void game()         //游戏的主要框架
{                  
	int a = 0;
	char mine[ROWS][COLS] = {0};      //创建数组存储布置的雷的信息,雷用'1'表示,其余用'0'表示
	char show[ROWS][COLS] = {0};      //创建数组打印排雷信息,初始化为'*' 注意要创建多一圈的数组,排雷用,避免每一次对数组越界的情况进行讨论。
	InitBoard(mine, ROWS, COLS, '0'); //初始化mine数组,此处多传一个变量使得一个函数就能同时初始化两个数组
	//DisPlayBoard(mine, ROW, COL);
	InitBoard(show, ROWS, COLS, '*');  //初始化show数组
	Set(mine, ROW, COL);               //布置雷
	DisPlayBoard(mine,ROW,COL);        //打印雷阵
	DisPlayBoard(show, ROW, COL);
	Play(show, mine, ROW, COL);        //排雷及游戏胜利与否的逻辑
}

游戏内核代码实现

最后就是将游戏内部需要调用的所有函数进行实现

void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}
void Set(char mine[ROWS][COLS],int row,int col)
{
	int x = rand() % row+1;      //此处记得所打印的雷阵是从下标1~ROWS-1的的show数组信息,但此处传的行列数是ROW和COL,所以在模完随机数后要加一。
	int y = rand() % col+1;
	int count = easy_count;      //雷个数
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')        //落雷的条件,注意此处是字符型数组,所以这里的零要用单引号''
		{
			mine[x][y] = '1';     //字符型数组用'1'
			count--;
		}
	}
}
void DisPlayBoard(char board[ROWS][COLS],int row,int col)
{
	int i, j;
	for (i = 0; i <= col; i++)
	{
		printf("%d ",i);
	}
	printf("\n");
	for (i = 1; i < row+1; i++)      //此处打印行列号,方便落雷
	{
		printf("%d",i);
		for (j = 1; j < col+1; j++)
		{
			printf(" %c",board[i][j]);
		}
		printf("\n");
	}
}

int Size_count(char mine[ROWS][COLS] ,int x ,int y)//这里传扩大一圈的数组行和列的信息,以免数组越界
{
	return mine[x-1][y] +
		mine[x-1][y-1] +
		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';  //此处应知道字符数的相减得到的ASCII值就是对应的整型数
}

int Play(char show[ROWS][COLS],char mine[ROWS][COLS],int row,int col)
{
	int win = 0;                       //这里声明一个'win'变量来判断排雷完毕的情况
	while (win < row*col-easy_count)
	{
		printf("请输入排查雷的坐标:> ");
		int x, y;
		scanf("%d%d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (mine[x][y] == '0')
			{
				int count=Size_count(mine, x, y);//这里用函数排查此坐标周围雷的信息
				show[x][y] = count+'0';//注意这里是字符型数组,count这里不要忘记加上'0'转换为字符数。
				win++;
			}
			else
				printf("很遗憾,你被炸死了\n");
			    printf("让你死的明白一点:\n");
			    DisPlayBoard(mine, ROW, COL);//这里让玩家屎的明白一点,人性化的打印雷阵
				break;
		}
		else
			printf("请重新输入!\n");
	}
	if (win == row * col - easy_count)
		printf("恭喜你,游戏胜利!\n");
	printf("雷阵图:\n");                
	    DisPlayBoard(mine, ROW, COL);      
}

噢对,这里给的都是执行的主要代码块儿。头文件那些自己也要记得引用噢,具体要引用的头文件注释中都有写明。好啦,大伙儿,时间不早了,我也得去睡个香香的美容觉了,好好学习!
如果内容有误,欢迎评论区大佬们指正嗷。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值