我目前正在阅读《学习Python 3艰难的道路》一书。
我已经完成了练习43,其中写了一个小型文本冒险游戏来练习面向对象的编程。
我已经完成了程序代码的输入,并使其正常运行而没有任何错误。然后在其他研究部分,作者要求将简单的战斗系统添加到脚本中。
可以在此链接上看到完整的脚本,我不想将ex43的整个脚本粘贴到此问题中。
https://github.com/ubarredo/LearnPythonTheHardWay/blob/master/ex43.py
我创建了以下脚本作为战斗系统:
loadNextContainer.innerHTML = "<span class=\"sr_43\" id=\"srloadnext_2\" onclick=\"srt.loadNextMatchRecords('"+numDownloadSoFar+"', '"+maxDownloadLimit+"', '"+folderName+"', '"+jsonHashTags+"', '"+fromDate+"', '"+toDate+"', '"+lastScanId+"')\">LoadNext</span>";
这本身就很好用,我想在本书的脚本中使用它。
我试图从CentralCorridor类中调用它。玩家输入“拍摄”后,我通过添加以下内容调用了我编写的脚本:
import random
import time
class Player:
def __init__(self, hit_points, sides):
self.hit_points = hit_points
self.sides = sides
def take_hit(self):
self.hit_points -= 2
def roll(self):
return random.randint(1, self.sides)
class Combat(Player):
def combat_start():
p = Player(hit_points = 10, sides = 6)
e = Player(hit_points = 8, sides = 6)
battle = 1
while battle != 0:
human = p.roll() + 6
print("Your hit score: ", human)
monster = e.roll() + 6
print("Enemy hit score: ", monster)
if human > monster:
e.take_hit()
print("Your hit points remaining: ", p.hit_points)
print("Enemy hit points remaining:", e.hit_points)
if e.hit_points == 0:
battle = 0
print("The Enemy is Dead!!!")
time.sleep(2)
elif human < monster:
p.take_hit()
print("Your hit points remaining: ", p.hit_points)
print("Enemy points remaining: ", e.hit_points)
if p.hit_points == 0:
battle = 0
print("You died in Battle!!!")
time.sleep(2)
Combat.combat_start()
我希望会发生的是我写的战斗课开始,然后当玩家获胜时它将继续到下一个场景,如果玩家输了它将会返回死亡课。
经过多次尝试和失败后,我将Combat类更改为:
Combat.combat_start()
添加了此脚本后,脚本便开始运行并退出循环。
class Combat(Scene, Player):
如果敌方玩家得分更高,则在一轮或两轮后循环中断。
我正在努力寻找解决方案,非常感谢能指出我要去哪里的问题。
通过其他答案,我发现有些评论认为这不是用Python编写OOP的理想方法。
在书中显示:
Your hit score: 12
Enemy hit score: 12
Your hit score: 10
Enemy hit score: 11
Your hit points remaining: 8
Enemy points remaining: 4
Your hit score: 10
Enemy hit score: 10
Your hit score: 12
Enemy hit score: 7
Your hit points remaining: 8
Enemy hit points remaining: 2
Your hit score: 7
Enemy hit score: 9
Your hit points remaining: 6
Enemy points remaining: 2
Your hit score: 7
Enemy hit score: 8
Your hit points remaining: 4
Enemy points remaining: 2
Your hit score: 9
Enemy hit score: 10
Your hit points remaining: 2
Enemy points remaining: 2
Your hit score: 10
Enemy hit score: 9
Your hit points remaining: 2
Enemy hit points remaining: 0
The Enemy is Dead!!!
Traceback (most recent call last):
File "ex43.py", line 220, in <module>
a_game.play()
File "ex43.py", line 24, in play
next_scene_name = current_scene.enter()
AttributeError: 'NoneType' object has no attribute 'enter'
从我读到的内容来看,这是Python 2风格的OOP。我已经看到作者比Python 3更像是Python 2的粉丝。 我很喜欢他写在书中的练习,并希望继续进行下一个练习。
非常感谢您一如既往的帮助。
----更新----
这是所请求的Play方法:
class Scene(object):
答案 0 :(得分:0)
我解决了这个问题。写完之后,
1;71;72;15
2;76;77;20
3;71;72;25
我需要输入:
Combat.combat_start()
没有程序崩溃,因为它无处可去。
还修复了Combat类中的逻辑。
感谢您的帮助。