大家好,我是小拍,我已经想出来怎么写描述剑客比武的代码啦。
没错,就是从“剑客‘和’比武‘这两个关键字入手的。建立两个类,换句话说就是做两个模版:
有了这两个模版,“月圆之夜,紫禁之巅”就可以表达成:叶孤城和西门吹雪是“剑客”类生成的两个实例(对象),而紫禁之巅则是“比武”类的实例。
先来看剑客(Warriors)这个类,我们从两个角度来分析
特征(属性):
姓名、武功高强(有多高?)、最大攻击力、最大防守力
行为能力(方法函数):
进攻:每次出手攻击的力道不是恒定的,跟策略、状态、形势都有关系,为了简单,我们让这个力度随机产生的,进攻值=最大攻击力 * 0和1间随机产生的数值
防守:同进攻,防守值=最大防守力 * 0和1间随机产生的数值
(我见过扮相最pro的大侠)
再来看比武(Battles)这个类,属性可以给个地点啥的。我们把重点放在方法函数上
第一个行为函数:
比武开始(launchAttack),两位选手开始过招。实际情况千变万化。可能是一个佛山无影脚连环踢,对方连连后退毫无还手之力,
也可能是一方开始攻势凌厉,却后劲不足,另一方以守为攻,后面却越战越勇.......
确定不可能的一种情况就是:我打你一拳,你挡一下,然后我停住等你来打我,这样一来一往轮流做庄
但是,鉴于水平有限,就别那么多讲究啦,按轮流进攻这么处理啦
所以这个函数这么写:
过招(西门吹雪攻,叶孤城守)
过招(叶孤城攻,西门吹雪守)
重复以上过程,直到一方战败
接下来看看“过招”是怎么个过招法,首先它是个static method,跟“比武”这个类有逻辑上的关系,但独立于对象和类(在类内给引用时前面还是要加self的)。
过招(进攻方,防守方):
进攻方.进攻()
防守方.防守()
计算对防守方的伤害值(进攻方的攻击力-防守方的防守力)
计算防守方的功力下降到哪里啦,
汇报战况
如果防守方战斗力下降到0或0以下,宣布败北(Game over),否则继续战斗
两个类建好后,接下来的事情就好办了,先生成两个剑客对象。
剑客1:姓名-西门吹雪、功夫-50、最大攻击力-20、最大防守力-10,即
blowSnow = Warriors(西门, 50, 20, 10)
剑客2:姓名-叶孤城、功夫-50、最大攻击力-20、最大防守力-10,即
loneCity = Warriors(叶孤, 50, 20, 10)
再生成个“比武”的实例:紫禁之巅 forbiddenCity = Battles(), 然后战斗开始:forbiddenCity.lauchAttack(blowSnow, loneCity)
还有一场对决我也印象深刻,就是神雕侠侣中洪七公和欧阳锋在华山之巅最后比拼内力那场。
用"剑客“这个类生成西毒和北丐两个实例,
"比武“类生成华山论剑这个实例
我知道不是比剑,就是内意思,概因“华山论剑”这四个字有太多美好的回忆
多态和一些特殊的方法函数
月圆之夜紫禁之巅
# ---------- WARRIORS BATTLE ----------
import random
import math
# 剑客
class Warriors:
def __init__(self, name, Kungfu, attkMax, defendMax):
self.name = name
self.energyValue = Kungfu
self.attkMax = attkMax
self.defendMax = defendMax
# 攻击力
def attack(self):
return self.attkMax * (random.random() + .5)
# 防守力
def defend(self):
return self.defendMax * (random.random() + .5)
# 比武
class Battles:
def launchAtack(self, warrior1, warrior2):
while True:
if self.fight(warrior1, warrior2) == 'Game over':
print('Game over')
break
if self.fight(warrior2, warrior1) == 'Game over':
print('Game over')
break
@staticmethod
def fight(warriorA, warriorB):
attkAmount = warriorA.attack()
defendAmount = warriorB.defend()
damage2warriorB = math.ceil(attkAmount - defendAmount)
warriorB.energyValue = warriorB.energyValue - damage2warriorB
print('\n{}进攻, {}防守\n这次过招的伤害值{}\n{}的战斗力下降到{}\n'.format(
warriorA.name, warriorB.name, damage2warriorB, warriorB.name, warriorB.energyValue))
if warriorB.energyValue <= 0:
return 'Game over'
else:
return 'Continue fight'
blowSnow = Warriors('西门吹雪', 50, 20, 10)
loneCity = Warriors('叶孤城', 50, 20, 10)
forbidenCity = Battles()
forbidenCity.launchAtack(blowSnow, loneCity)