期末小作业——2048小游戏

写在前面


程设期末没考试,但是要做一个2048游戏的小作业
虽然tw老湿并没有作出格外的要求,但我还是上了QT写了图形化的界面(虽然写的很丑)
这里并没有用上signal和slot之类的特性,因为暂时还用不上。。希望后面能发现更好的写法

在上了半个学期的SICP(实验课)之后体会到了python里变量和指针各自的好处,于是现在更喜欢指针和变量分的比较开的cpp了。这是第一次主要使用指针和各种类的cpp programming,感觉写完一遍下来对cpp的理解有了一点变化,面向对象还挺有意思的。

由于是第一次写比较大规模的project,其中的一些(很多)地方会有不妥之处,可能(大概率)还会有各种指针方面的隐患,但是这个project是能跑的,暂时我就不管了。回去看一下樾哥的软件分析再看看怎么说,毕竟现在还算没有很好的正式入门吧

然后就没啥好说的了,还不会用git但是已经感受到了大project版本控制的重要性,在学了.jpg

官方要求


  1. 实现2048游戏的基本操作(上下左右,合并规则,合并顺序,随机新方块)
  2. 显示得分
  3. 回退操作(留坑待填)
  4. 存档/读档操作
  5. 输判断

我的额外实现


  1. 图形化界面
  2. 方向键控制
  3. (并不)流畅的动画
  4. OOP
  5. 方块颜色

设计构思


当前游戏状态表示为一个GameState类的实例,用一个N*N的棋盘指向方块
移动比较简单,合并的时候可以拆分成:移动->合并相邻->移动的操作

得分也没啥好说的,合并的时候算就可以了

回退在非GUI的版本是用stack记录历史版本的指针,当前局面都是一个指向新局面的指针
这里需要说一下复制函数。如果类中存在指针,那么在复制类的实例时默认的复制函数只会复制指针而不会复制指针指向的内存空间。而在这里我们如果使用默认的复制函数则只会得到若干个指向实际上是同一个局面的内存空间的指针,所以需要重写一下复制函数。这一点在GUI版本中还没有做

存档和读档刚写完。具体而言就是把每个格子里的数字和总分通过文件储存就完事了。这里唯一的新东西就是fstream读写文件,细节可以看代码,没有什么难度

输赢的判断也很简单,放在分数更新之后就可以了。这里用到了QMessageBox做一个小的弹窗,实现也只要看代码就可以理解,无难度

图形化界面这里选择了QT,因为同班的朋友(卷友)选择的也是这个,处于好交流方便抱大腿的目的,我也选了这个路子。据说还有EasyX这样的选择,大家也可以去试试(我还没试过)
每个Tile都是一个PushButton,因为这个看起来最像原游戏的设定...

动画用的则是QT里的QPropertyAnimation,具体使用方法可以看代码。每一段动画都是new出来的一个实例,在delete的时候要小心对付。

早期(指今天以前)就有了动画的实现,但是因为我选择了“移动->合并->移动”的路线,所以Tile在动画完成之前就已经被delete了,使得合并的方块就没有动画效果。后面想了很久发现用一个Queue储存被合并了的Tile,在跑完动画之后再延迟删除就可以实现比较好的动画效果。这里可能是写得最久的地方,而且现在动画也有点怪怪的,不知道还有没有更优雅的实现...

关于OOP,这里总共就涉及到了两个类,分别是游戏状态和每个小方块。因为之前做过SICP的Ants的project,因此这里也就照葫芦画瓢

最后还做了一个方块颜色渐变的设计,随着数字增大方块灰度会逐渐加深,目前上限是8192,因为再大就显示不全了...

然后就没啥好讲的了

代码


丢在github上了,可以看这里
https://github.com/olahiuj/Project_2048

本文来自博客园,作者:jjppp。本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议

原文地址:https://www.cnblogs.com/jjppp/p/14141014.html