本次贪吃蛇项目已实现的功能
背景音乐,欢迎界面,各种菜单选项,暂停游戏,重新开始,储存与读取游戏进度。
普通模式(撞墙gg) 穿墙模式(可以穿过墙不死,障碍物除外)
单蛇自嗨,双蛇对战。
计分功能,等级功能,等级越高蛇速度越快。
各种类型食物:让自己,对方变长变短。让对方无法转向,或者方向反转。
炮弹食物,可叠加。双蛇都具备攻击技能,可以发射炮弹。
冰块地形,进入会加速。
单蛇普通与穿墙模式最高分数记录,英雄排行榜。
自定义编辑地图,保存地图,使用自定义地图开始游戏。
源码分享:https://github.com/Mr-Hock/MySnake
主要类:POINTDATA
所有图形都是由每个独立的坐标点组成的
普通模式
撞墙或者撞到障碍物死亡
穿墙模式
可以穿过四周的墙壁,从另一边出来,但是对障碍物无效
穿墙模式穿墙模式主要是在碰到墙壁后再进行一次操作
判断蛇头的位置,如果等于墙壁的边缘位置
则直接修改到另一边墙壁的位置
双人对战 – 使用2个蛇类
分别对2个不同的蛇类坐标数组进行操作。
使用while循环,用_getchar接受按键输入。
循环内包含其他双蛇判断操作
吃不同种类食物让对方产生效果
让对方的按键方向反转或禁转向的食物,实现方法:
主线程循环内判断是否吃到该种类食物
置入异常状态与取出异常状态是否有效
实现方法:
发炮弹
玩家是否能发炮,判断是否有炮弹食物,如果没有就牺牲长度发炮,最短不能小于5
炮弹打到自己或者对方则死亡,打到墙壁或者障碍物后炮弹消失
炮弹发出规则与方向
如果在墙壁或者障碍物前面
则无法发炮
炮弹发出后将定位在蛇头移动方向坐标+2
实现方法:
炮弹消失规则
炮弹打到自己或者对方则死亡,打到墙壁或者障碍物后炮弹消失
要用倒序循环,不然删除的时候会影响后续判断的数组元素位置
实现方法:
冰面上加速
加速方法就是改sleep时间
实现方法:
储存存档。
仅存储蛇头,蛇身坐标点分布,颜色,使用写出二进制文件的方式保存。
储存格式与顺序:蛇坐标点数量-蛇的坐标点数据pointdata类动态数组,移动方向,分数
最后写出文件,普通:Normal2 .sav 穿墙:Wear .sav
读取存档。
读取:首先new一个pointdata类的内存空间,将数据读入这个内存空间
读取顺序:先读取前面4字节,为pointdata类的数量,然后for循环依次读取数据
再读取蛇的移动方向,还有分数,还原上一次的记录
读取数组的数据要重新将pointdata 类内的m_data储存的值重新改一下
因为这个成员储存的是上一次的字符串地址,并非图案。
最后push_back将这个数据加入动态数组最后一个位置即可
自定义地图
主要使用检测鼠标函数完成绘画
检测鼠标点击的位置,将设计画面分为3个框架
绘图区,工具界面区,保存与退出区
绘图区操作技巧
在绘图区按住鼠标左键可以连续绘画,按住右键连续擦除
实现方法:
主要用INPUT_RECORD结构体内的成员dwButtonState数值判断
自定义地图
鼠标消息实现判断
因为这是一个被循环执行的函数,所以使用static定义一个局部静态变量保存。
如果鼠标左键按下赋值1,放开赋值0.
然后判断鼠标移动消息,如果值不等于0且移动了,则取出坐标传入类方法进行连续绘图或擦除
储存自定义地图
首先将Map类所有画出的坐标与图案进行判断归类,分别压入不同类型的动态数组内
然后再按动态数组类型进行保存
先储存数组元素的数量,再储存数组内的数据
最后以二进制的形式写到文件
读取自定义地图
首先读出数组的数量
再接着往后读取数组的数据
读取后存入申请的临时空间
并将m_data重新赋值
因为读出来的是上一次字符串地址,并不是图案
根据特定的写入顺序,然后还原特定的图案重新赋值m_data