纯C实现命令行魔塔游戏
详细流程图:
项目地址
可根据源代码结合详细设计、特性来看,应该很容易看懂!
求star呀!(虽然很菜)
项目地址
游戏下载
关于
这是一个仓促的数据结构课程设计,所以其实这个游戏的很多内容是没有做完的,但是基本的逻辑都已经完成了,接下来的添加怪物等过程,无非也就是重复劳作而已。
特性
更为详细的介绍请进入GitHub项目里面的 魔塔游戏.xmind 文件即可查看!
- 使用面向对象的特性实现地图的每一个元素。最重要的是使用的C语言实现面向对象的思路,比如TBase的继承,比如函数指针的使用实现碰撞函数,实现了多态,又或者用static关键字把数据封装,然后再用get和set。
- 使用工厂模式创建地图上的每一个元素。具体来说是通过指定枚举类型便可通过一个工厂创建具体实例。
- 使用宏定义对战斗逻辑的代码进行化简。由于战斗逻辑都是相同的,除了不同类型的对象属性不同,其余没有任何差别,故通过宏定义实现泛型即可完成代码复用。
- 位运算实现武器系统和怪物系统的判断。
…更详细的解读,可以看我的xmind流程图文件。需要本地有xmind软件才能查看哦。。
详细设计
关键架构
只要实现工厂模块和碰撞检测这两个模块后,那么后面的各种地图元素模块的添加,都只需要实现一个碰撞检测函数和创建函数,然后往工厂模块中注册对应的创建函数即可。
创建工厂模块
通过一个函数能够创建一个对象,如果按照平常的情况来看,由于我们需要的对象非常多,则需要多个函数来创建对应的类型对象。为了避免创建逻辑过于复杂,我们就构建了一个创建工厂。如何构建一个创建工厂呢? 首先,我们将每一种类型的对象通过不同的枚举值记录,其次,我们需要将创建对象的函数统一接口,在C语言中,函数统一接口的含义就是把函数的参数类型统一,通过函数指针便可利用这些统一的函数实现自由的多态切换,最后,我们定义这个接口类型的指针数组,通过数组下标和对象所对应的枚举值的映射,可以完成通过枚举值得到对应的函数指针,然后调用对应的创建函数完成这个类型的对象创建。
碰撞检测模块
碰撞检测模块也是一个统一的函数接口,只需要在结构体里面添加该接口的函数指针,存下该类型的碰撞检测函数,具体而言,这个函数的第一个参数需要是THero类型,第二个参数是 void*
类型,首先,第一个参数传入地图中的英雄类型,方便根据该次碰撞的具体类型来调整英雄具体参数。其次,由于第二个参数是 void*
类型,所以自由度非常的高,而我们这里利用void类型,外面传入当前物体对象的地址,然后在碰撞函数内部将void类型的地址强转为我们需要的类型,这样我们就可在碰撞函数内处理当前碰撞到的对象,比如碰撞到怪物后我们需要战斗完后把怪物删除。最后,我们可以根据返回值判断英雄是否要移动,如果返回值为0则英雄移动,否则不动。
场景模块
这个模块是一个结构体,内部包含一个Tbase数组,和index字段,当我们需要打印当前场景的时候,只需要利用index字段遍历Tbase数组即可完成。
基类模块
地图元素的共有模块:x,y 坐标,type记录类型,CollionCB用于存下该元素对应的碰撞函数,printName存下该元素打印的字符串,name存下该元素字符串的全称。
子类模块
英雄人物模块
是一个继承与Tbase类型的结构体,具体整个模块包含结构体和创建函数,以及英雄信息打印函数,对hero结构体进行封装,然后通过函数GetHero对外公开。具体如下图:
怪物模块
怪物模块包含多种类型的怪物,但整个怪物模块都是由三个部分组成:
- 怪物属性
- 怪物的创建函数
- 怪物的战斗逻辑。
由于战斗逻辑代码所有的怪物都是一样的,除了因怪物类型而产生的打印属性差异,所以为了节省代码量,让代码的可复用性增强,用了宏定义实现不同类型的泛型复用。
战斗逻辑的宏定义图片:
以Master怪物类型为例:
…
其他的门、钥匙、传送门啥的,都一个套路,无非就是碰撞函数+创建初始化的工厂注册过程。
今天的文章C课程设计——魔塔游戏分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/61698.html