这个习题我搞了好久,模块这类感觉也挺难的,感觉还有好多没懂,看了好多好多回习题41、42。这道习题里面函数有很多调用,需要很多次打印,所以我就把注释,还有我的解题过程都放出来了。
from random import randint
from sys import exit
from textwrap import dedent
class Scene(object):
print("______7_____class-Scene_____7_____\n")#因为没有调用函数就直接到下一个 Class了
def enter(self):
print(">>>>>>>>暂时不知道这里的是什么<<<<<<<<<<")
print("This scene is not yet configured.")
print("Subclass it and implement enter().")
exit(1)
class Engine(object):
print("_______16_____classEngine______16_____\n")
def __init__(self, scene_map): # class Engine has-a __init__ that takes self and scene_map parameters
self.scene_map = scene_map # Engine has-a attribute named scene_map
print("_______19______ __init__ _______19______",scene_map)
def play(self):
print("_______22______play_______22_____")
current_scene = self.scene_map.opening_scene()#在这里直接调用了 168的函数,所以就跳转到了167
print("\n play of current_scene====24 24======" ,current_scene)#现在这里是CentralCorridor,由165 返还上来的
last_scene = self.scene_map.next_scene('finished')
print("last_scene======26 26=====" ,last_scene)#现在又将 第二次val的函数意义给return返回了这里,由165
while current_scene != last_scene:
print("\n^^^^^^ top of while current_scene==29====29== top ==", current_scene, "last_scene ======== top =======",
last_scene, )
next_scene_name = current_scene.enter()#相当于 CentralCorridor.enter(),所以就开始去到了函数 CentralCorridor. 之后再该函数里面return的 地点名就是小写的地点名,并且是等于next——next_scene_name的
print("next_scene_name == 32 ===== 32 ==",next_scene_name) #31行的函数结束之后就return 给了curren_scene一个新的值,并且从31继续进行下去
current_scene = self.scene_map.next_scene(next_scene_name)#又一次165行return val了一个新的值 LaserWeaponArmory 给了curren_scene一个新的值。 即return的值是等于current_scene
print("\n....... end of while current_scene === 34 === 34 === " ,current_scene, "last_scene======== ",
last_scene,"next_scene_name ==== 35 ==== ", next_scene_name )
# be sure to print out the last scene
current_scene.enter()
class Death(Scene):
quips = [
"You died. You kinda suck at this. ____________43____________",
"Your mom would be proud...if she were smarter.__________44_______",
"Such a luser.__________45____________",
"I have a small puppy that's better at this.____________46________",
"You're worse than yor Dad's jokes__________47____________"
]
def enter(self):
print(len(self.quips) - 1)
print(Death.quips[randint(0, len(self.quips) - 1)])# 打印list里面的某一句话,似乎永远是只能是前四句,因为len只有5句,然后还减了个1
exit(1)
class CentralCorridor(Scene):
def enter(self):
print(dedent("""\nWelcome to CentralCorridor 58 58___________"""))
action = input("> ")
if action == "shoot!":
print(dedent(""" This is CentralCorridor CentralCorridor!!! 63 63_______________"""))
return 'death'
elif action == "dodge!":
print(dedent(""" This is dodge! dodge! dodge! 67 67_______________________"""))
return 'death'
elif action == "tell a joke":
print(dedent("""This is tell_a_joke tell_a_joke tell_a_joke !!! 71 71____________________"""))
return 'laser_weapon_armory'
else:
print("DOES NOT COMPUTE! 75 75__________________________")
return 'central_corridor'
class LaserWeaponArmory(Scene):
def enter(self):
print(dedent("""\nLaserWeaponArmory 81_________________81"""))
#code = f"{randint(1,9)}{randint(1,9)}{randint(1,9)}"
code = "992"
guess = input("[keypad]> 85___________85 ")
guesses = 0
while guess != code and guesses < 10:
print("BZZZZEDDD! 89___________________89")
guesses += 1
guess = input("[keypad] 91________________91> ")
if guess == code:
print(dedent(""" This is LaserWeaponArmory LaserWeaponArmory!!! LaserWeaponArmory!!! in if. 94________________94"""))
return 'the_bridge'
else:
print(dedent("""This is LaserWeaponArmory LaserWeaponArmory also!! 97________________97"""))
return 'death'
class TheBridge(Scene):
def enter(self):
print(dedent("""\nNow,you have come TheBridge TheBridge!!! 103________________-103"""))
action = input(">>>105>>>> ")
if action == "throw the bomb":
print(dedent("""This is if in TheBridge 108________________________108"""))
return 'death'
elif action == "slowly place the bomb":
print(dedent(""" This is elif in TheBridge 112_________________112"""))
return 'escape_pod'
else:
print("DOES NOT COMPUTE! 116_____________________116")
return 'the_bridge'
class EscapePod(Scene):
def enter(self):
print(dedent("""\nzhe shi zai taikongcang lim 122_______________________122"""))
#good_pod = randint(1, 5)
good_pod = 2
guess = input("[pod #](125__________125)> ")
if int(guess) != good_pod:
print(dedent(f"""hui si d {guess} cang 128___________________128"""))
print(f"第{good_pod}太空舱才是回家的路!!!")
return 'death'
else:
print(dedent(f"""neng rang ren huo d {guess} cang 132________________________132"""))
return 'finished'
class Finished(Scene):
def enter(self):
print("\nYou won! Good job. 139______________139")
return 'finished'
class Map(object):
print("_______144_____144______")
scenes = {
'central_corridor': CentralCorridor(),
'laser_weapon_armory': LaserWeaponArmory(),
'the_bridge': TheBridge(),
'escape_pod': EscapePod(),
'death': Death(),
'finished': Finished()
} #这里有一个字典,并且每次都调用了。 字典里面的函数需要在之前就进行定义
def __init__(self, start_scene):
#定义函数 class map has-a __init__ that takes self and start_scene parameters.
print("______156_______init_________156_____")
self.start_scene = start_scene #因为这一行没有启动别的函数,所以就直接 from self get the start_scene attribute and set it to start_scene.
print("==158===start_scene=158==",start_scene)# 这里 start_scene打印出来的是central_corridor 说明xx= aa
def next_scene(self, scene_name):#来了这里两次,一次是从168带着corridor来到这样,一次是从25带着 finished来到这里
#定义函数 class map has-a function named next_scene that takes self and scene_name parameters
print("______162______next_scene____162_______")
val = Map.scenes.get(scene_name)#现在scene_name是start_scene,start_scene 又是每一次上面打开函数时的next_scene里面的值。 然后get的返回值是所导入键名的值
print("====164=====v a l===164===", val)
return val#使用类名得到字典里面的内容,然后回到play。
print("--------------------166")
def opening_scene(self):# 定义函数 opening——scene
print("______168___________________168_____")
return self.next_scene(self.start_scene)#将 self 和 start_scene 调给160的新函数next
print("170-------------------/n")
a_map = Map('central_corridor')# 实际上 代码144那里上面的class都没有调用到函数,所以就一路到此,直接开始调用第一个Map函数
a_game = Engine(a_map)
a_game.play()