Game类含玩家昵称、生命值、攻击力(整数),暴击率、闪避率(小数),在魔术方法init定义;attack方法中实现两个Game实例对战模拟。
(本笔记适合初通Python类class的coder翻阅)
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
【题目来源于 CSDN 问答社区提问“Python类模拟对战游戏”】
本题目看起,不难。按Python的基本写法按部就班的一行行码码就对了,魔法方法定义属性也没有大问题,只要注意对变量名称的设计就ok了。对战方法attack稍有难度,对四种输出的判定,if条件表达式分支不难搞定,只要细心一点就没事儿。对每回合伤害值的计算,小有难度;难就难在闪避率的处理,使整个伤害值计算表达式为0的权值,才是闪避率(我也是搞反。数据设置极小,都极易出“闪避”,久经推敲,才揪出是我搞反的bug)。
再有点儿麻烦的,我认为是字符串格式化输出。幸好我对好用的字符串插值格式化已经完全掌握,细心调试也还轻车熟路。
除了玩家昵称外,我都采用了随机生成:生命值、攻击力是m、n整数区间的随机整数(攻击力取值边界是生命上下边界的1/4),暴击率、闪避率是0.12~0.36之间的随机小数。我没有设定随机数种子seed(),就是想让模拟游戏更具“随机性”。
Game属性变量名称说明
用hp0记录玩家生命值初值,因为hp生命值会随意战斗回合推进而发生变化。
python代码
def __init__(self, name, hp, ar, csr, far):
self.name = name
self.hp0 = self.hp = hp # 用变量hp0记录玩家初始生命值。
self.ar = ar
self.csr = csr
self.far = far
attack对战方法中,我使用了两个技巧:一、用三元操作语句替换了所有的if条件表达式语句,让代码更苗条优雅;二、用随机模块方法choices带权重参数来处理暴击率和闪避率,简单方便。
值得注意的是:choice方法返回的中列表,就算默认的k参数为k=1时,它也返回一个元素的列表。我收到抛出的这个异常,也是迷糊了一阵子才找到症结。
python代码
def attack(self, b):
from random import choices
killValue = self.ar*choices([2, 1], [self.csr, 1-self.csr])[0]*choices([0, 1], [b.far, 1-b.far])[0] # 伤害值计算。
b.hp -= killValue
tipA = f"\n◎ {self.name}向{b.name}发动了{killValue}点攻击。" if killValue else ''
tipB = f"\n◎ {b.name}躲开了!" if not killValue else ''
tipC = f"\n◎ {b.name}的生命值降低到{b.hp}" if killValue else ''
tipD = f"\n◎ {b.name}失败了!" if b.hp <= 0 else ''
print(f"{tipA}{tipB}{tipC}{tipD}\n\n{'':>4}“{b.name}”剩余生命值:{b.hp}")
return True if b.hp <= 0 else False
python代码
def main():
from random import randint
from os import system
clear = lambda: system('clear') # 清屏函数。
s = input(f"\n输入玩家昵称(如梦幻精灵_cq 小精灵):\n\n{'':>13}_").strip()
a, b = s.split() if s else ('梦幻精灵_cq', '小精灵')
m, n, rate = 1000, 2000, lambda: randint(12, 36)/100 # 生命值随机数上下边界,暴击率、闪避率随机函数。
a, b = Game(a, randint(m, n), randint(m//4, n//4), rate(), rate()), Game(b, randint(m, n), randint(m//4, n//4), rate(), rate()) # a、b玩家实例,属性值随机。
flag = 0 # 玩家失败标识初值。
k = 1 # 回合记录变量初值。
while not flag:
clear() # 调用函数清屏。
a.showPlayer(b)
print(f"\n\n{f'第{k:0>2}回合':~^37}")
flag = a.attack(b) # 据对战情形更新失败标识。
input(f"{'':~^40}\n")
a, b = b, a # 主动出击玩家对调。
k += 1
python代码
def showPlayer(self, b):
print(f"\n{' 回合对战游戏 ':=^34}\n\n\n{'':>8}玩家A:{self.name}\n{'':>8}玩家B:{b.name}\n{'':>8}{'':~>18}\n\n{'【玩家属性】':^34}\n{' A ':~^20}{' B ':~^20}\n{'':>3}生命值:{self.hp0:>4}{'':>8}生命值:{b.hp0:>4}\n{'':>3}攻击力:{self.ar:>4}{'':>8}攻击力:{b.ar:>4}\n{'':>3}暴击率:{self.csr:.2f}{'':>8}暴击率:{b.csr:.2f}\n{'':>3}闪避率:{self.far:.2f}{'':>8}闪避率:{b.far:.2f}")
关于对main函数的调用,太过基础和简单,这里不再赘述。如有不清楚的,可跳转完整源码,浏览最后几行代码。
(源码较长,点此跳过源码)
python代码
#!/sur/bin/nve python
# coding: utf-8
class Game():
'''
玩家属性变量名称说明:
hp: health point # 生命值。
ar: aggressivity # 攻击力。
csr: crotical strike rate # 暴击率。
far: flash avoidance rate # 闪避率。
'''
def __init__(self, name, hp, ar, csr, far):
self.name = name
self.hp0 = self.hp = hp # 用变量hp0记录玩家初始生命值。
self.ar = ar
self.csr = csr
self.far = far
def showPlayer(self, b):
print(f"\n{' 回合对战游戏 ':=^34}\n\n\n{'':>8}玩家A:{self.name}\n{'':>8}玩家B:{b.name}\n{'':>8}{'':~>18}\n\n{'【玩家属性】':^34}\n{' A ':~^20}{' B ':~^20}\n{'':>3}生命值:{self.hp0:>4}{'':>8}生命值:{b.hp0:>4}\n{'':>3}攻击力:{self.ar:>4}{'':>8}攻击力:{b.ar:>4}\n{'':>3}暴击率:{self.csr:.2f}{'':>8}暴击率:{b.csr:.2f}\n{'':>3}闪避率:{self.far:.2f}{'':>8}闪避率:{b.far:.2f}")
def attack(self, b):
from random import choices
killValue = self.ar*choices([2, 1], [self.csr, 1-self.csr])[0]*choices([0, 1], [b.far, 1-b.far])[0] # 伤害值计算。
b.hp -= killValue
tipA = f"\n◎ {self.name}向{b.name}发动了{killValue}点攻击。" if killValue else ''
tipB = f"\n◎ {b.name}躲开了!" if not killValue else ''
tipC = f"\n◎ {b.name}的生命值降低到{b.hp}" if killValue else ''
tipD = f"\n◎ {b.name}失败了!" if b.hp <= 0 else ''
print(f"{tipA}{tipB}{tipC}{tipD}\n\n{'':>4}“{b.name}”剩余生命值:{b.hp}")
return True if b.hp <= 0 else False
def main():
from random import randint
from os import system
clear = lambda: system('clear') # 清屏函数。
s = input(f"\n输入玩家昵称(如梦幻精灵_cq 小精灵):\n\n{'':>13}_").strip()
a, b = s.split() if s else ('梦幻精灵_cq', '小精灵')
m, n, rate = 1000, 2000, lambda: randint(12, 36)/100 # 生命值随机数上下边界,暴击率、闪避率随机函数。
a, b = Game(a, randint(m, n), randint(m//4, n//4), rate(), rate()), Game(b, randint(m, n), randint(m//4, n//4), rate(), rate()) # a、b玩家实例,属性值随机。
flag = 0 # 玩家失败标识初值。
k = 1 # 回合记录变量初值。
while not flag:
clear() # 调用函数清屏。
a.showPlayer(b)
print(f"\n\n{f'第{k:0>2}回合':~^37}")
flag = a.attack(b) # 据对战情形更新失败标识。
input(f"{'':~^40}\n")
a, b = b, a # 主动出击玩家对调。
k += 1
if __name__ == '__main__':
main() # 调用主函数,开始游戏。
我的HOT博:
本次共计收集 246 篇博文笔记信息,总阅读量 40.46w,平均阅读量 1644。已生成 16 篇阅读量不小于 4000 的博文笔记索引链接。数据采集于 2023-10-12 05:41:03 完成,用时 4 分 41.10 秒。
精品文章:
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
CSDN实用技巧博文: