【习题35】交互程序三 + 汉化版

        这个程序的核心内容就是def语句,if语句和while语句循环的重复使用。

        参考: 习题—35

        Q^Q 2个多月了,没想到还会回来再修改这个程序,实在是世事难料呀!  from sys import exit

这句可以不用,因为系统本身就自带这个函数,不信你在命令行或控制台 (powershell) 输入"exit" 看看

可不可以退出! 当然在python环境下就要以函数的形式eixt()或quit()或快捷键 "Ctrl+Z" 才能退出 ~

                                                                                                               — 2016/8.29

----------------------------------------------------------------------------------------------------

 

        接下来我们逐个逐个函数分析 ! 注意函数的写法是用下划线隔开单词(如gold_room, bear_room)

! ! ! (后面学的类是驼峰式写法如: SuperGoldFactory)

1. dead() 死亡 = 退出

        我认为作者有点调皮了,应该把这个死亡函数放在第一个函数定义才是啊,不然开头就是gold_room(),

还调用了我们暂时不知道从哪来的死亡函数, 让人看着犯晕,还得去后面找这个dead()函数的作用! 这个函数

比较简单,就是打印出你给它的参数,然后退出程序,表示游戏失败!

1 def dead(why):
2     print  why, "Game over!"
3     exit(0)
dead 函数

        这里我们把原代码的 "Good job"(作者挺会调侃的, 人家都挂了也不知道安慰安慰...) 改为"Game over"

       值得注意的是,这里的死亡函数最关键的部分是exit(0),因为我们是通过开始函数转换到熊室的 while

循环里面的,所以只有用exit()或者break语句才能退出循环 !

2. gold_room() 金库

        这是四个房间里面的一个,场景是你来到了金库,让你选要拿多少金子,如果太贪心的话,噢哦~又是死

! (执行dead()函数, game over......)

 1 def gold_room():
 2     print "This room is full of gold. How much do you take?"
 3     
 4     # raw_input()输出结果是 'str' 字符串型的,所以下面的数字也是
 5     # str型的
 6     next = raw_input("> "):
 7     if "0" in next or "1" in next:
 8         # 这里把next的值赋给how_much, 并输出int整数型的结果! 而不
 9         # 是写成int(raw_input()), 是因为不想再提问一次!
10         how_much = int(next)
11     else:
12         dead("Man, learn to type a number!")
13     # 上面how_much已经把结果输出为int型,所以这里的50不能再加上引号了!
14     if how_much < 50:
15         print "Nice, you're not greedy, you win!"
16         exit(0)                              # exit(0)表示正常退出...
17     else:
18         dead("You greedy bastard!")
gold_room 版本1

        其实这里是作者故意设的一个套,  这里看似两个并列的 if 语句, 真实情况却是由于how_much是通过

next赋值的,而第二个if语句又是以how_much作为变量名,所以若是第一个if语句成立, 就会跳到第二个if语

句,而else语句又是在if语句执行并且不成立后才会执行的! 所以这里代码可以这样改 !

 1 def gold_room():
 2     print "This room is full of gold. How much do you take?"
 3 
 4     next = raw_input("> ")
 5     
 6     # 这里 "!= " 是不等于的意思,表示输入不是空,也就是有输入东西
 7     if next != "":
 8         how_much = int(next)
 9 
10         if how_much < 50:
11             print "Nice, you're not greedy."
12         else:
13             dead("You greedy bastard!")
14 
15     # 这里其实和 elif next == "": 是同个意思,都是表示输入为空,也
16     # 就是什么都没有输入!
17     else:
18         dead("Man, learn to type a number.")
gold_room 版本2

        注意,我们不能先把next弄成int型的,因为next = "" 这种形式还是str字符串型的形式! 所以才把next

赋值给how_much

3. bear_room() 熊室

 1 def bear_room():
 2     print "There is a bear here."
 3     print "The bear has a bunch of honey!"
 4     print "The fat bear is in front of another door!"
 5     print "How are you going to move the bear?"
 6     bear_moved = False
 7 
 8     # while True开启无限循环模式, 除非遇到break中断语句或者exit()退出函数
 9     # 否则一直循环下去!
10     while True:
11         next = raw_input("> ")
12         
13         if next == "take honey":
14             dead("The bear looks at you then slaps your face off!")
15         elif next == "taunt bear" and not bear_moved:
16             print "The bear has moved from the door. You can go through it now."
17             bear_moved = True
18         elif next == "taunt bear" and bear_moved:
19             dead("The bear gets pissed off and chews your leg off.")
20         elif next == "open door" and bear_moved:
21             gold_room()
22         else:
23             print "I got no idea what that means."
bear_room 函数

        这里有意思的一点是bear_moved这个变量,先是等于False,后来又变成True, 这是因为在if...else, 和

while语句中,只有布尔值是True的情况才能执行,所以说别看这里这么多ellif, 执行顺序还是不一样的, 首先

是一开始进入while循环, 只有两种选择, take honey然后被熊KO!!!或者taunt bear逗熊然后熊走开,(

既然bear为假,False那么not bear_moved就为True不就可以执行了), 然后就不用我多说了!

        要提醒各位的是,除非遇到exit()或者dead()死掉,不然即使跳到其他房间,循环还是在进行!

4. cthulhu_room() 克苏鲁房间

 1 def cthulhu_room():
 2     print "Here you see the great evil Cthulhu."
 3     print "He, it, whatever stares at you and you and insane."
 4     print "Do you flee for your life or eat your head?"
 5 
 6     next = raw_input("> ")
 7     
 8     # 从一个房间跳到另一个房间
 9     if "flee" in next:
10         start()
11     elif "head" in next:
12         dead("Well that was tasty!")
13     else:
14         cthulhu_room()
cthulhu_room 函数

        接下来的几个房间都是从一个地方跳到另一个地方,没什么好说的,就先这样吧!

5. start_room() 起点

 1 def start():
 2     print "You are in a dark room."
 3     print "There is a door to your right and left."
 4     print "Which one do you take?"
 5 
 6     next = raw_input("> ")
 7 
 8     if next == "left":
 9         bear_room()
10     elif next == "right":
11         cthulhu_room()
12     else:
13         dead("You stumble around the room until you starve.")
14 # start()函数是游戏的起点,从这个房间可以跳到不同的房间
15 start()
start_room 函数

        不要忘记最后一行对 start_room() 的调用哦 ! OK!游戏开始! 

 

---------------------------------------------------------------------------------------------------

完整的游戏脚本

 1 # coding: utf-8
 2 # 声明编码方式是 'utf-8',该编码是对应汉字的
 3 
 4 # def: (define) 定义的意思,表示创建函数
 5 def dead(why):
 6     print  why, "Game over!"
 7     exit(0)
 8 
 9 def gold_room():
10     print "This room is full of gold. How much do you take?"
11 
12     next = raw_input("> ")
13     # 这里 "!= " 是不等于的意思,表示输入不是空,也就是有输入东西
14     if next != "":
15         how_much = int(next)
16 
17         if how_much < 50:
18             print "Nice, you're not greedy."
19             # 由于我们是从熊室那里的while循环跳到这里来的,所以即使
20             # 胜利,也还是处于循环中,所以我们要用exit(0)正常退出
21             exit(0)
22         else:
23             dead("You greedy bastard!")
24     # 这里其实和 elif next == "": 是同个意思,都是表示输入为空,也
25     # 就是什么都没有输入!
26     else:
27         dead("Man, learn to type a number.")
28 
29 def bear_room():
30     print "There is a bear here."
31     print "The bear has a bunch of honey!"
32     print "The fat bear is in front of another door!"
33     print "How are you going to move the bear?"
34     bear_moved = False
35 
36     # while True开启无限循环模式, 除非遇到break中断语句或者exit()退出函数
37     # 否则一直循环下去!
38     while True:
39         next = raw_input("> ")
40         
41         if next == "take honey":
42             dead("The bear looks at you then slaps your face off!")
43         elif next == "taunt bear" and not bear_moved:
44             print "The bear has moved from the door. You can go through it now."
45             bear_moved = True
46         elif next == "taunt bear" and bear_moved:
47             dead("The bear gets pissed off and chews your leg off.")
48         elif next == "open door" and bear_moved:
49             gold_room()
50         else:
51             print "I got no idea what that means."
52 
53 def cthulhu_room():
54     print "Here you see the great evil Cthulhu."
55     print "He, it, whatever stares at you and you and insane."
56     print "Do you flee for your life or eat your head?"
57 
58     next = raw_input("> ")
59     
60     # 从一个房间跳到另一个房间
61     if "flee" in next:
62         start()
63     elif "head" in next:
64         dead("Well that was tasty!")
65     else:
66         cthulhu_room()
67 
68 # start()函数是游戏的起点,从这个房间可以跳到不同的房间
69 def start():
70     print "You are in a dark room."
71     print "There is a door to your right and left."
72     print "Which one do you take?"
73 
74     next = raw_input("> ")
75 
76     if next == "left":
77         bear_room()
78     elif next == "right":
79         cthulhu_room()
80     else:
81         dead("You stumble around the room until you starve.")
82 # 最后别忘了调用一次起点函数哦
83 start()
完整的版本

汉化版

        用刚学到的正则表达式来匹配,首先,我们把 "搞笑版" 的中文写出来(难道你还想用谷歌翻译?)

具体怎么做呢? 你可以直接对着print 后面的英文写翻译,或者玩点高科技一点的 !

        第一步: 先把print " " 里面的英文内容提取出来(因为死亡函数里面的print why + "Game over!"也有

print所以正则表达式还要匹配双引号), 不然等下连 why, "Game over!" 都匹配进去了!

        (.+) 的 "." 是匹配除换行符之外的所有字符,+ 是匹配前一个字符1到多次,也就是至少匹配1次,括号

表示显示匹配的print " " 里面的双引号里面的部分(也就是本来是边print和双引号一起显示的, 现在我们只要

" " 里面的英文)

 1 # coding: utf-8
 2 
 3 # 导入(import) re: regex(regular expression)正则表达式
 4 import re
 5 
 6 # 假设我们把完整版的代码放在名叫 "1.tx" 文本里面,先打开文本
 7 # 如果该文本和你运行的脚本(py后缀的文件)不在同一个文件夹,要
 8 # 写出完整路径, 比如 "c://1.txt",然后把文本的内容赋值给content
 9 
10 f = open("1.txt")
11 content = f.read()
12 
13 englist =  re.findall("print \"(.+)\"", content)
14 
15 for eachline in englist:
16     print eachline
提取英文

        输出结果的一部分:

        Q^Q: 然而最后还是得对照着写中文

        第二步: 自然是拿我们辛辛苦苦写的中文替换掉对应的英文,又要用到正则表达式, 上面的 re.findall()是把

字符串以列表的结果输出,这回我们替换用的 re.sub() 则是还是乖乖地输出替换后的字符串,不过,要注意的是

        re.sub()并没有输出分组的功能,也就是不会只显示正则表达式里面的括号括起来的内容!在这里我们用括

号只是为了强调我们要的是替换print "" 双引号里面的内容, 因为是这样, 所以我们的print和双引号也会给中文

替换掉,所以我们要给它加上去! 注意,不能写成 print "print \"" + re.findall("") + "\""(\"表示转义双引号 )

,这样的话,print是从最每一行的最左边显示起的!

        输出结果部分截图:

 

        Q^Q: 忙活了一下午的缩进问题终于搞定了! 记得控制台只显示解码后(Unicode类型)或者解码后再转码(str型)

的中文代码里面的 content = f.read().decode("utf-8") 也可写成 ,unicode(f.read(), "utf-8")

 1 # coding: utf-8
 2 # 声明编码方式是 'utf-8',该编码是对应汉字的
 3 
 4 # def: (define) 定义的意思,表示创建函数
 5 def dead(why):
 6     print  why, "Game over!"
 7     exit(0)
 8 
 9 def gold_room():
10     print u"这个房间充满黄金,我的主人,你想拿多少?"
11 
12     next = raw_input("> ")
13     # 这里 "!= " 是不等于的意思,表示输入不是空,也就是有输入东西
14     if next != "":
15         how_much = int(next)
16 
17         if how_much < 50:
18             print u"漂亮,你竟然不是一个贪心的人!"
19             # 由于我们是从熊室那里的while循环跳到这里来的,所以即使
20             # 胜利,也还是处于循环中,所以我们要用exit(0)正常退出
21             exit(0)
22         else:
23             dead("You greedy bastard!")
24     # 这里其实和 elif next == "": 是同个意思,都是表示输入为空,也
25     # 就是什么都没有输入!
26     else:
27         dead("Man, learn to type a number.")
28 
29 def bear_room():
30     print u"有一只可爱的泰迪熊宝宝在那里!"
31     print u"那只熊宝宝有一大堆蜂蜜要与你分享!"
32     print u"胖胖的熊宝宝就站在大门的前面!"
33     print u"你打算怎样支开小熊!?"
34     bear_moved = False
35 
36     # while True开启无限循环模式, 除非遇到break中断语句或者exit()退出函数
37     # 否则一直循环下去!
38     while True:
39         next = raw_input("> ")
40 
41         if next == "take honey":
42             dead("The bear looks at you then slaps your face off!")
43         elif next == "taunt bear" and not bear_moved:
44             print u"熊宝宝已经给你让开了一条路,现在,通往天堂的大门已经敞开!
45             bear_moved = True
46         elif next == "taunt bear" and bear_moved:
47             dead("The bear gets pissed off and chews your leg off.")
48         elif next == "open door" and bear_moved:
49             gold_room()
50         else:
51             print u"我已经不知道那意味着什么了!"
52 
53 def cthulhu_room():
54     print u"在这里你看到了传说中的邪神—克苏鲁,那迷人的微笑!"
55     print u"它,无论盯着你的是什么东西,你都会陷入疯狂..."
56     print u"你想逃离密室还是自己吃自己的头!!!"
57 
58     next = raw_input("> ")
59 
60     # 从一个房间跳到另一个房间
61     if "flee" in next:
62         start()
63     elif "head" in next:
64         dead("Well that was tasty!")
65     else:
66         cthulhu_room()
67 
68 # start()函数是游戏的起点,从这个房间可以跳到不同的房间
69 def start():
70     print u"你身处一间暗无天日的密室中!"
71     print u"在你的左边和右边各有一扇大门."
72     print u"你想进入哪个门?"
73 
74     next = raw_input("> ")
75 
76     if next == "left":
77         bear_room()
78     elif next == "right":
79         cthulhu_room()
80     else:
81         dead("You stumble around the room until you starve.")
82 # 最后别忘了调用一次起点函数哦
83 start()
汉化版

 

----------------------------------------------------------------------------------------------------

这是两个月前 (6.9号) 自己根据题目原理设计的一个交互脚本, 描述的是家乡的风土人情!

  1 # coding: utf-8
  2 
  3 def dead(why):                                       # 定义dead函数,exit()可用于退出循环
  4     print why, 'YOU DEAD!'                           #  exit(0) 表示正常退出,exit(1)表示发生了错误
  5     exit(0)
  6 
  7 def start():
  8     print u">>>尊敬的客官,你的所在是红亭,曾经是当地第五座、也是唯一保存下来的\n\
  9     城门。始建于明天启元年。因通抵学宫,取增贤进士之意,故称进贤门。"
 10     print ">>>Choose: Turn east or western?"
 11 
 12     next = raw_input("Turn: ")                                                   
 13 
 14     if 'east' in next:                                                                         
 15         tomb_of_goddness()                           # 跳到另一个地点
 16         
 17     elif 'west' in next:
 18         tomb_of_general()
 19     else:
 20         dead('')
 21 
 22 def tomb_of_goddness():
 23     print "-" * 80                                   # 重复打印"-"
 24     print u"山神: 来者何人,胆敢擅闯月容夫人圣地。"
 25     print u"山神: 还不速速退下。以免惊扰夫人安宁。"
 26     print ">>>Choose: 'bow', 'kneel', 'flee', 'taunt' or others?"
 27     MountainGod = True
 28 
 29     while True:                                      # 创建一个无限循环,直到dead() 或 exit(0)为止
 30         next = raw_input(">> ")
 31         print "-" * 80
 32         
 33         # 由于上面的MountainGod是True,所以该if语句可以执行
 34         if 'bow' in next or 'kneel' in next and MountainGod: 
 35             print u"我: 请问阁下可是,山神大人?后生,有礼了。在下初到宝地,\n\
 36                    未曾了解本地习俗,还望山神周知。"
 37             print u"山神: 月容夫人托梦给我,说今日会有一位斯文的书生来拜谒。\n\
 38                    想必就是你啦!"
 39             MountainGod = False
 40 
 41             print "Choose: 'kneel', 'flee', 'taunt', or others."
 42             # MountainGod已变为False,所以not MountainGod 就是True,这样就确保了先执行的是上面的if语句。                                    
 43             print u"我: 后生谨奉上清香三支,祝告夫人圣灵。言不尽意,勿怪,勿怪!"     
 44 
 45         elif 'kneel' in next and not MountainGod:                                                     
 46             print u"我: 不瞒山神大人,后生也是误入山林,方知夫人之墓所在,初来乍到,\n\
 47             实对夫人之事不甚了解。"
 48             print u"山神: 月容夫人,是一位传奇的女子。她的事迹,在这片土地上广为\n\
 49             流传。我送你到一个地方,你就知道了。\n"
 50             ShuangXiZui()       
 51         elif 'flee' in next:
 52             print u"我: 好一个凶巴巴的老头。三十六计,走为上。"
 53             start()
 54         elif 'taunt' in next:
 55             print u"我: 好你个老头,说话这么粗鲁,吓唬谁啊?"
 56             monster_tower()    
 57         else:
 58             dead('')
 59 
 60 def ShuangXiZui():
 61     print "-" * 80
 62 
 63     print u"我: 咦,我怎地站在小舟上,眼前是双江汇合,气势磅礴啊。更有皓月当空,夜色如水。"
 64     print u"....远处的海浪渐渐袭来,伴随阵阵渔歌...."
 65     print u"渔歌: 不远千里随夫来,哪知有去却无来。世上岂有天理诉,宁叫好人不长在?\n\
 66     唉,哀哉月容兮,不得与归?皓皓榕江兮,一分为二。双溪明月兮,难分清浊!"
 67     print "Choose: 'boating', 'praying' or others."
 68     next = raw_input(">> ")
 69 
 70     if 'boat' in next:
 71         tomb_of_general()
 72     elif 'pray' in next:
 73         temple()
 74     else:
 75         dead('')
 76 def temple():
 77     print "-" * 80
 78 
 79     print u"有一寺庙兮,曾为夫人建。夫人名讳兮,曰扬州才女。悠悠侣云兮,依山傍水。"
 80     print u"钟声绕梁兮,情与铁坚。不绝于耳兮,缘从响续。"
 81     print u"我: 看来这是专为月容夫人建的寺庙啊,还有冯太爷写的钟铭。"
 82     exit(0)
 83 
 84 def monster_tower():
 85     print "-" * 80
 86 
 87     print u"....宝塔玲珑,暗含乾坤,风起云涌,妖魔为患。...."
 88     print u"我: 妈呀,不该乱说话啊,镇魔塔,全都是妖怪啊。"
 89     print "Choose: 'flee', 'pray' or others."
 90     next = raw_input(">> ")
 91 
 92     if 'flee' and 'pray'in next:
 93         start()
 94     elif 'flee' or 'pray' in next:
 95         dead('')
 96     else:
 97         moster_tower()
 98         
 99 def tomb_of_general():
100     print "-" * 80
101 
102     print u"....好一派鸟语花香,秀色可餐的风景,西湖泛舟,亭台楼阁!...."
103     print u"....一行来到,宋抗元将军马发之墓...."
104     print "Choose: 'clean', 'kneel', go' or others."
105     general_moved = True
106     
107     while True:
108         next = raw_input(">> ")
109         print "-" * 80
110 
111         if 'clean' in next or 'kneel' in next and general_moved:
112             print u"....只见芳草丛生,墓碑荒废...."
113             print u"我: 看来潮州多人杰啊,前有月容夫人,后有马将军。"
114             print u"我: 为民族英雄扫墓,是吾辈之幸啊!"
115             general_moved = False
116 
117             print "Choose: 'kneel', 'go' or others."
118         elif 'kneel' in next and not general_moved:
119             print u"路人: 小伙子,看来你也是个忠义之人,昔有诗人丘逢甲曾为将军赋诗:"
120             print u"凭栏望,韩夫子祠,如此江山,争让前贤留姓氏。"
121             print u"把酒吊,马将军墓,奈何天地,竟将残局付英雄。"
122             print u"我: 想必...老人家可否为晚辈讲一讲马将军的英勇事迹?"
123             print "....Hit Enter to continue or Ctrl+C to stop!..."
124             raw_input(">> ")
125             
126             print u"马发,潮州海阳人(今潮安县),宋末潮州摧锋营副将,临危之际挺身而出,以孤城坚"
127             print u"拒元兵。终因叛徒出卖,潮州城破,复退守金山子城,浴血战至最后一人,举家殉国。"
128             print u"潮州是宋朝最后一座沦陷的州城,城破之后元兵屠城,是潮州历史最惨重的记忆之一。"
129             exit(0)
130         elif 'go' in next:
131             start()
132         else:
133             dead('')
134     
135 start()
原创

 

转载于:https://www.cnblogs.com/Ruby517/p/5572780.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值