DEV Community

Too Leng
Too Leng

Posted on

【ChaoCode】 Swift 基礎篇 7:類型 & Function

在 Int 中我們學過的靜態屬性有哪兩個?

Int.max 和 Int.min
在 String 中我們學過的實例屬性有哪兩個?
.isEmpty 和 .count
Function 和方法的差別是什麼?
只有可以使用的地方不一樣,Function 任何地方都可以使用,方法需搭配與之相關的類型或實例使用。

// 【ChaoCode】 Swift 基礎篇 7:類型 & Function 實作作業參考答案


// ⚠️ 這次的作業主要目的是練習「看別人寫好的類型」,並學會怎麼建立和使用相關的方法和屬性。請下載好我寫好的「Animal」類型並放入 Sources 中,接著跟著下列步驟完成作業。(如果不確定怎麼做,影片最後有示範。)

// 1️⃣ 請閱讀下載好的 Animal 類型,只要看有哪些屬性、方法和要怎麼呼叫那些方法。

// 2️⃣ 請印出戰鬥規則。
print("歡迎來到動物大亂鬥!這裡的規則是:\(Animal.戰鬥規則)")

// 3️⃣ 建立第一回合的選手:台北小野貓,血量 25,攻擊力 7;台東穿山甲,血量 40,攻擊力 4。
let 台北小野貓 = Animal("台北小野貓", hp: 25, power: 7)
let 台東穿山甲 = Animal("台東穿山甲", hp: 40, power: 4)

// 4️⃣ 開始第一輪戰鬥,由台北小野貓先攻,並印出戰鬥紀錄。
print("第一輪戰鬥開始!")
var winner = 台北小野貓.戰鬥(對上: 台東穿山甲)

// 5️⃣ 請幫獲勝的動物補充血量 25,並印出更新後的血量資訊。
winner.hp += 25
print("🍼 \(winner.name)喝了超能能量飲,現在血量為 \(winner.hp)。")

// 6️⃣ 接著由獲勝的動物和一位隨機動物戰鬥,這次由隨機動物先攻,並印出戰鬥紀錄。
print("第二輪戰鬥開始!")
winner.戰鬥(對上: Animal.隨機(), 我方先攻: false)


Enter fullscreen mode Exit fullscreen mode

这是库文件

import Foundation

/// 一隻可戰鬥的動物。
public struct Animal
{
    public let name: String
    public var hp: Int
    public let power: Int

    /// 建立一隻動物,血量範圍為 1 ~ 50,力量範圍為 1 ~ 10,超過範圍將取最接近值。
    /// - Parameter name: 名字
    /// - Parameter hp: 血量
    /// - Parameter power: 力量
    public init(_ name: String, hp: Int, power: Int)
    {
        var name = name.trimmingCharacters(in: .whitespacesAndNewlines)
        if (name.count == 0) { name = "無名氏🥲" }

        self.name = name
        self.hp = hp < 1 ? 1 : min(50, hp)
        self.power = power < 1 ? 1 : min(10, power)
    }

    /// 和另外一隻動物戰鬥。預設是我方先攻。
    /// 這個方法會印出對戰訊息並回傳獲勝的動物。
    /// - Returns: 獲勝的動物
    public func 戰鬥(對上 敵人: Animal, 我方先攻: Bool = true) -> Animal
    {
        var attacker = 我方先攻 ? self : 敵人
        var defender = 我方先攻 ? 敵人 : self
        print("⚔️⚔️⚔️ \(name)(HP \(hp) 力量 \(power)) VS \(敵人.name) (HP \(敵人.hp) 力量 \(敵人.power))⚔️⚔️⚔️")

        while (attacker.hp > 0 && defender.hp > 0)
        {
            defender.hp -= attacker.power
            let hpMessage = defender.hp > 0 ? "\(defender.name)血量剩餘 \(defender.hp)。" : "致命一擊!\(defender.name)被打倒了。"
            print("\t\(attacker.name)\(defender.name) 造成了 \(attacker.power) 點傷害! \(hpMessage)")
            (attacker, defender) = (defender, attacker)
        }

        print("✨「\(defender.name)」獲勝!🏆")
        return defender
    }

    public static let 戰鬥規則: String = "兩隻動物輪流攻擊,1 點力量可以消耗對方 1 點血量,先讓敵方血量歸零者獲勝。"

    /// 隨機產生一隻動物
    public static func 隨機() -> Animal
    {
        let names = "🐶🐱🐹🐰🐻🐼🐻‍❄️🐨🐯🦁🐮🐷🐸🐵🐔🐧🐤🦊🐴🦄🐝🐛🦋🐌🐞🐢🐙🦑🦀🐠🐟🐡🐬🦭🐳🦉"
        return Animal(String(names.randomElement()!),
                      hp: Int.random(in: 10...50),
                      power: Int.random(in: 1...10))
    }
}


Enter fullscreen mode Exit fullscreen mode

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay