基于 Swift 从零到一开发贪吃蛇游戏(三)

316 阅读3分钟

本项目是用于 Swift 初学者的一个教学练习项目,我们最终的目的是基于 Swift 做出下面这样的一个贪吃蛇小游戏。

完整 Demo 地址:RickeyBoy/SnakeGame

我的笔记文章合集地址:RickeyBoy/Rickey-iOS-Notes

如果大家感兴趣,欢迎点赞收藏~

第二步:写 UI 相关的代码

步骤 1:UI 代码框架搭建

接下来我们先写 UI 相关的代码,也就是 Layout 文件夹中的部分

shot_2427.png

最终会需要新建这么三个文件:

  • GameView:游戏区域
  • UnitView:游戏区域中每个单位小格子
  • LogView:上方的信息展示区域

用最终的截图来展示的话就能很一目了然了:

shot_2428.png

步骤 2:详细讲解 UnitView

对于每一个小方格而言,核心会有两个属性。

首先会必须要有一个坐标的概念,代表他所处的具体的位置。

其次,一个小格子一共有四种展示情况,这四种情况分别展示不同的图片样式:

  1. 蛇头:展示绿色菱形
  2. 蛇身:展示绿色圆形
  3. 食物:展示星星
  4. 空白格子:不展示任何图片

这里我们根据需要,可以判断样式需要使用 enum

/// UnitView 类型
enum UnitViewType {
    case snakeHead /// 蛇头
    case snakeBody /// 蛇身
    case food /// 食物
    case normal /// 空白格子
}

而坐标需要使用使用 struct 来定义:

/// 坐标
struct Pos {
    var x: Int
    var y: Int
}

所以 UnitView 的情况是(简化版):

shot_2429.png

知识点:Swift 中的结构体和枚举

这里穿插讲一个刚才涉及到的知识点。我们可以注意到刚才的代码中,UnitView 类型使用的是enum 枚举类型,而坐标 Pos 使用的是 struct 结构体。那这两个类型有什么异同呢?

在 Swift 中,除了我们最熟悉的 Class 之外,struct 和 enum 这两种类型也经常被使用:

  • struct (结构体) :用于定义自定义数据类型,可以包含多个属性和方法。结构体是值类型。
  • enum (枚举) :用于定义一个有固定数量的常量集合,可以有原始值,也可以关联值。枚举可以定义方法。
特性structenum
类型自定义数据类型固定数量的常量集合
存储值类型值类型(默认)或引用类型(如果定义为 class)
属性可以有多个属性通常没有属性,但可以扩展
方法可以定义方法可以定义方法
原始值不适用可以有,用于存储额外信息
关联值不适用可以有,每个枚举案例可以关联不同的数据类型
继承不能被继承不能被继承
构造器可以有构造器可以有构造器

Swift 中的 enum 可以非常强大,可以拥有方法、原始值和关联值,使它们在某些情况下可以替代 struct。然而,struct 由于是引用类型,通常用于定义更复杂的数据结构。

那么刚才的代码里为什么要这样使用呢?

UnitViewType 使用 enum 是因为它语义上表达了一组固定的离散状态(如蛇头、蛇身等),明确、直观。Pos 使用 struct 是因为坐标是一个简单的数据结构,语义上表示一组绑定的值(x, y),便于封装和操作。

所以简单总结,我们可以得到这样的概括:

enum 的应用场景:用来定义有限的选项集(状态、类型、选项等),语义明确且类型安全。

struct 的应用场景:适合表示简单的数据结构(属性集合),支持值语义且更轻量。


这一期已经开始写代码了,并且讲到了一个重要知识点,下一期我们继续~