练习:贪食蛇
练习范围
- MVC
- DTO (Data Transfer Objects)
- Quartz 2D
- Delegate
- Queue 资料结构
- NSTimer
- UIGestureRecognizer
练习目标
我们要写一个iOS 版本的贪食蛇游戏:
- 这个游戏一开始画面中央只有一个开始按钮,按下开始之后才会开始游戏
- 游戏开始时,画面中央有一条长度为2 单位的蛇,另外有一个水果,蛇的初始方向是往左方走
- 每格0.5 秒蛇会移动一格
- 我们可以用swipe 手势改变蛇的方向,但蛇只能够往左右转。 也就是,当蛇在往左方走的时候,只有往上或往下的swipe 手势有用
- 如果蛇的头碰到了水果,蛇的身体长度就会加2 单位
- 如果蛇的头碰到了画面边界,会从画面的另外一边冒出来
- 如果蛇的头碰到了自己的身体,游戏结束,重新出现开始按钮。 按下开始按钮会重新开始游戏
练习内容
MVC
我们使用MVC 架构写这个小游戏
Model:
- 蛇的 Model - property 包括: - 蛇目前的身體每個座標點的 array,座標點是我們自己定義的 Class,只有兩個屬性:x 與 y,都是 NSInteger - 蛇目前的行進方向 - method 包括: - 要求蛇移動一格 - 要求蛇增加長度 - 詢問蛇現在頭是否碰到自己的身體 - 詢問蛇的頭是否剛好碰到某個點
- 水果:就只是一个座标点
- View:
- 负责在画面中使用Quartz 2D 绘制蛇与水果
- 上面被加上了UIGestureRecognier 的动作,指向Controller,当发生Swipe 事件时,会通知Controller 要改变蛇的方向
- Controller:
- 拥有蛇与水果的Mode
- 拥有View
- View 与Controller 是delegate 的关系,当View 要重绘时,会跟Controller 索取一次蛇与水果的Model
- 执行一个Timer,每执行一次,会要求蛇移动一格,并要求View 重绘一次。 并且检查蛇是否撞到了水果或自己的身体,决定是否要延长蛇的身体,或是宣布游戏结束
Queue 资料结构
蛇的身体其实是一个Queue,Queue 里头是一堆座标,当蛇在移动的时候,事实上是位在尾巴的座标物件被pop 掉,而我们从蛇的头的位置push 进一个座标。
单元测试
我们要对蛇的Model 写单元测试。写单元测试时,要注意AAA 原则:Arrange、 Act、Assert。像是:
- Arrange:先定义蛇如果要移动一次,移动后身体应该会出现在什么位置
- Act:要求蛇移动一次
- Assert:确定蛇在移动之后,身体位置跟我们在Arrange 时设定的位置一致
我们应该先写蛇的Model,然后写单元测试,最后才去写View 与Controller。