前言
這是一篇用Python實作成語接龍小游戲的具體開發教程,Python實作這個功能非常容易,以下分為兩個版本,一個是簡易版,能夠實作基本的功能,還有一個是拓展版,是在簡易版上進行拓展,功能更為復雜且完善,
這個可以應用在很多方面,比如說聊天機器人,而且還可以結合itchat這個Python的微信介面玩出花樣等等,
下面放實體:
開發環境:Windows
Python版本:3.x
外置模塊準備:無
檔案準備:成語庫檔案(例如我使用的是idiom.txt),當然也可以從網上抓取匹配成語,但效率相對要慢,本功能是完全可以在本地實作的,
檔案內容圖:
我整理出了共11174個常用成語,不是很全但一般使用是沒有問題的,你們也可以酌情自行添加補充,
PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視頻、PDF檔案等
簡易版實體
實作原理大家可能也想到了,就是呼叫本地成語庫進行字串首尾條件匹配,
先說一下簡易版成語接龍規則:
1.接龍的成語的第一個字必須要與前一個成語結尾的字相同
2.接龍的成語必須是四字成語
3.已使用過的成語雙方均不得再次使用
4.一方不按照規則接龍或接不下去時判定失敗
我將其功能用函式分解了,這樣結構更加清晰也方便除錯,原始碼(檔案名為"idiom_s.py")及注釋如下:
import random def idiom_exists(x): """判斷是否為成語的函式,引數為字串,判斷該字串是否在成語庫中""" with open('idiom.txt','r') as f: for i in set(f.readlines()): if x == i.strip(): return True return False def idiom_test(idiom1, idiom2): """判斷兩個成語是否達成接龍條件""" if idiom2[0] != idiom1[-1] or len(idiom2) != 4: return False return True def idiom_select(x): """核心代碼部分,引數x為成語,回傳該成語的接龍匹配成語""" if x == None: with open('idiom.txt','r') as f: return random.choice(f.readlines())[:-1] else: with open('idiom.txt','r') as f: base = f.readlines() random.shuffle(base) for i in base: if i[:-1] == x or len(i) != 5: continue if i[0] == x[-1]: return i[:-1] return None def idiom_start(start = 0): """start引數表示先后手,0表示電腦先手,1表示玩家先手;回傳值代表游戲結果,為0表示玩家失敗,為1代表玩家勝利""" memory = set() #記憶集合,用于判斷成語是否被重復使用 #如果電腦先手,電腦先拋出的第一個成語我們給點限制,要求它的接龍成語必須存在 if start == 0: while True: t = idiom_select(None) if idiom_select(t) != None and len(t) == 4: break print(t) else: p = input("請輸入成語:") if p.strip() == '': print("游戲結束!你輸了") return 0 if idiom_exists(p) == False: print("游戲結束!該成語不存在") return 0 memory.add(p) cycle_flag = 0 #控制while True回圈次數 while True: t = idiom_select(p) cycle_flag += 1 if t not in memory: break if cycle_flag == 10: t = None break if t == None: print("恭喜你,你贏了!") return 1 else: print(t) memory.add(t) while True: p = input("請輸入成語:") if p.strip() == '': print("游戲結束!你輸了") if idiom_exists(p) == False: print("游戲結束!該成語不存在") return 0 if p in memory: print("游戲結束!該成語已被使用過") return 0 if idiom_test(t, p) == False: print("游戲結束!你未遵守游戲規則") return 0 memory.add(p) cycle_flag = 0 while True: t = idiom_select(p) cycle_flag += 1 if t not in memory: break if cycle_flag == 10: t = None break if t == None: print("恭喜你,你贏了!") return 1 else: print(t) memory.add(t) #測驗運行 idiom_start()
這就是簡易版的全部內容,測驗時將該程式"idiom_s.py"和成語庫檔案"idiom.txt"置于同一目錄下,放個測驗效果圖:
拓展版實體
簡易版的游戲規則略顯嚴格,我們可以稍微對其進行點改變使其更加有趣,但原則上拓展版也必須兼容簡易版的規則,這時我們可以用引數調節游戲規則,
拓展版成語接龍規則:
1.接龍的成語的第一個字必須要與前一個成語結尾的字相同(mode = 0);接龍的成語的第一個字的拼音包括音調要與前一個成語結尾的字的拼音和音調相同(mode = 1);接龍的成語的第一個字的拼音字母(不包括音調)與前一個成語結尾的字的拼音字母相同(mode = 2)
2.接龍的成語必須是四字成語(opt = 0);接龍的成語可以不是四字成語(opt = 1)
3.已使用過的成語雙方均不得再次使用
4.一方不按照規則接龍或接不下去時判定失敗
可以看出拓展版的確對簡易版做了比較大的拓展,還涉及漢字轉拼音,
下面展示原始碼(檔案名為"idiom_p.py"):
import random def chinese_to_pinyin(x): """引數為字串,回傳為該字串對應的漢語拼音""" y = '' dic = {} with open("unicode_pinyin.txt") as f: for i in f.readlines(): dic[i.split()[0]] = i.split()[1] for i in x: i = str(i.encode('unicode_escape'))[-5:-1].upper() try: y += dic[i] + ' ' except: y += 'XXXX ' #非法字符我們用XXXX代替 return y def idiom_exists(x): """判斷是否為成語的函式,引數為字串,判斷該字串是否在成語庫中""" with open('idiom.txt','r') as f: for i in set(f.readlines()): if x == i.strip(): return True return False def idiom_test(idiom1, idiom2, mode, opt): """判斷兩個成語是否達成接龍條件""" #為了可讀性,我把它分開寫,比較清晰 if mode == 0 and idiom2[0] != idiom1[-1]: return False if mode == 1 and chinese_to_pinyin(idiom2[0]) != chinese_to_pinyin(idiom1[-1]): return False if mode ==2 and chinese_to_pinyin(idiom2[0])[:-2] != chinese_to_pinyin(idiom1[-1])[:-2]: return False if opt == 0 and len(idiom2) != 4: return False return True def idiom_select(x, mode, opt): """核心代碼部分,引數x為成語,回傳該成語的接龍匹配成語""" if x == None: with open('idiom.txt','r') as f: return random.choice(f.readlines())[:-1] else: with open('idiom.txt','r') as f: #以下六行代碼,通過索引排除無效回圈,顯著提升運行效率 pinyin = chinese_to_pinyin(x[-1]) base = f.readlines() if pinyin[0] != 'Z': base = base[base.index(pinyin[0]+'\n'):base.index(chr(ord(pinyin[0])+1)+'\n')] else: base = base[base.index(pinyin[0]+'\n'):] random.shuffle(base) for i in base: if i[:-1] == x or (opt == 0 and len(i) != 5): continue if mode == 0 and i[0] == x[-1]: return i[:-1] if mode == 1 and chinese_to_pinyin(i[0]) == pinyin: return i[:-1] if mode == 2 and chinese_to_pinyin(i[0])[:-2] == pinyin[:-2]: return i[:-1] return None def idiom_start(start = 0, mode = 0, opt = 0): """start引數表示先后手,0表示電腦先手,1表示玩家先手;回傳值代表游戲結果,為0表示玩家失敗,為1代表玩家勝利""" memory = set() #記憶集合,用于判斷成語是否被重復使用 if start == 0: while True: t = idiom_select(None, mode, opt) if idiom_select(t, mode, opt) != None: break print(t) else: p = input("請輸入成語:") if p.strip() == '': print("游戲結束!你輸了") return 0 if idiom_exists(p) == False: print("游戲結束!該成語不存在") return 0 memory.add(p) cycle_flag = 0 #控制while True回圈次數 while True: t = idiom_select(p, mode, opt) cycle_flag += 1 if t not in memory: break if cycle_flag == 10: t = None break if t == None: print("恭喜你,你贏了!") return 1 else: print(t) memory.add(t) while True: p = input("請輸入成語:") if p.strip() == '': print("游戲結束!你輸了") if idiom_exists(p) == False: print("游戲結束!該成語不存在") return 0 if p in memory: print("游戲結束!該成語已被使用過") return 0 if idiom_test(t, p, mode, opt) == False: print("游戲結束!你未遵守游戲規則") return 0 memory.add(p) cycle_flag = 0 while True: t = idiom_select(p, mode, opt) cycle_flag += 1 if t not in memory: break if cycle_flag == 10: t = None break if t == None: print("恭喜你,你贏了!") return 1 else: print(t) memory.add(t) #測驗運行,修改引數使其變為規則更加寬松的接龍(mode和opt默認為0則為簡易版的成語接龍) idiom_start(start=1, mode=2, opt=1)
這就是簡易版的全部內容,測驗時將該程式"idiom_p.py",成語庫檔案"idiom.txt"和漢字拼音檔案"unicode_pinyin.txt"置于同一目錄下,放個測驗效果圖:
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
作者:碧茂大資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/57012.html
標籤:Python
上一篇:Python演算法教程_中文版書籍 程式員必備 免費下載
下一篇:求哥德巴赫猜想
