梦想成真了,自己搞一个。

步骤

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,所以代码中根据这个字段解即可。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐