问题描述
昨天,我写了一段关于不同幻想生物战斗的代码。他们有内心(就像在电脑游戏中一样),进攻能力和防御能力。如果攻击者的攻击力大于防御者的防御力。比攻击力要从心中减去。当其中一个生物没有“心”或超过11个回合时,战斗应结束。但事实是,加法运算不起作用,心脏减法也不起作用。 问题出在哪儿? 预先感谢!
protocol Character {
var name: String {get set}
var creature: String {get set}
var specialAttack: String {get set}
var power: Int {get set}
var defence: Int {get set}
var hearts: Int {get set}
}
struct Creature: Character {
var name: String
var creature: String
var specialAttack: String
var power: Int
var defence: Int
var hearts: Int = 30
func attack() {
print("\(name) is attacking...")
}
mutating func defend(attackingPower: Int) {
if defence > attackingPower {
print("\(name) is blocking the attack...")
} else {
hearts -= attackingPower
}
}
var isAlive: Bool {
hearts > 0
}
}
var orc = Creature(name: "Arzog",creature: "orc",specialAttack: "dark knife",power: 6,defence: 7,hearts: 30)
var minotaurus = Creature(name: "Horus",creature: "minotaurus",specialAttack: "hornbump",power: 8,defence: 9,hearts: 30)
var troll = Creature(name: "Ortenstone",creature: "troll",specialAttack: "poison spit",power: 5,defence: 6)
var dragon = Creature(name: "Eragon",creature: "dragon",specialAttack: "fireball",power: 10,defence: 8)
var wizard = Creature(name: "Gandalf",creature: "wizard",specialAttack: "magicspell",power: 7,defence: 9)
var human = Creature(name: "aragon",creature: "human",specialAttack: "swoard",defence: 8)
var HorrorClown = Creature(name: "Pennywise",creature: "horror clown",specialAttack: "bite",power: 9,defence: 7)
struct Battle {
var world: String
var firstCreature: Creature
var secondCreature: Creature
mutating func start() -> Int {
var roundNumber = 0
func rounds() {
firstCreature.attack()
secondCreature.defend(attackingPower: firstCreature.power)
secondCreature.attack()
firstCreature.defend(attackingPower: secondCreature.power)
}
repeat {
print(" Round: \(roundNumber)")
rounds()
roundNumber + 1
} while !firstCreature.isAlive || !secondCreature.isAlive || roundNumber < 12
return roundNumber
print("Battle is over! \(firstCreature.name) with \(firstCreature.hearts) hearts and \(secondCreature.name) with \(secondCreature) hearts")
}
}
var BattleArena = Battle(world: "Middleearth",firstCreature: dragon,secondCreature: wizard)
BattleArena.start()
解决方法
据我所见,战斗应该继续
while firstCreature.isAlive && secondCreature.isAlive && roundNumber < 12
,
我可以发现3件事:
-
正如罗曼建议的那样,您应该将条件改写为:
while firstCreature.isAlive && secondCreature.isAlive && roundNumber < 12
因为只有两个生物都还活着并且少于12发,您才希望战斗继续进行。
-
在您的
repeat
块中,您将roundNumber
变量增加了1,但没有将增加的值分配回该变量。结果,您的roundNumber
变量保持不变,初始值为0。为正确起见,您必须将行替换为roundNumber = roundNumber + 1
或将其缩短至roundNumber += 1
-
您的
print
语句像在return
键之后一样永远不会执行。仅使用return
键即可直接退出该块,而使后面的行未执行。
完成这些操作后,我可以看到您的代码按预期工作。