寒假答辩作品——掘地求升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 的假期,关键是我写游戏写了一个星期,玩正版掘地求升时间总和玩了将近一天,都还没通,感觉收获差不多规范了下写大程序的格式,对大程序的函数设置更加清楚,而损失就是,我没学什么新的东西
然后我最直观的感受就是:
我真的不想再碰一下正版的掘地求升了
寒假答辩作品——掘地求升C语言版的更多相关文章
- 寒假答辩作品:Java小游戏
目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 3219: 求最高同学位置—C语言版
3219: 求最高同学位置—C语言版 时间限制: 1 Sec 内存限制: 128 MB提交: 207 解决: 115[提交][状态][讨论版][命题人:smallgyy] 题目描述 设一维数组存放 ...
- 求推荐go语言开发工具及go语言应该以哪种目录结构组织代码?
go语言的开发工具推荐? go语言开发普通程序及开发web程序的时候,应该以哪种目录结构组织代码? 求推荐go语言开发工具及go语言应该以哪种目录结构组织代码? >> golang这个答案 ...
- 算法:求幂(python版)
分别用迭代方法和递归方法实现求幂迭代方法的时间复杂度为O(n),空间复杂度为O(1)递归方法1的时间复杂度为O(logn),空间复杂度为O(logn)递归方法2的时间复杂度为O(n),空间复杂度为O( ...
- 求二叉树的宽度C语言版
/*层次遍历二叉树,每一层遍历完成以后都重新插入特定的指针 (比如本例使用的特殊指针是数据元素为#,左右儿子为空的指针), 这样在每次访问到所指向数据为#的队列中的结点指针是就知道该指针是这层的末尾, ...
- 求余VS求模--C语言中表述
之前看帖子,发现许多时候基本上大家都把求模和求余混为一谈了.但实际上二者的概念是有区别的 1. 求余 在C语言中,求余对应的操作符是%,且a%b求余的最后结果总是与a符号相同,最后的数值为|a|% ...
- 数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
- [zoj4046][树状数组求逆序(强化版)]
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4046 题意:有一个含有n个元素的数列p,每个元素均不同且为1~n中的一个, ...
随机推荐
- Go Web 编程之 数据库
概述 数据库用来存储数据.只要不是玩具项目,每个项目都需要用到数据库.现在用的最多的还是 MySQL,PostgreSQL的使用也在快速增长中. 在 Web 开发中,数据库也是必须的.本文将介绍如何在 ...
- kafka 中 zookeeper 具体是做什么的?
zookeeper 是 kafka 不可分割的一部分,可见其重要程度,所以我们有必要了解一下 zookeeper 在 kafka 中的具体工作内容. 而且,这也是面试时经常问的. zookeeper ...
- javaweb-codereview 学习记录-1
Servlet是在Java Web容器上运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑.值得注意的是在Servlet3.0之后(Tomcat7+)可以使用注解方式配置Se ...
- 关于C#程序的单元测试
目录 1.单元测试概念 2.单元测试的原则 3.单元测试简单示例 4.单元测试框架特性标签 5.单元测试中的断言Assert 6.单元测试中验证预期的异常 7.单元测试中针对状态的间接测试 8.单元测 ...
- 填充区域 (Populating an Area) | 使用区域 | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
- Python学习,第一课 - 基础学习
前言. 本内容全部以python3所讲 一.Python安装 windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\pyth ...
- 19_05_01校内训练[polygon]
题意 把一个边长为1的正n边形放到一个正m边形中,要求m边形完全覆盖n边形,可以有交点,并且中心重合.求正m边形的最小边长,至少精确到6位.要求logn计算. 思考 先考虑m|n的情况. 我们知道,正 ...
- [ZJOI2008]树的统计(树链剖分)
[ZJOI2008]树的统计(luogu) Description 一棵树上有 n 个节点,编号分别为 1 到 n,每个节点都有一个权值 w.我们将以下面的形式来要求你对这棵树完成一些操作: I. C ...
- C++基类和派生类的析构函数
1.派生类也不能继承基类的析构函数. 2.与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉. 3.构造函数和虚构函数 ...
- 使用Qt自动注册Lav
Qt播放视频使用QMediaPlayer要注册Lav解码器,如果手动去注册,每次去使用管理员运行命令或者生成.bat文件都比较麻烦. 解决方法步骤如下: 一:编写注册Lav解码器脚本,并取消控制台的显 ...