python实现成语接龙文字游戏
·
梦想成真了,自己搞一个。
步骤
1、创建文件idiom_chain.py,代码:
import json
import random
# ==========================================
# 第一部分:数据加载模块
# ==========================================
def get_builtin_data():
"""
内置的100个常用成语数据
实际开发中,这里可以是空,直接读取外部文件
"""
return [
"一心一意", "意气风发", "发扬光大", "大庭广众", "众志成城",
"城门失火", "火上浇油", "油腔滑调", "调虎离山", "山清水秀",
"秀外慧中", "中流砥柱", "柱石之坚", "坚持不懈", "舍己为人",
"人定胜天", "天下太平", "平步青云", "云开见日", "日新月异",
"异口同声", "声东击西", "西窗剪烛", "烛照数计", "计上心来",
"来日方长", "长治久安", "安居乐业", "业精于勤", "勤能补拙",
"拙嘴笨舌", "舌战群儒", "儒雅风流", "流连忘返", "返老还童",
"童叟无欺", "欺世盗名", "名副其实", "实事求是", "是非曲直",
"直言不讳", "讳疾忌医", "医时救弊", "弊绝风清", "清风明月",
"月下老人", "人山人海", "海阔天空", "空前绝后", "后继有人",
"人云亦云", "云淡风轻", "轻而易举", "举一反三", "三心二意",
"意气用事", "事半功倍", "倍道而行", "行云流水", "水落石出",
"出生入死", "死里逃生", "生龙活虎", "虎口拔牙", "牙牙学语",
"语重心长", "长年累月", "月黑风高", "高枕无忧", "忧国忧民",
"民不聊生", "生搬硬套", "套头裹脑", "脑满肠肥", "肥头大耳",
"耳聪目明", "明察秋毫", "毫发无损", "损人利己", "己所不欲",
"欲速不达", "达官贵人", "人杰地灵", "灵机一动", "动人心弦",
"弦外之音", "音容笑貌", "貌合神离", "离经叛道", "道听途说",
"说三道四", "四面楚歌", "歌舞升平", "平易近人"
]
def load_json_data(file_path='idioms.json'):
"""
【核心功能】如何对接 Chinese Idioms JSON
假设你下载了一个包含成语的 JSON 文件
"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 假设 JSON 结构是 [{"word": "...", "def": "..."}, ...]
# 我们只提取成语列表
idiom_list = [item['word'] for item in data]
print(f"✅ 成功从 {file_path} 加载了 {len(idiom_list)} 个成语。")
return idiom_list
except FileNotFoundError:
print(f"⚠️ 未找到文件 {file_path},将使用内置的100个成语演示。")
return get_builtin_data()
except Exception as e:
print(f"❌ 读取 JSON 出错: {e}")
return get_builtin_data()
# ==========================================
# 第二部分:游戏逻辑模块
# ==========================================
class IdiomGame:
def __init__(self, idioms):
self.all_idioms = idioms
# 为了快速查找,我们建立一个字典:{首字: [成语列表]}
self.index = {}
self._build_index()
self.last_idiom = ""
def _build_index(self):
"""建立索引,提高查找速度"""
for idiom in self.all_idioms:
first_char = idiom[0]
if first_char not in self.index:
self.index[first_char] = []
self.index[first_char].append(idiom)
def find_next_idiom(self, last_char):
"""根据最后一个字,找到一个成语"""
if last_char in self.index:
candidates = self.index[last_char]
# 随机选一个,避免每次都说一样的
return random.choice(candidates)
return None
def start(self):
print("🎮 欢迎来到成语接龙!输入 'quit' 退出。")
print("电脑先开局:")
# 电脑随机出一个成语
self.last_idiom = random.choice(self.all_idioms)
print(f"电脑: {self.last_idiom}")
while True:
# 1. 玩家输入
user_input = input(f"请接 '{self.last_idiom[-1]}' 字: ").strip()
if user_input.lower() == 'quit':
print("游戏结束,再见!")
break
# 2. 校验玩家输入
if not self.validate_input(user_input, self.last_idiom[-1]):
continue # 输入无效,不进入下一轮
# 3. 电脑回合
last_char = user_input[-1]
computer_response = self.find_next_idiom(last_char)
if computer_response:
print(f"电脑: {computer_response}")
self.last_idiom = computer_response
else:
print(f"电脑: 哎呀,我接不上了!你赢了!(以 '{last_char}' 开头的成语太难了)")
# 游戏继续,让玩家继续出,或者重新开始
self.last_idiom = user_input
def validate_input(self, user_idiom, required_char):
# 检查是否为空
if not user_idiom:
print("❌ 输入不能为空。")
return False
# 检查字数 (简单检查是否为4字成语,也可以放宽限制)
if len(user_idiom) < 4:
print("❌ 成语通常至少四个字哦。")
return False
# 检查首字是否匹配
if user_idiom[0] != required_char:
print(f"❌ 你的成语必须以 '{required_char}' 开头。")
return False
# 检查是否在词库中 (防止玩家乱造词)
# 注意:如果词库很大,这里可以用 set 来加速查找
if user_idiom not in self.all_idioms:
# 宽容模式:如果词库里没有,但符合规则,也可以算过(视难度设定而定)
# 这里为了严谨,我们要求必须在词库里,或者至少符合逻辑
print("⚠️ 词库里好像没有这个成语,但我暂且信你一次!")
# return False # 如果想严格模式,取消这行注释
return True
# ==========================================
# 第三部分:启动游戏
# ==========================================
if __name__ == "__main__":
# 1. 加载数据 (如果你有 idioms.json,它会自动读取)
idiom_list = load_json_data()
# 2. 初始化游戏
game = IdiomGame(idiom_list)
# 3. 开始
game.start()
运行,输入词语即可开始游戏。
接入词库
示例用了100个词的词组,如果想更多词怎么办,有现成的词库。
地址:
https://raw.githubusercontent.com/pwxcoo/chinese-xinhua/master/data/idiom.json
复制到浏览器,另存为json文件,如idoms.json,然后放到python项目中即可。
这个库是以word作为key,所以代码中根据这个字段解即可。
更多推荐



所有评论(0)