练习:贪食蛇

练习范围

  • 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。

results matching ""

    No results matching ""