C++实战(二):贪吃蛇

业精于勤荒于嬉,行成于思毁于随。韩愈先生的这句话一直挂在大学宿舍的电梯里,然而我大学的多半时光终究还是荒于嬉,毁于随了。工作之后,悔恨不已。

大学时的专业是化学,计算机方面的课程只有计算机基础和C语言这两门。学完C语言之后,发现自己能写的东西仅限于在控制台中打印各种几何图形(期末考试必考啊)。后来,在社团里认识了不少计算机专业的同学,发现同样是用C写控制台程序,他们写的东西在当时的我看来简直是酷极了——贪吃蛇和俄罗斯方块。今天,我们实战的内容便是用C++完成贪吃蛇

程序结构

  • 两个线程
    • 主线程负责创建子线程以及处理按键事件
    • 子线程负责UI展示以及贪吃蛇的运动、觅食、碰撞检测等行为表现。
  • 两个类
    • GameMap类负责绘制游戏区域、产生食物以及碰撞检测
    • Snake类负责贪吃蛇的运动、觅食等行为

代码分析

先来看Snake类的定义。这里需要提一下的是vector的使用。vector是STL(标准模板库)中的一个类,大家可以把它当成动态数组来使用。关于vector的详细用法,这里就不展开讲了,建议大家去搜一下,有很多介绍它的博客。

Snake类的具体实现如下

GameMap类用到了STL中另一个类——set,也就是集合。集合有一条很重要的特性——集合里的元素不允许重复。而set判断两个元素是否重复的依据是看这两个元素是否大小相等。所以如果想在set中存储自定义类型的元素,就定义一个比较函数来帮助set来比较元素的大小。拿这里用到的COORD类型来说,如果在set中放入(2,3)和(3,2),set知道int型数据3比2大,2比3小,所以可以依此来判断2和3不重复,但是set并不知道(2,3)大还是(3,2)大,所以set就无法判断这个两个元素是否重复。

GameMap类的具体实现如下

有了Snake和Map,接下来就看看主程序。

至此,贪吃蛇完成。

 

 

 

在 “C++实战(二):贪吃蛇” 上有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注