Re: 贪吃蛇

本文讲述了作者在得知有贪吃蛇作业后,提前用C++编写了一个贪吃蛇游戏,但在正式发布时遇到问题。文章详细介绍了游戏的本体、输入与输出的实现,特别是使用curses库实现的实时交互。之后,作者根据要求用ANSI C重写了代码,优化了数据结构和方向表示,实现了自动运动,并分享了重构过程中的反思和改进。
摘要由CSDN通过智能技术生成

致阅卷人:请直接跳至“新·贪吃蛇”部分

在作业发布的两个月前,我提前知道了将会有贪吃蛇作业。所以当时熬夜攻关,写出了一个贪吃蛇。然而到等到作业正式发布的时候,我惊讶地发现,我的代码完全不能过关……

元·贪吃蛇

原本的贪吃蛇由于想使用队列来模拟一条蛇,所以使用了C++的STL库。
将游戏的本体单独制作成一个类,主函数负责处理用户输入与系统输出,另外有一个控制蛇自动前进的模块。

本体

一个完整的贪吃蛇游戏有以下组件:
1. 场景
2. 蛇
3. 水果

对于游戏中的任意一个方块,它的状态只有以下几种:
1. 空闲的方块
2. 被蛇的身体占用
3. 被水果占用
4. 是墙

这就方便了我们使用一个枚举类型来表示方块的状态:

typedef enum BLOCK_STATUS {
    spare,
    wall,
    snake,
    fruit
} blockStatus;

另外,由于蛇需要自动运动,必须要存储一个变量来记录蛇的运动方向。于是我又创建了一个枚举类型来表示方向:

typedef enum SNAKE_FACING {
    snake_up,
    snake_down,
    snake_left,
    snake_right
} snake_facing;

贪吃蛇很重要的部分是蛇的运动。蛇在每一次运动时候都需要对它前方的方块进行特别处理。
大体思路为:
1. 获取蛇尾的方块的指针
2. 将蛇尾的状态设置为“空闲”,即蛇尾先收缩
3. 根据蛇的面朝方向,调整蛇头的xy坐标
4. 根据蛇头的新xy坐标,获取相对应的方块指针
5. 根据新蛇头所在方块的状态,分以下情况:
* 墙和蛇身体:游戏结束,调用postGameOver()处理善后事宜
* 水果:蛇的尾部方块状态重新变成“蛇身”;将蛇头加入队列;将蛇头的方块状态设置为“蛇身”;如果全部方块都被蛇占据,则游戏胜出,否则重新放置水果
* 空闲:将蛇头方块状态设置为“蛇身”;将蛇头加入队列;蛇尾离开队列

根据这样的思路,可以写出如下代码:

void snakeStage::moveSnake(void) {
    blockStatus *freedBlock = snake_body.front();
    changeBlockStatus(freedBlock, spare);
    blockStatus *nextBlock;
    switch (currentFacing) {
        case snake_up:
            snake_head_y--;
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值