返回

一盏灯的兴衰:Swift 游戏开发之「能否关个灯」(一)

IOS

在上一篇文章中,我们已经完成了对《能否关个灯》小游戏的界面和游戏逻辑进行了初步搭建,并且也具备了一定的可玩性。但细心的你会发现,这种「随机过程」的游戏开局,我们几乎一把都不会赢,因为这并不符合这个游戏的初衷——逆序出开灯的顺序去关灯。 在现有代码中,每次新开局游戏里各种灯的状态都是随机的,这样一来,即使我们按规律去点击关灯,也往往会出现「白费功夫」的情况。因为开局的随机状态很可能与我们设想的顺序并不一致。

那么,有没有办法让游戏开始时,灯的状态是确定的呢?

答案是肯定的。我们只需要在游戏开始时,对灯的状态进行人为的初始化即可。

具体来说,我们可以这样做:

  1. GameScene 类中,添加一个新的属性 initialState,类型为 [Bool],表示灯的初始状态。
  2. didMove(to:) 方法中,将 initialState 初始化为我们希望的状态。
  3. newGame() 方法中,将灯的状态重置为 initialState

这样一来,每次游戏开始时,灯的状态都是确定的,我们就可以按照规律去点击关灯了。

以下是修改后的代码:

import SpriteKit

class GameScene: SKScene {

    // 游戏中灯的状态
    var lampStatus: [Bool] = []

    // 灯的初始状态
    var initialState: [Bool] = []

    override func didMove(to view: SKView) {
        // 初始化灯的初始状态
        initialState = [false, true, false, true, false, true, false, true, false]

        // 创建灯
        for i in 0..<9 {
            let lamp = SKSpriteNode(imageNamed: "lamp_off")
            lamp.position = CGPoint(x: 100 + i * 100, y: 200)
            lamp.name = "lamp\(i)"
            addChild(lamp)
        }

        // 新开局游戏
        newGame()
    }

    func 新游戏() {
        // 将灯的状态重置为初始状态
        lampStatus = initialState

        // 更新灯的显示状态
        for i in 0..<9 {
            let lamp = childNode(withName: "lamp\(i)") as! SKSpriteNode
            lamp.texture = SKTexture(imageNamed: lampStatus[i] ? "lamp_on" : "lamp_off")
        }
    }

    // ... 省略其他代码 ...
}

修改后,游戏开始时,灯的状态将变为:

[false, true, false, true, false, true, false, true, false]

这样一来,我们就可以按照以下顺序去点击关灯了:

2, 4, 6, 8, 7, 5, 3, 1, 9

小提示:

如果你觉得这个顺序太难记,可以自己设计一个更简单的顺序。只要确保这个顺序是逆序的即可。

总结:

通过对灯的初始状态进行人为的初始化,我们可以让游戏开始时,灯的状态是确定的,从而使得游戏更加可玩。

在下一篇博文中,我们将继续探讨《能否关个灯》小游戏的其他玩法和技巧。敬请期待!