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