這個程序的核心內容就是def語句,if語句和while語句循環的重複使用。python
參考: 習題—35正則表達式
Q^Q 2個多月了,沒想到還會回來再修改這個程序,實在是世事難料呀! from sys import exitshell
這句能夠不用,由於系統自己就自帶這個函數,不信你在命令行或控制檯 (powershell) 輸入"exit" 看看express
可不能夠退出! 固然在python環境下就要以函數的形式eixt()或quit()或快捷鍵 "Ctrl+Z" 才能退出 ~ide
— 2016/8.29函數
----------------------------------------------------------------------------------------------------ui
接下來咱們逐個逐個函數分析 ! 注意函數的寫法是用下劃線隔開單詞(如gold_room, bear_room)編碼
! ! ! (後面學的類是駝峯式寫法如: SuperGoldFactory)idea
1. dead() 死亡 = 退出spa
我認爲做者有點調皮了,應該把這個死亡函數放在第一個函數定義纔是啊,否則開頭就是gold_room(),
還調用了咱們暫時不知道從哪來的死亡函數, 讓人看着犯暈,還得去後面找這個dead()函數的做用! 這個函數
比較簡單,就是打印出你給它的參數,而後退出程序,表示遊戲失敗!
1 def dead(why): 2 print why, "Game over!" 3 exit(0)
這裏咱們把原代碼的 "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!")
其實這裏是做者故意設的一個套, 這裏看似兩個並列的 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.")
注意,咱們不能先把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_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()
接下來的幾個房間都是從一個地方跳到另外一個地方,沒什麼好說的,就先這樣吧!
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() 的調用哦 ! 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()