寒假答辩作品——掘地求升C语言版

寒假答辩—掘地求升(C语言版)

前言

这个是作为寒假答辩作品写的。

之前考虑过用Unity写个游戏,但毕竟不熟悉C#,感觉几乎都是在套模板,而且写着不顺手,有想法却只能

看着C#发呆,很是无奈,所以决定还是选熟悉的C语言写一个大程序。正愁没灵感的时候,我突然看见了它:

然后我开始了几天快乐并痛苦的自闭抡锤子之旅,然后又痛苦并快乐的用C写下了这个游戏qwq。

github代码:https://github.com/404name/C-game/blob/master/掘地求升

答辩网页:https://www.ctguqmx.com/article/category-14

游戏画面

加载页面

游戏界面


游戏结束


实现效果

整体函数调用介绍

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 的假期,关键是我写游戏写了一个星期,玩正版掘地求升时间总和玩了将近一天,都还没通,感觉收获差不多规范了下写大程序的格式,对大程序的函数设置更加清楚,而损失就是,我没学什么新的东西

然后我最直观的感受就是:

我真的不想再碰一下正版的掘地求升了

原文地址:https://www.cnblogs.com/404name/p/12234419.html

时间: 2024-08-01 12:39:44

寒假答辩作品——掘地求升C语言版的相关文章

寒假答辩作品:Java小游戏

目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https://github.com/404name/WinterReplyWorks 网盘(提取码pzgt):https://pan.baidu.com/s/1-JoHOCKYl_56fKCzhEmMvg 前言 (可直接跳到程序介绍) 前期入门小项目 过年这段时间在家写了两个C语言的大程序,当初在学校立的fla

求推荐go语言开发工具及go语言应该以哪种目录结构组织代码?

go语言的开发工具推荐? go语言开发普通程序及开发web程序的时候,应该以哪种目录结构组织代码? 求推荐go语言开发工具及go语言应该以哪种目录结构组织代码? >> golang 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/golang/1010000008839459/求推荐go语言开发工具及go语言应该以哪种目录结构组织代码.html

【C语言及程序设计】项目1-26-2&3&5:成绩等级 & 分段函数求值switch语句版 & 个人所得税计算器switch语句版

switch语句常用于解决多分支.分段问题,该语句的关键就在于将具体问题中的分段.分支条件转化为常量constant. 首先,一定要理解switch语句是如何执行的: 项目1-26-2:成绩等级 1 /* 成绩等级(switch).cpp: 2 问题描述:给出一百分制成绩,要求输出成绩等级'A','B','C','D','E'.90分以上为'A',80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'. 3 */ 4 5 #include "stdafx.h&quo

3219: 求最高同学位置—C语言版

3219: 求最高同学位置-C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 207  解决: 115[提交][状态][讨论版][命题人:smallgyy] 题目描述 设一维数组存放了n(<100)名同学的身高,编写函数求身高最高同学的位置,如果结果有多个,需要输出所有人的位置.部分代码已给定如下,只需要提交缺失的代码. #include<stdio.h> int main() { int getHeight(float height[],int n,int resul

月考核答辩作品——基于STC89C52的智能浇花系统

1.作品功能 考虑到养一盆花需要花费一些精力,所以设计此次作品.其主要功能有通过检验土壤湿度值来实现自动浇花,当然在有水源的情况下.自动浇花的过程会伴随美妙的音乐(鬼畜的音乐也行,只要你想得到的,没有软件实现不了的,嘿嘿)响起,音乐结束,浇花过程停止,其上还可以通过按键选择显示屏显示时间,温度,同时也可通过按键操作来进行调整时间. 2.器件选择及实施方案 下面给出一张结构图 (1).通过ds1302时钟芯片使万年历得以实现 (2).通过DS18b20温度传感器检测外界温度 (3).通过L298N

新人作品。。求点评,交朋友。

新人的作品 求点评啊....请大家多给我建议 和意见.求大神帮吗点评... 如果大家有兴趣的话可以来我们的百人大群..我这里有经验高的web前端开发工程师,后台工程师,web设计师.这里有很多教学资源哦!还有大家积累的经验. 群号: 66067678  期待你的加入

作品第二课----求数组中所有数字的和

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> div { display: inline-block; margin-left: 37%; } button { margin-top: 10

[小作品][JS][JQuery]求两个字符串的最大公共串

算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设成零,最后矩阵中最长的不为零的对角线就是最大子字串. 例如:   m a c h i a 0 1 0 0 0 b 0 0 0 0 0 m 1 0 0 0 0 a 0 1 0 0 0 c 0 0 1 0 0 这样有点问题:建完矩阵还要去找最长对角线,麻烦. 解决方案是:相等时不只把矩阵元素设为“1”,而是设成它左上角的元素值加一. 例如:   m a c h i a 0 1 0 0 0 b

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=