【C语言】寒假答辩作品——掘地求升C语言版
前言
这个是作为寒假答辩作品写的。
之前考虑过用Unity写个游戏,但毕竟不熟悉C#,感觉几乎都是在套模板,而且写着不顺手,有想法却只能
看着C#发呆,很是无奈,所以决定还是选熟悉的C语言写一个大程序。正愁没灵感的时候,我突然看见了它:
然后我开始了几天快乐并痛苦的自闭抡锤子之旅,然后又痛苦并快乐的用C写下了这个游戏qwq。
github代码:https://github.com/404name/WinterReplyWorks/tree/master/C语言小游戏
游戏画面
加载页面
游戏界面
游戏结束
实现效果
整体函数调用介绍
1.主函数首先进入init()进入伪游戏加载
2.然后进入while(1)循环循环加载菜单和选择功能
3.首先show_menu()利用单独map【200】【200】储存后台的菜单界面,然后输出处理过的界面,利用move函数加载移动指针可进行人为上下左右控制选择,当按下空格确定时,后台读取map信息返回给flag,flag进入对应功能模块。
4.功能模块结束重新进入循环显示菜单直到选择结束功能游戏结束刷新菜单显示结束界面
(进入游戏板块void game_system()分两个重要函数void autochange() //系统自动更新
void manchange() //人为输入更新,即为控制人物行动在认为输入更新,而人物行动动作在系统自动更新函数里面,而show_move()就是每次更新人物位置,即人物位置附属信息)
int main()
{
加载页面
while (1)
{
显示菜单();
int flag = move(设置参数); // 2新游戏 3继续 4设置 5更多 6退出
switch (flag)
{
进入相应函数();
}
if (game_end == 1)
break;
}
打印结束界面;
}
int move(int x, int y, int limit_x1, int limit_x2, int limit_y1, int limit_y2, int xx, int yy) //移动指针函数
int init() //初始化+加载系统
void load_game() //读取关卡信息
void show_move() //移动显示
void autochange() //系统自动更新
void manchange() //人为输入更新
void more() //首页选择功能函数
void setting()
void exit()
void show_menu() //显示菜单
void game_system() //加载游戏系统
void select() //首页加载选项系统
游戏细节
1.伪加载系统
利用for进行变量i的1-1000循环gotoxy定点更新数值与信息。
每除余xx等于0时相应的地方显示更新的信息。
这里是每200出现一条新的故事背景
每1000/11加载条处出现一个实体方块
每1数字进行数值的更新
就是伪装加载系统模仿正常游戏,当然不想等待按p即可跳过
2.万能map【200】【200】
游戏的map数组是作为后台数组使用,所有界面都是单独一个数组,而读取是用map承接,好处在于每个函数都可以直接对map调用而不用去单独设置参数去传相应的界面。而且现实的界面都是经过处理后的,就是map后台存数据,输出时按照规定输出相应的文字界面。而搭配move移动指针就可以实现选择中文而后台读取数据实现相应功能。但我还没有利用到极致,第一次了解这个是知乎一位老师的文章打飞机里面的,他就是map只存一些数字,而设置好飞机,子弹,敌机对应哪些数字,界面是飞机大战,而后台却是数字大战。我的map依旧用的字符串数组,就不去修改了。
3.实现数使用字键的上下左右
getchar()在我印象里就只能取ASCII码表里的字符,感觉键盘上的↑↓←→这些根本用不上,结果后来看博客发现其实键盘上每个按键都有相应的ascii值只不过是占字符不同而已,然后我试下发现果然他们是由-32和一个数字组成的,这样就能很方便的用在我的指针选取上。问题是空格占一个,而上下左右占两个,怎么区分他们呢?我是先读取一个字符,如果是普通的wasd或空格则直接进行处理,如果字符值==-32则再读取一个字符然后进行相应处理,这样就能兼容wasd和↑↓←→和空格的同时操作了。
4.实现实时游戏数据图像可视化
游戏难写难在于不好写获取鼠标信息的函数,只能考键盘上的按键来实现功能,但又不能太繁琐。
为了实现游戏简单控制,本来是能wasd控制移动 qe顺时针逆时针旋转锤子的,但最后只留下空格跳跃,外设置了数字键以5为中心,其他8个方向按键控制锤子8个方向。
每次按相应方向的数字,左下角代表锤子相对人方向的圆圈就会变成实体,但满足跳跃或者翻转的时候,正方形就会变成实体代表可以按空格进行操作
5.实现游戏的重力系统,跳跃与翻越
游戏重力检测和重力下坠过程和,跳跃翻越过程都是非人为控制的,过程不是认为控制的意思就是你让他跳,他自
己要实现向上跳并且最高点后要自动下坠并且不影响你后续的输入。
这里依旧借鉴他人的处理方法,设置自动更新和人工输入更新两个函数,
人为输入即利用if(kbhit()) 判断是否有键盘输入
每次同时例遍两个函数,若有输入则判断进行了什么指令,而随后自动更新函数根据指令自动改变相应的值
简单的重力系统就是每次检索人的位置下面一格是否是空格,若是,则自动更新下落一个单位距离。
而自动改变的翻越则依照我之前做过的汉诺塔利用数组储存指令内容,实现自动变化。本游戏难点在于锤子在翻越
过程是不能改变位置的,因为锤子是人的附属物,他在show_move()函数是和人一起移动的,而方向不改变为此
我又单独设置一个锤子方向数字对应翻越指令移动人时如何改变锤子方向实现让锤子保持不动。
跳跃现在却变成最简单的了,即向上变化指令+自由坠落。
关键在于处理变化速度,和什么时候能加载重力,什么时候停止翻越到墙体里面,这都是只要简单的给人变化后坐
标进行个判断即可。
6.实现关卡间的跳跃与高空坠落
做这个破游戏的精华就是自由落体,玩正版掘地求升体验过无数次自由落体的快感(tong ku).没有自由落体就简直没有灵魂,所以地图要大,要高,要能让人下落地让人自闭的那种。所以我考虑过大地图+实现窗口跟随主角移动,但又困于刷屏限制,不可能做一个窗口跟随主角移动的同时还能流畅行动。就只能选择分割地图+关卡跳跃来实现了,每个独立的地图都带有出生点与下一关传送点的信息,而且每个地图的上界和下界都是进行上下关卡传送的,所以虽然看起来地图很随意,但都是能上下衔接的。并且高空坠落是能实现从最后一关直接坠落到家的。
7.实现游戏功能:重开,复位,跳关
关于游戏任意实现卡位,即上下左右不能移动,所以一开始是加入重开本关按钮的,但随即一想,又想到了每次跟踪输入并且记录更新前坐标,就实现了复位按钮,实测卡死时稳定复位,继续游戏。
关于跳关,要在设置里开启 开挂 按钮才能按n/b进行上下关切换。
8.设置开始界面与结束界面
几乎就是写完框架后就开始缝缝补补,没有很规范,但还好框架写的很好,修改灵活性都很高,开始界面临时夹在init里面,加入之前想到的加载系统,顺便直接把背景在里面讲完了,结束界面把汉字打进去可花费了不少时间。。
后续
游戏的不足 :
1.趣味性不够,写完大框架,进行缝缝补补后发现内容不是很有特色,设置关卡时,大部分不是在设置给别人挖坑上,而是在玩正版游戏找感觉给自己挖坑,玩到差不多自闭的时候,设置关卡的热情也消去了许多。导致目前也只有8个小关卡。
2.操作难叙述 ,虽然我最简化操作了,但是游戏机制如何我真难说明,尽量在新手教程里展现,但太多说明又繁杂,太少说明对第一次接触这个的又一头雾水。
收获和感受
这个破游戏,卡了我1/3 的假期,关键是我写游戏写了一个星期,玩正版掘地求升时间总和玩了将近一天,都还没通,感觉收获差不多规范了下写大程序的格式,对大程序的函数设置更加清楚,而损失就是,我没学什么新的东西
然后我最直观的感受就是: