看一下这个问题底部的代码
这是关于学习python的书,我的问题特别是play方法如何使游戏切换到下一阶段(类)。它是否与每个类底部的return语句有关?我期待更像“Death.enter()”或“Map.scenes.get ['death']。enter()”作为结束语。当current_scene简单地调用地图类中的opens_scene方法时,current_scene是如何改变到下一个场景的,即“central_corridor”。我以为它会一直停留在“central_corridor”上。还有一个场景类是一个好主意,那里会有什么样的代码?
编辑:现在添加的while循环缺少代码行
from sys import exit
from random import randint
class Scene(object): #It's python3 but I'm used to this
def enter(self):
print("This scene is not yet configured." +
"Subclass it and implement enter()")
exit(1)
class Engine(object):
def __init__(self, scene_map):
self.scene_map = scene_map
def play(self):
current_scene = self.scene_map.opening_scene()
while True:
print('\n', '-' * 20)
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
class Death(Scene):
quips = [
"You died. You kinda suck at this.",
"Your mom would be so proud...if she were smarter",
"Such a loser.",
"I have a small puppy that's better at this"
]
def enter(self):
print(Death.quips[randint(0, len(self.quips)-1)])
exit(1)
class CentralCorridor(Scene):
def enter(self):
print("""
The Gothons of Planet Percal #25 have invaded your ship and destroyed
your entire crew. You are the last surviving member and the last
mission is to get the neutron destruct bomb from the Weapon Armory
put it in the bridge, and blow the ship up after getting into
an escape pod.
\n
You're running down the central corridor to the Weapons Armory when
a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown
costume flowing around his hate filled body. He's blocking the door to
the armory and about to pull out a weapon to blast you
""")
action = input(">> ")
if action == "shoot!":
print("""
Quick on the draw you yank out your blast and fire it at the Gothon.
His clown costume is flowing and moving around his body, which throws
off your aim. Your laser hits his costume but misses him entirely.
This completely ruins his brand new costume his mother bought for him,
which makes him fly into rage and blast you repeatedly in the face
until you are dead, then he eats you
""")
return('death')
elif action == "dodge!":
print("""
Like a world clas boxer, you dodge, weave, slip and slide to the right
as the Gothon's blaster cranks a laser past your head.
In the middle of your artful dodge yor foot slips and you bang your
head on the metal wall and pass out. You wake up shortly after only
to die as the Gothon stomps on your head and eats you.
""")
return('death')
elif action == 'tell a joke':
print("""
Luck for you, they made you learn Gothn insults in the academy.
You tell one Gothon joke you know:
Lbhe zbgure vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgf nebhaq
the Gothon stops, tries not to laugh, then bursts out laughing and can't move
while he's laughing you run up and shoot him square in the head
putting him down, then jump through the Weapon Armory door
""")
return('laser_weapon_armory')
else:
print("DOES NOT COMPUTE")
return('central_corridor')
class LaserWeaponArmory(Scene):
def enter(self):
print("""
You do a dive roll into the Weapon Armory, crouch and scan the room
for more Gothons that might be hiding. It's dead quiet, too quiet.
You stand up and run to the far side of the room and find the neutron
bomb in its container. There's a keypad lock on the box and you need to
get the bomb out. If you get the code wrong 10 times then the lock closes
forever and you can't get the bomb. The code is 3 digits.
""")
code = "%d%d%d"%(randint(1,9), randint(1,9), randint(1,9))
int(code)
guess = int(input("[keypad]>> "))
guesses = 0
while guess != code and guesses < 10:
print("BZZZEDDD!!")
guess += 1
guess = int(input("[keypad]>> "))
if guess == code:
print("""
The container clicks open and the seal breaks, letting gas out
You grab the neutron bomb and run as fast as you can to the bridge
where you must place it in the right spot
""")
return('the_bridge')
else:
print("""
The lock buzzes one last time and then you hear a sickening melting
sound as the mechanism is fused together. You decide to sit there,
and finally the Gothons blow up the ship from their ship and you died
""")
return('death')
class TheBridge(Scene):
def enter(self):
print("""
You burst onto the bridge with the neutron destruct bomb under your arm
and surprise 5 Gothons who are trying to take control of the ship. Each
of them has an even uglier clown costume than the last. They haven't pulled
out their weapons yet, as they see the active bomb under your hand and don't
want to set it off.
""")
action = input(">> ")
if action == "throw the bomb":
print("""
In a panic you throw the bomb at a group of Gothons and make a leap
for the door. Right as you drop it a Gothon shoots you right in the
back killing you. As you die you see another Gothon frantically try
to disarm the bomb. You die knowing that they will probably blow up
when the bomb goes off
""")
return('death')
elif action == "slowly place the bomb":
print("""
You point your blaster at the bomb under your arm and the Gothons put
their hands up and start to sweat. You inch backwards to the door,
open it, and then carefully place the bomb on the floor, pointing your
blaster at it. You then jump back through the door, punch the close
button and blast the lock so the Gothons can't get out. Now that the
bomb is placed you run to the escape pod to get off this tin can
""")
return('escape_pod')
else:
print('DOES NOT COMPUTE')
return('the_bridge')
class EscapePod(Scene):
def enter(self):
print("""
You rush through the shop desperately trying to make it to the escape pod
before the whole ship explodes. It seems like harldy any Gothons are on the
ship, so your run is clear of interference You get to the chamber with the
escape pods, and now need to pick one to take. There's 5 pods which one do
you take?
""")
good_pod = randint(1,5)
guess = int(input("Pod Number>> "))
if guess == good_pod:
print("""
You jump into pod %d and hit the eject button.
The pod escapes out into the void of space, then
implodes as the hull ruptures, crushing your body
into jam jelly
"""%guess)
return('death')
else:
print("""
You jump into pod %d and hit the ejet button and the pod
easily slides out into space heading to the planet below.
As it flies to the planet, you look back and see your ship
implode and then explode like a bright star, taking out the
Gothon ship at the same time.
YOOUU WON!!
"""%guess)
return('finished')
class Map(object):
scenes = {
'central_corridor': CentralCorridor(),
'laser_weapon_armory': LaserWeaponArmory(),
'the_bridge': TheBridge(),
'escape_pod': EscapePod(),
'death': Death()
}
def __init__(self, start_scene):
self.start_scene = start_scene
def next_scene(self, scene_name):
return(Map.scenes.get(scene_name))
def opening_scene(self):
return(self.next_scene(self.start_scene))
a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()
答案 0 :(得分:1)
enter()
子类的大多数中实现的Scene
方法 - 例如CentralCorridor
,LaserWeaponArmory
等 - 返回名称以下场景取决于提示时人员输入的操作。
这在Engine.play()
方法中用于确定enter()
循环每次迭代期间while
的下一个场景:
while True:
print('\n', '-' * 20)
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
这一直持续到Death
场景的enter()
被调用,并且由于它调用exit()
而不是像其他场景那样返回下一个场景值,因此会导致脚本终止。
答案 1 :(得分:0)
<强> TD; LR 强>
current_scene = self.scene_map.next_scene(next_scene_name)
让我们看看我们在这里得到了什么。我们有一组场景,每个场景都是Scene
类,它们都有输入方法(我们将使用它们来访问场景。
我们在地图(类Map)中收集这些场景。地图也会通过设置起始场景来启动我们可爱游戏的引擎。我们将在“走廊”开始游戏。
现在我们如何连接这些美丽的场景?让我们使用while循环:
while True:
print('\n', '-' * 20)
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
但这是如何运作的?当前场景的enter()
方法完成时,我们会收集下一个场景的名称。这就是next_scene_name = current_scene.enter()
。
然后我们告诉我们的地图实例调用下一个场景,并将其next_scene()
方法传递给场景名称。
当有更多场景要迭代时,while循环会收到 truthy 信号,因此继续将更多场景变为现实。但最后它以exit(1)
或stopIteration
的形式接收 falsy 信号(因为没有更多的场景可以迭代)。那是我们的游戏结束。