c语言扫雷实现及闲谈

闲谈

昨天是11.2日,新海诚的《天气之子》首映的第二天,我跑去看了一场。算是在忙碌的周末中给自己的一次放松。在本是首映的1号那天,上午在学校上了一上午的课,下午呢又有自己的日语课,同时又和自己的计算机课程冲突了。没得办法二选其一,我去了日语课。晚上回到宿舍就已经是10点了,复习了一下自己
白天学的知识,然后刷牙洗脸躺尸睡觉一气呵成。第二天起来,吃完早餐,开始补习昨天没有去的那节计算机课。看完了录屏,就开始着手扫雷的实现了。
年少无知且懒惰的我,扫雷实现完,一看时间就已经快到电影放映的时间点了。自己一个人坐上了西安的公交,去了影院,取了票,入了座,便开始什么也不想了,也不用想什么了。
在这103分钟,我只用盯着荧幕,开着导演精心准备的画面和故事。
在我·看来这真的是有点非一般爱情故事。我很喜欢,也很感动,但没有流泪。
森岛帆高离家出走而来到了东京。在遇到麦当劳那个温暖人心的小礼物之前,一直都在感慨东京很大啊,确实东京对于未入大学的他确实有点太大了。
就好像西安与我一样。出了校门,就是社会,一切都定会发生翻天覆地的巨变。我与他一样都很害怕。
阳菜为了找到工作谎报年龄,又何尝不像是我们对外所表现出来的那份坚强呢。
东京很大,夏美却找不到工作;东京很大,圭介却有个永远的遗憾;东京很大,小雨(那只猫)
曾没有家。
我在剧中看到了少年少女那种疯狂的爱情,同时也有着自己独特的共鸣。
西安很大,我害怕走出校门,门外边的一切,陌生而害怕。
西安很大,我不知道我会在未来何时,也会被突如其来的事故留下永久的遗憾。
西安很大,我害怕毕业时,找不到工作,只能像帆高那样在角落里蜷缩。
西安很大,找不到一只猫,能给我精神上的慰藉,能在雨夜里报团取暖。
世界也很大,我不知道我是否想去看看,我也不知道我能否去看看。
我只知道,当下,做好我能做的每一个选择,然后付出全力,去尊重每一个选择。
我所喜欢的,望我迟早实现。我所佩服的,愿我终将成为你。

可以直接看这里,看注释哦

头文件

#ifndef _GAME_h
#define _GAME_h
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<stdlib.h>
#pragma  warning(disable:4996)
#define ROW 17//可以改变这两个宏定义的值已达到修改二维矩阵的大小的功能
#define COL 17//这两个宏定义,在后面都是以传参的方法传给后面的函数,因此只要改变和两个数的大小,就可以实现表格大小的改变
void menu1();//第一个主菜单函数
void init(char a[][COL], char b[][COL], int x, int y);//初始化函数
void hide(char a[][COL], int x, int y,int z,int *x_first,int *y_first);//随机数藏雷的函数
void show(char a[][COL], int x, int y,int z);//展示函数,这里的这个int z是为了避免展示PE表格时,PE表格经过检索周围的8各方各正好只有一个雷后,打印出来的1是红色字体。
int remove(char a[][COL], char b[][COL],int x, int y,int z,int *p,int *q,int defult);//输入坐标的函数,defult参数是前面的难度选择有关的一个参数
void menu2();//难度选择的函数

#endif

函数实现

#include"game.h"

void menu2()
{
	printf("       欢迎来到扫雷游戏!\n");
	printf("########################################\n");
	printf("########################################\n");
	printf("#####     1.偷懒摸鱼 (1/4雷)     #####\n");
	printf("#####     2.小心翼翼 (1/3雷)     #####\n");
	printf("#####     3.原地升天 (1/2雷)     #####\n");
	printf("########################################\n");
	printf("请选择难度!!\n");
}
void menu1()
{
	printf("       欢迎来到扫雷游戏!\n");
	printf("################################\n");
	printf("################################\n");
	printf("#####        1.开始        #####\n");
	printf("#####        2.退出        #####\n");
	printf("################################\n");
}
void init(char a[][COL], char b[][COL], int x, int y)//整个表盘全部初始化。
{
	for (int ab = 0; ab < ROW; ab++)
	{
		for (int cd = 0; cd < COL; cd++)
		{
			a[ab][cd] = '*';//
			b[ab][cd] = '0';//pc
		}
	}
}
void hide(char a[][COL], int x, int y,int z,int *x_first,int *y_first,int defult)
{
	
	int p = 0, q = 0;
	
	do
	{
		p++;
		int x_mine = rand() % (ROW-2) + 1;//随机数埋雷的埋雷坐标,数学算法发的逻辑是,通过该算法,是范围会默认在中间部位,暨上下左右各少一行一列。
		int y_mine = rand() % (COL-2) + 1;
		if (a[x_mine][y_mine] = '0')
		{
			
			if (p== 1)
			{
				*x_first = x_mine;
				*y_first = y_mine;//第一次踩雷,则传出第一次的踩雷坐标//然后重来
				continue;
			}
			else
			{
				q++;
				a[x_mine][y_mine] = '1';//埋雷
			}
		}
		else
		{
			continue;
		}
	} while (z--);//z是雷的个数,通过z--来判断埋雷的次数和个数,知道埋玩符合难度设定的雷的个数之后,就停止埋雷
}

	

void show(char a[ROW][COL], int x, int y,int z)//展示与传入数组相对应的棋盘。病显示不同的颜色
{
	printf("    ");
	for (int m = 1; m <= x - 2; m++)
	{
		printf(" %2d  |", m);
	}
	printf("\n");
	for (int line = 0; line < x - 2; line++)
		printf("-------");
	printf("\n");

	for (int m = 1; m <= x-2; m++)
	{
		printf(" %2d|", m);
		for (int n = 1; n <= y - 2; n++)
		{
			printf(" ");
			if (a[m][n] == '1'&&z)
			{
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				SetConsoleTextAttribute(hConsole, 0xC);
				printf(" %c  ", a[m][n]);
				SetConsoleTextAttribute(hConsole, 0xF);
			}
			else if (a[m][n] == '*')
			
			{
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				SetConsoleTextAttribute(hConsole, 02);
				printf(" %c  ", a[m][n]);
				SetConsoleTextAttribute(hConsole, 0xF);
			}
			else
			{
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				SetConsoleTextAttribute(hConsole, 0xF);
				printf(" %c  ", a[m][n]);
				SetConsoleTextAttribute(hConsole, 0xC);
			}
			HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
			SetConsoleTextAttribute(hConsole, 0xF);
			printf("|");
			SetConsoleTextAttribute(hConsole, 0xF);
		}
		HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleTextAttribute(hConsole, 0xF);
		printf("\n");
		for (int line = 0; line < x - 2; line++)
			printf("-------");
		printf("\n");
		SetConsoleTextAttribute(hConsole, 0xF);
	}
}
int remove(char a[][COL], char b[][COL], int x, int y, int z, int *p, int *q,int defult)//ape bpc  
{
	int quit = 0;
	printf("请输入你确定的坐标!(第 行 第 列)\n");
	
	int m = 0, n = 0;
	while (!quit)
	{
		scanf("%d,%d", &m, &n);
		if (m < 1 || m>x-2 || n < 1 || n>y-2)
		{
			printf("输入坐标不合法,请重新输入\n");
			quit = 0;
		}
		else
		{
			quit = 1;
			break;
		}
	}
	if (b[m][n] == '1')
	{
		if (z == ROW*COL/(5-defult))
		{
			printf("你运气真好,第一次就踩到了雷!\n饶你一次,5s继续下!!!\n");
			for (int times = 5; times >= 0; times--)
			{
				Sleep(1000);
				printf("   %d\r", times);
			}
			m = *p;
			n = *q;
			b[m][n] = '0';
		}
		else
		{
			return 0;
		}
	}
	int g = 0;
	g = (b[m - 1][n - 1] + b[m - 1][n] + b[m - 1][n + 1] + b[m][n - 1]
		+ b[m][n + 1] + b[m + 1][n - 1] + b[m + 1][n] + b[m + 1][n + 1]) - 8 * '0';//周围8个方格相加,-8*‘0‘得到一个int值;
	a[m][n] =  48+g;//int值+48转换为ascll码显示
		return 1;
	
}

主调逻辑

#include"game.h"
int main()
{
	
	srand((unsigned long)time(NULL));
	char PE[ROW][COL];//创建一张二维数组表,用来存放用户输入的坐标,并且经输入坐标后,对改坐标位置展开。形成嘻信息反馈
	char PC[ROW][COL];//二维数组矩阵用来供电脑以随机数的形式生成地雷
	int mine_numbers = 0;//地雷的数量。后面会以参数的形式传给函数,提前声明方便
	int x_first = 0, y_first = 0;//两个数形成一个坐标,作用是在第一次就出雷的情况下,让游戏重新开始。会以参数的形式传给函数

	int key = 1;
	loop:menu1();
	int quit = 1;//控制后面的do while循环
	do
	{
		int select = 0;
		scanf("%d", &select);//结合菜单输入功能号,结合switch语句,能够实现分支选择。
		switch (select)
		{
		case 1:
			menu2();//难度选择菜单
			int defult = 0;
			scanf("%d", &defult);//难度选择
			switch (defult)
			{
			case 1:printf("你选择的是第1种难度!!\n"); break;
			case 2:printf("你选择的是第2种难度!!\n"); break;
			case 3:printf("你选择的是第3种难度!!\n"); break;
			default:printf("输入错误,进行最难模式惩罚!!\n");
				defult = 3;
				break;
			}
			mine_numbers = ROW*COL / (5-defult);//通过整个矩阵的大小,以及难度选择的难易程度,来决定要藏得雷有多少个,会以参数的形式传入函数
			init(PE,PC,ROW,COL);//初始化两个二维数组结合init函数,具体查看初始化的结果
			hide(PC, ROW, COL, mine_numbers,&x_first,&y_first,defult);//根据传入的参数和对应的二维数组随机埋入雷,具体请看实现
			printf("\n\t\t##############             PE               ###########\n");
			show(PE, ROW, COL,0);//展示整个二维数组
			do
			{
				
				key=remove(PE, PC, ROW, COL, mine_numbers, &x_first, &y_first,defult);
				if (key != 0)
				{
					system("cls");
				}	
				printf("\n\t\t##############             PE               ###########\n");
				show(PE, ROW, COL,0);
				mine_numbers--;
			} while (mine_numbers > 0 && key!=0);//这个do while相当于一个判断函数,能判断扫雷的结果
			printf("\n\t\t##############             PC               ###########\n");
			show(PC, ROW, COL, 1);//同理打印
			if (key == 0)
			{
				printf("boom!boom!boom!boom!boom!\nboom!boom!boom!boom!boom!boom!\n");//你完了炸了
				printf("###################################\n");
				printf("         是否再来一局?\n");
				printf("####1.再来一局       2.退出########\n");
				printf("###################################\n");

				int next = 0;
				scanf("%d", &next);
				do
				switch (next)
				{
				case 1:goto loop; break;
				case 2:printf("BYE BYE!\n");return 0;
				default:
					printf("输入正确的选项!\n");
					next = 1;
				}while (next);//实现是否继续游玩的功能
		}
			break;
		case 2:
			quit = 0;
			break;
		default:
			printf("请输入合法的功能选项!\n");

		}
	} while (quit&&key);//整个打的dowhile使如果你选择了继续游玩还能继续循环
	printf("BYE BYE!\n");
	system("pause");
}

今天尝试一下给代码写注释,而不去写那么多的文字分析。我会先试试分享给同学看,问问他们能看看懂不,毕竟写博客还是要人人看懂的。
另外呢,我也不知道在博客之中写一些个人的观点这种对不对,但是我觉得我还是会坚持下去的。我写博客的初衷就是记录。
记录下自己在学习过程中的感悟,思考。我觉得如果在未来我有时间,我能回头来来看一下我写的博客,我能找回我当初写这一篇,或者某一篇博客的时候我能回忆起一些或许美好,或许辛酸的往事。
毕竟,时过境迁,我终究不会再是往年的那个少年

发布了13 篇原创文章 · 获赞 13 · 访问量 753

猜你喜欢

转载自blog.csdn.net/jiewaikexue/article/details/102881789
今日推荐