游戏开发者的成长之路:C++经典项目控制台贪吃蛇(在GitHub热门项目上增添功能及修改bug)

前言

原项目GitHub下载地址:https://github.com/silence1772/GreedySnake
原项目CSDN教程:
https://blog.csdn.net/silence1772/article/details/55005008

博主在原项目的基础上,增加了如下功能:

  1. 全屏化显示:涉及不同分辨率下的自适配。
  2. (直至2020/11/10)原来的项目在游戏二级循环过程中存在逻辑上的bug:原项目将是否拾取限时食物的判断放在了移动判断之后进行,而拾取到限时食物又会导致蛇体以蛇头向前延伸一格的方式增长,这会导致玩家朝着墙体方向移动去拾取挨着墙体的食物时,会在下一次方向判断前直接蛇头增长而撞墙,直接导致游戏失败。(强烈建议看不懂这段话的同学去上面给的网址下载原项目试玩体验)
    而博主在改写项目代码时将限时食物拾取的逻辑改到移动判断之前进行,当玩家拾取限时食物时,将不再进行普通的移动(蛇头朝移动方向增长一格,蛇尾消失一格),而是采取蛇头向移动方向增长一格的方式替代(类似于拾取普通食物)。

博主改写项目的下载地址:
https://github.com/siming0202/GreedySnake

README

游戏的入口是 controller 类中的 Game 接口,为该游戏的一级循环。函数内使用 while(true) 构成了一个死循环,直到退出游戏时才会通过 break 语句退出循环结束游戏。函数内还调用了 StartSelect 等接口通过输出字符的方式绘制开始动画和选择界面,调用 DrawGame 绘制游戏界面,然后调用 PlayGame 接口进入游戏的二级循环,通过该接口的返回值判断玩家是否选择继续进行游戏。
游戏的二级循环中,首先动态创建 SnakeFood 对象,然后进入以 蛇是否撞墙或撞自己的身体 为条件的内置循环,若撞击成立则进入游戏失败的逻辑,调用 GameOver 接口绘制失败界面,根据玩家选择返回整型值,作为PlayGame的返回值传递至一级循环用以判断玩家做出的选择是重新开始还是退出游戏;若蛇并未撞墙或身体,则进入内置循环语句,调用 Snake->ChangeDirection() 来改变(或保持)移动方向,此时若玩家点击 ESC键 ,调用 Menu 接口绘制菜单,暂停游戏,随后根据该接口返回值决定继续游戏、重新开始、退出游戏。玩家点击其它按键将继续游戏,判断蛇是否吃到食物/限时食物(两者得分不同),吃到食物会进行得分更新、蛇体增长,若没有则进行普通移动,然后进入下一轮循环。

游戏的主要逻辑在两层循环中体现。

关键API

  • GetStdHandle() :
    获取指定的标准设备(包括输入设备、输出设备或显示错误的设备)的句柄。该函数的参数指定了要获取句柄的标准设备,返回值是指定标准设备的句柄。
//获取控制台输出窗口句柄
HANDLE handle_console = GetStdHandle(STD_OUTPUT_HANDLE);
if(INVALID_HANDLE_VALUE == handle_console) 
{
   
    std::cerr("……");    /* 输出错误信息 */
}
  • <windows.h>内定义类型成员COORD 表示字符在控制台窗口的坐标
  • <windows.h>内提供SetConsoleCursorPosition(HANDLE hOut, COORD
    pos)接口来定位光标的位置。
  • <windows.h>内提供SetConsoleTextAttribute(HANDLE hOut, WORD
    wAttributes)设定颜色
  • <Windows.h> Sleep函数:执行挂起一段时间

接口:unsigned Sleep(unsigned seconds)
注意:标准C中是sleep,所以在Linux下不要大写首字母。在VC中,Sleep()里面的单位是以毫秒为单位。

  • <conio.h> int _kbhit() : 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0;属

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值