Remove idiom_game_qa.py and idiom_solitaire.py

This commit is contained in:
st2411020112 2026-01-09 10:27:07 +08:00
parent 386cd9534d
commit df939b9958
2 changed files with 0 additions and 873 deletions

View File

@ -1,256 +0,0 @@
import streamlit as st
import requests
from pydantic import BaseModel, Field
from dotenv import load_dotenv
import os
import json
# 加载环境变量
load_dotenv()
# 设置API密钥
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY", "sk-b04b9134730c4375a5789e2e00978ee0")
API_BASE_URL = "https://api.deepseek.com/v1/chat/completions"
# 定义Pydantic数据模型
class IdiomResponse(BaseModel):
idiom: str = Field(..., description="成语")
meaning: str = Field(..., description="成语含义")
pinyin: str = Field(..., description="拼音")
explanation: str = Field(..., description="详细解释")
class GameState(BaseModel):
current_idiom: str = Field(default="", description="当前成语")
history: list = Field(default_factory=list, description="成语接龙历史")
score: int = Field(default=0, description="得分")
is_game_over: bool = Field(default=False, description="游戏是否结束")
# 初始化游戏状态
if "game_state" not in st.session_state:
st.session_state.game_state = GameState()
# 调用DeepSeek API生成下一个成语
def get_next_idiom(last_idiom: str) -> IdiomResponse:
headers = {
"Authorization": f"Bearer {DEEPSEEK_API_KEY}",
"Content-Type": "application/json"
}
# 构建提示词
prompt = f"请你作为一个成语接龙游戏的助手,根据最后一个成语的最后一个字,生成下一个成语。上一个成语是:{last_idiom}。请严格按照JSON格式返回{{\"idiom\": \"成语\", \"meaning\": \"简短含义\", \"pinyin\": \"拼音\", \"explanation\": \"详细解释\"}},不要添加任何其他内容。"
payload = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个中文成语专家,精通成语接龙游戏。"},
{"role": "user", "content": prompt}
],
"temperature": 0.3,
"response_format": {"type": "json_object"}
}
response = requests.post(API_BASE_URL, headers=headers, json=payload, timeout=30.0)
response.raise_for_status()
data = response.json()
# 解析API响应
content = data["choices"][0]["message"]["content"]
return IdiomResponse.model_validate_json(content)
# 检查用户输入的成语是否有效
def validate_user_idiom(user_idiom: str, last_idiom: str) -> bool:
if len(user_idiom) != 4:
return False
if last_idiom and user_idiom[0] != last_idiom[-1]:
return False
return True
# 检测用户输入是否为问题
def is_question(user_input: str) -> bool:
question_markers = ['?', '', '', '', '', '什么', '怎么', '为什么', '何时', '何地', '', '哪个']
return any(marker in user_input for marker in question_markers)
# 处理用户问题
def handle_question(user_question: str) -> str:
headers = {
"Authorization": f"Bearer {DEEPSEEK_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个中文成语专家,同时也是一个知识渊博的助手。你可以进行成语接龙游戏,也可以回答各种问题。"},
{"role": "user", "content": user_question}
],
"temperature": 0.7
}
response = requests.post(API_BASE_URL, headers=headers, json=payload, timeout=30.0)
response.raise_for_status()
data = response.json()
return data["choices"][0]["message"]["content"]
# 重置游戏
def reset_game():
st.session_state.game_state = GameState()
# 主应用界面
st.title("🎯 成语接龙游戏")
st.write("与AI一起玩成语接龙看看谁的成语储备更丰富你也可以随时向AI提问。")
# 游戏控制区
col1, col2 = st.columns(2)
with col1:
if st.button("🎮 开始新游戏", type="primary"):
reset_game()
with col2:
if st.button("📊 查看规则"):
st.info("""
**成语接龙规则**
1. 游戏开始时AI会先出一个成语
2. 玩家需要接一个以AI成语最后一个字开头的四字成语
3. AI会继续接玩家的成语
4. 如此循环直到一方无法接出成语
5. 每成功接一个成语得分+1
**提问功能**
- 随时可以向AI提问输入包含问号或疑问词的句子
- AI会回答你的问题然后继续游戏
""")
# 游戏状态显示
st.markdown("---")
# 初始状态AI先出成语
if not st.session_state.game_state.current_idiom and not st.session_state.game_state.is_game_over:
with st.spinner("🤖 AI正在思考第一个成语..."):
try:
# 使用一个默认的起始成语让AI开始
initial_idiom = get_next_idiom("开门见山")
st.session_state.game_state.current_idiom = initial_idiom.idiom
st.session_state.game_state.history.append({
"role": "ai",
"type": "idiom",
"idiom": initial_idiom.idiom,
"meaning": initial_idiom.meaning,
"pinyin": initial_idiom.pinyin,
"explanation": initial_idiom.explanation
})
except Exception as e:
st.error(f"🤖 AI出错了{str(e)}")
st.session_state.game_state.is_game_over = True
# 游戏进行中
if st.session_state.game_state.current_idiom and not st.session_state.game_state.is_game_over:
# 显示当前成语
current = st.session_state.game_state.history[-1]
if current["type"] == "idiom":
st.markdown(f"\n**🤖 AI 出的成语:** {current['idiom']}")
st.caption(f"拼音:{current['pinyin']} | 含义:{current['meaning']}")
with st.expander("查看详细解释"):
st.write(current['explanation'])
elif current["type"] == "answer":
st.markdown(f"\n**🤖 AI 的回答:** {current['content']}")
# 用户输入区
user_input = st.text_input(
f"\n请接一个以'**{st.session_state.game_state.current_idiom[-1]}**'开头的四字成语或向AI提问",
placeholder="例如xxx 或 你好吗?",
key="user_idiom_input"
)
# 提交按钮
if st.button("✅ 提交", key="submit_btn"):
# 检测是否为问题
if is_question(user_input):
# 处理问题
with st.spinner("🤖 AI正在思考..."):
try:
answer = handle_question(user_input)
st.session_state.game_state.history.append({
"role": "user",
"type": "question",
"content": user_input
})
st.session_state.game_state.history.append({
"role": "ai",
"type": "answer",
"content": answer
})
st.rerun()
except Exception as e:
st.error(f"🤖 AI出错了{str(e)}")
else:
# 处理成语接龙
if validate_user_idiom(user_input, st.session_state.game_state.current_idiom):
# 验证通过,记录用户的成语
st.session_state.game_state.history.append({
"role": "user",
"type": "idiom",
"idiom": user_input,
"meaning": "",
"pinyin": ""
})
st.session_state.game_state.score += 1
# AI 接成语
with st.spinner("🤖 AI正在思考..."):
try:
next_idiom = get_next_idiom(user_input)
st.session_state.game_state.current_idiom = next_idiom.idiom
st.session_state.game_state.history.append({
"role": "ai",
"type": "idiom",
"idiom": next_idiom.idiom,
"meaning": next_idiom.meaning,
"pinyin": next_idiom.pinyin,
"explanation": next_idiom.explanation
})
st.rerun()
except Exception as e:
st.success("🎉 AI接不上来你赢了")
st.session_state.game_state.is_game_over = True
else:
st.error("❌ 无效的成语!请确保是四字成语且第一个字与上一个成语的最后一个字相同。")
# 游戏结束
if st.session_state.game_state.is_game_over:
st.markdown("\n---")
st.success(f"🎉 游戏结束!你的得分:{st.session_state.game_state.score}")
# 显示历史记录
if st.session_state.game_state.history:
st.markdown("\n📝 **游戏历史:**")
for i, item in enumerate(st.session_state.game_state.history):
role = "🤖 AI" if item["role"] == "ai" else "👤 你"
if item["type"] == "idiom":
st.write(f"{i+1}. {role}: {item['idiom']}")
else:
st.write(f"{i+1}. {role}: {item['content']}")
# 侧边栏信息
with st.sidebar:
st.markdown("## 📊 游戏统计")
st.write(f"**当前得分:** {st.session_state.game_state.score}")
st.write(f"**接龙次数:** {len([item for item in st.session_state.game_state.history if item.get('type') == 'idiom'])}")
if st.session_state.game_state.history:
st.markdown("\n## 📖 最近互动")
for i, item in enumerate(reversed(st.session_state.game_state.history[-5:])):
role = "🤖" if item["role"] == "ai" else "👤"
if item["type"] == "idiom":
st.write(f"{role} {item['idiom']}")
else:
st.write(f"{role} {item['content'][:30]}...")
st.markdown("\n## 📌 提示")
st.write("- 确保输入的是标准四字成语")
st.write("- 注意汉字的正确写法")
st.write("- 可以使用同音字进行接龙")
st.write("- 随时可以向AI提问")

View File

@ -1,617 +0,0 @@
import streamlit as st
import requests
import random
import json
import re
# 配置
DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
# 尝试从secrets获取API密钥如果失败则使用默认值
try:
DEEPSEEK_API_KEY = st.secrets.get("deepseek_api_key", "your_api_key_here")
except Exception:
DEEPSEEK_API_KEY = "your_api_key_here"
# 本地成语库(仅用于生成题目)
IDIOMS = {
"一心一意": {"pinyin": "yī xīn yī yì", "meaning": "形容做事专心一意,没有其他念头"},
"意气风发": {"pinyin": "yì qì fēng fā", "meaning": "形容精神振奋,气概豪迈"},
"发扬光大": {"pinyin": "fā yáng guāng dà", "meaning": "使事业、传统等更加发展壮大"},
"大材小用": {"pinyin": "dà cái xiǎo yòng", "meaning": "比喻使用不当,浪费人才"},
"用兵如神": {"pinyin": "yòng bīng rú shén", "meaning": "形容指挥军队作战的才能极高"},
"神采飞扬": {"pinyin": "shén cǎi fēi yáng", "meaning": "形容精神饱满,容光焕发"},
"扬长避短": {"pinyin": "yáng cháng bì duǎn", "meaning": "发扬长处,避开短处"},
"短兵相接": {"pinyin": "duǎn bīng xiāng jiē", "meaning": "比喻面对面地进行激烈的斗争"},
"接二连三": {"pinyin": "jiē èr lián sān", "meaning": "一个接着一个,接连不断"},
"三心二意": {"pinyin": "sān xīn èr yì", "meaning": "形容犹豫不决,意志不坚定"},
"意气用事": {"pinyin": "yì qì yòng shì", "meaning": "凭感情冲动办事,缺乏理智"},
"事在人为": {"pinyin": "shì zài rén wéi", "meaning": "事情的成功全在于人的努力"},
"为人师表": {"pinyin": "wéi rén shī biǎo", "meaning": "指在人品学问方面作别人学习的榜样"},
"表里如一": {"pinyin": "biǎo lǐ rú yī", "meaning": "形容言行和思想完全一致"},
"一如既往": {"pinyin": "yī rú jì wǎng", "meaning": "指态度没有变化,完全像从前一样"},
"往返徒劳": {"pinyin": "wǎng fǎn tú láo", "meaning": "来回白跑,没有成效"},
"劳民伤财": {"pinyin": "láo mín shāng cái", "meaning": "既使人民劳苦,又耗费钱财"},
"财大气粗": {"pinyin": "cái dà qì cū", "meaning": "指人仗着钱财多而气势凌人"},
"粗枝大叶": {"pinyin": "cū zhī dà yè", "meaning": "比喻工作粗糙,不认真细致"},
"叶公好龙": {"pinyin": "yè gōng hào lóng", "meaning": "比喻表面上爱好某事物,实际上并不真爱好"},
"龙马精神": {"pinyin": "lóng mǎ jīng shén", "meaning": "比喻人精神旺盛"},
"神采奕奕": {"pinyin": "shén cǎi yì yì", "meaning": "形容精神饱满,容光焕发"},
"奕奕生辉": {"pinyin": "yì yì shēng huī", "meaning": "形容光彩闪耀的样子"},
"辉煌腾达": {"pinyin": "huī huáng téng dá", "meaning": "形容事业或成就非常辉煌"},
"达官贵人": {"pinyin": "dá guān guì rén", "meaning": "指地位高的官吏和显赫的人物"},
"人山人海": {"pinyin": "rén shān rén hǎi", "meaning": "形容人聚集得非常多"},
"海阔天空": {"pinyin": "hǎi kuò tiān kōng", "meaning": "比喻言谈议论等漫无边际,没有中心"},
"空穴来风": {"pinyin": "kōng xué lái fēng", "meaning": "比喻消息和谣言的传播不是完全没有原因的"},
"风调雨顺": {"pinyin": "fēng tiáo yǔ shùn", "meaning": "形容风雨适合农时"},
"顺理成章": {"pinyin": "shùn lǐ chéng zhāng", "meaning": "指写文章或做事情顺着条理就能做好"},
"章句小儒": {"pinyin": "zhāng jù xiǎo rú", "meaning": "指不能通达大义而拘泥于辨析章句的儒生"},
"儒雅风流": {"pinyin": "rú yǎ fēng liú", "meaning": "形容人学识渊博,举止潇洒"},
"流芳百世": {"pinyin": "liú fāng bǎi shì", "meaning": "好的名声永远流传下去"},
"世代相传": {"pinyin": "shì dài xiāng chuán", "meaning": "祖祖辈辈传下来"},
"传宗接代": {"pinyin": "chuán zōng jiē dài", "meaning": "指生儿育女,延续后代"},
"代人受过": {"pinyin": "dài rén shòu guò", "meaning": "替别人承担过错的责任"},
"过目不忘": {"pinyin": "guò mù bù wàng", "meaning": "看过就不忘记,形容记忆力非常强"},
"忘乎所以": {"pinyin": "wàng hū suǒ yǐ", "meaning": "指因过分兴奋或得意而忘了应有的举止"},
"以卵击石": {"pinyin": "yǐ luǎn jī shí", "meaning": "比喻不自量力,自取灭亡"},
"石沉大海": {"pinyin": "shí chén dà hǎi", "meaning": "比喻从此没有消息"},
"海纳百川": {"pinyin": "hǎi nà bǎi chuān", "meaning": "比喻包容的东西非常广泛,而且数量很大"},
"川流不息": {"pinyin": "chuān liú bù xī", "meaning": "形容行人、车马等像水流一样连续不断"},
"息事宁人": {"pinyin": "xī shì níng rén", "meaning": "指调解纠纷,使事情平息下来,消除事端,使人们平安相处"},
"人山人海": {"pinyin": "rén shān rén hǎi", "meaning": "形容人聚集得非常多"},
"海底捞月": {"pinyin": "hǎi dǐ lāo yuè", "meaning": "比喻去做根本做不到的事,只能白费力气"},
"月明星稀": {"pinyin": "yuè míng xīng xī", "meaning": "月亮明亮时,星星就显得稀疏了"},
"稀奇古怪": {"pinyin": "xī qí gǔ guài", "meaning": "指很少见,很奇异,不同一般"},
"怪诞不经": {"pinyin": "guài dàn bù jīng", "meaning": "指言语奇怪荒唐,不合常理"},
"经久不息": {"pinyin": "jīng jiǔ bù xī", "meaning": "经过长时间停不下来"},
"息息相关": {"pinyin": "xī xī xiāng guān", "meaning": "形容彼此的关系非常密切"},
"关门大吉": {"pinyin": "guān mén dà jí", "meaning": "指商店倒闭或企业破产停业"},
"吉祥如意": {"pinyin": "jí xiáng rú yì", "meaning": "多用祝颂他人美满称心"},
"意气相投": {"pinyin": "yì qì xiāng tóu", "meaning": "指志趣和性格相同的人,彼此投合"},
"投桃报李": {"pinyin": "tóu táo bào lǐ", "meaning": "比喻友好往来或互相赠送东西"},
"李代桃僵": {"pinyin": "lǐ dài táo jiāng", "meaning": "比喻互相顶替或代人受过"},
"僵李代桃": {"pinyin": "jiāng lǐ dài táo", "meaning": "比喻代人受罪责或以此代彼"},
"桃红柳绿": {"pinyin": "táo hóng liǔ lǜ", "meaning": "形容花木繁盛、色彩鲜艳的春景"},
"绿水青山": {"pinyin": "lǜ shuǐ qīng shān", "meaning": "泛称美好山河"},
"山明水秀": {"pinyin": "shān míng shuǐ xiù", "meaning": "形容风景优美"},
"秀色可餐": {"pinyin": "xiù sè kě cān", "meaning": "形容女子姿容非常美丽或景物非常优美"},
"餐风露宿": {"pinyin": "cān fēng lù sù", "meaning": "形容旅途或野外工作的辛苦"},
"宿弊一清": {"pinyin": "sù bì yī qīng", "meaning": "多年的弊病一下就肃清了"},
"清夜扪心": {"pinyin": "qīng yè mén xīn", "meaning": "指深夜不眠,进行反省"},
"心花怒放": {"pinyin": "xīn huā nù fàng", "meaning": "心里高兴得像花儿盛开一样,形容极其高兴"},
"放虎归山": {"pinyin": "fàng hǔ guī shān", "meaning": "比喻把坏人放回老巢,留下祸根"},
"山高水长": {"pinyin": "shān gāo shuǐ cháng", "meaning": "原比喻人的风范或声誉像高山一样永远存在,后比喻恩德深厚"},
"长生不老": {"pinyin": "cháng shēng bù lǎo", "meaning": "指生命不老不死永生不灭"},
"老当益壮": {"pinyin": "lǎo dāng yì zhuàng", "meaning": "年纪虽老而志气更旺盛,干劲更足"},
"壮志凌云": {"pinyin": "zhuàng zhì líng yún", "meaning": "形容理想宏伟远大"},
"云开见日": {"pinyin": "yún kāi jiàn rì", "meaning": "比喻黑暗已经过去,光明已经到来"},
"日新月异": {"pinyin": "rì xīn yuè yì", "meaning": "每天都在更新,每月都有变化,指发展或进步迅速,不断出现新事物、新气象"},
"异想天开": {"pinyin": "yì xiǎng tiān kāi", "meaning": "比喻荒唐离奇,想象着暂时无法实现的事"},
"开门见山": {"pinyin": "kāi mén jiàn shān", "meaning": "比喻说话或写文章直截了当谈本题,不拐弯抹角"},
"山高路远": {"pinyin": "shān gāo lù yuǎn", "meaning": "形容路途艰难而遥远"},
"远见卓识": {"pinyin": "yuǎn jiàn zhuó shí", "meaning": "有远大的眼光和高明的见解"},
"识文断字": {"pinyin": "shí wén duàn zì", "meaning": "指识字,指有一点文化知识"},
"字斟句酌": {"pinyin": "zì zhēn jù zhuó", "meaning": "指写文章或说话时慎重细致,一字一句地推敲琢磨"},
"酌古御今": {"pinyin": "zhuó gǔ yù jīn", "meaning": "指择古之善者以为治今的借鉴"},
"今非昔比": {"pinyin": "jīn fēi xī bǐ", "meaning": "现在不是过去能比得上的,多指形势、自然面貌等发生了巨大的变化"},
"比翼双飞": {"pinyin": "bǐ yì shuāng fēi", "meaning": "比喻夫妻情投意合,在事业上并肩前进"},
"飞黄腾达": {"pinyin": "fēi huáng téng dá", "meaning": "形容骏马奔腾飞驰,比喻骤然得志,官职升得很快"},
"达官贵人": {"pinyin": "dá guān guì rén", "meaning": "指地位高的官吏和显赫的人物"},
"人山人海": {"pinyin": "rén shān rén hǎi", "meaning": "形容人聚集得非常多"},
"海枯石烂": {"pinyin": "hǎi kū shí làn", "meaning": "海水干涸、石头腐烂,形容历时久远,比喻坚定的意志永远不变"},
"烂熟于心": {"pinyin": "làn shú yú xīn", "meaning": "形容对某件事情或者事物的发展情况在心里记得很清楚"},
"心灵手巧": {"pinyin": "xīn líng shǒu qiǎo", "meaning": "心思灵敏,手艺巧妙"},
"巧夺天工": {"pinyin": "qiǎo duó tiān gōng", "meaning": "人工的精巧胜过天然,形容技艺十分巧妙"},
"工欲善其事,必先利其器": {"pinyin": "gōng yù shàn qí shìbì xiān lì qí qì", "meaning": "比喻要做好一件事,准备工作非常重要"},
"器宇轩昂": {"pinyin": "qì yǔ xuān áng", "meaning": "形容人精力充沛,风度不凡"},
"昂首挺胸": {"pinyin": "áng shǒu tǐng xiōng", "meaning": "抬起头,挺起胸膛,形容斗志高,士气旺"},
"胸有成竹": {"pinyin": "xiōng yǒu chéng zhú", "meaning": "原指画竹子要在心里有一幅竹子的形象,后比喻在做事之前已经拿定主意"},
"竹报平安": {"pinyin": "zhú bào píng ān", "meaning": "比喻平安家信"},
"安步当车": {"pinyin": "ān bù dàng chē", "meaning": "以从容的步行代替乘车,形容轻松缓慢地行走"},
"车水马龙": {"pinyin": "chē shuǐ mǎ lóng", "meaning": "形容来往车马很多,连续不断的热闹情景"},
"龙飞凤舞": {"pinyin": "lóng fēi fèng wǔ", "meaning": "原形容山势的蜿蜒雄壮,后也形容书法笔势有力,灵活舒展"},
"舞文弄墨": {"pinyin": "wǔ wén nòng mò", "meaning": "故意玩弄文笔,原指曲引法律条文作弊,后常指玩弄文字技巧"},
"墨守成规": {"pinyin": "mò shǒu chéng guī", "meaning": "指思想保守,守着老规矩不肯改变"},
"规行矩步": {"pinyin": "guī xíng jǔ bù", "meaning": "指严格按照规矩办事,毫不苟且"},
"步步为营": {"pinyin": "bù bù wéi yíng", "meaning": "军队每向前推进一步就设下一首营垒,形容防守严密,行动谨慎"},
"营私舞弊": {"pinyin": "yíng sī wǔ bì", "meaning": "因图谋私利而玩弄欺骗手段做犯法的事"},
"弊绝风清": {"pinyin": "bì jué fēng qīng", "meaning": "贪污、舞弊的事情没有了,形容坏事绝迹,社会风气良好"},
"清风明月": {"pinyin": "qīng fēng míng yuè", "meaning": "只与清风、明月为伴,比喻不随便结交朋友,也比喻清闲无事"},
"月白风清": {"pinyin": "yuè bái fēng qīng", "meaning": "形容幽静美好的夜晚"},
"清风徐来": {"pinyin": "qīng fēng xú lái", "meaning": "清风缓缓地吹来"},
"来日方长": {"pinyin": "lái rì fāng cháng", "meaning": "未来的日子还很长,表示事有可为,或劝人不必急于做某事"},
"长驱直入": {"pinyin": "cháng qū zhí rù", "meaning": "迅速向很远的目的地前进,形容进军迅猛顺利"},
"入木三分": {"pinyin": "rù mù sān fēn", "meaning": "形容书法极有笔力,现多比喻分析问题很深刻"},
"分秒必争": {"pinyin": "fēn miǎo bì zhēng", "meaning": "一分一秒也一定要争取,形容抓紧时间"},
"争先恐后": {"pinyin": "zhēng xiān kǒng hòu", "meaning": "抢着向前,唯恐落后"},
"后来居上": {"pinyin": "hòu lái jū shàng", "meaning": "后来的超过先前的,用以称赞后起之秀超过前辈"},
"上行下效": {"pinyin": "shàng xíng xià xiào", "meaning": "上面的人怎么做,下面的人就跟着怎么干"},
"效颦学步": {"pinyin": "xiào pín xué bù", "meaning": "比喻盲目模仿,效果极坏"},
"步履维艰": {"pinyin": "bù lǚ wéi jiān", "meaning": "指行走困难行动不方便"},
"艰苦奋斗": {"pinyin": "jiān kǔ fèn dòu", "meaning": "不怕艰难困苦,坚持英勇斗争"},
"斗志昂扬": {"pinyin": "dòu zhì áng yáng", "meaning": "斗争的意志旺盛"},
"扬长而去": {"pinyin": "yáng cháng ér qù", "meaning": "大模大样地径自走了"},
"去伪存真": {"pinyin": "qù wěi cún zhēn", "meaning": "除掉虚假的,留下真实的"},
"真相大白": {"pinyin": "zhēn xiàng dà bái", "meaning": "真实情况完全弄明白了"},
"白头偕老": {"pinyin": "bái tóu xié lǎo", "meaning": "夫妻相亲相爱,一直到老"},
"老气横秋": {"pinyin": "lǎo qì héng qiū", "meaning": "形容老练而自负的神态,现形容自高自大,摆老资格,也形容缺乏朝气"},
"秋高气爽": {"pinyin": "qiū gāo qì shuǎng", "meaning": "形容秋季晴空万里,天气清爽"},
"爽心悦目": {"pinyin": "shuǎng xīn yuè mù", "meaning": "指景色美丽,令人心情愉快"},
"目瞪口呆": {"pinyin": "mù dèng kǒu dāi", "meaning": "形容因吃惊或害怕而发愣的样子"},
"呆若木鸡": {"pinyin": "dāi ruò mù jī", "meaning": "形容因恐惧或惊异而发愣的样子"},
"鸡飞狗跳": {"pinyin": "jī fēi gǒu tiào", "meaning": "把鸡吓得飞起来,把狗吓得到处乱跳,形容惊慌得乱成一团"},
"跳梁小丑": {"pinyin": "tiào liáng xiǎo chǒu", "meaning": "比喻猖狂捣乱而成不了大气候的坏人"},
"丑态百出": {"pinyin": "chǒu tài bǎi chū", "meaning": "各种丑恶的样子都表现出来了"},
"出类拔萃": {"pinyin": "chū lèi bá cuì", "meaning": "超出同类之上,多指人的品德才能"},
"萃萃学子": {"pinyin": "cuì cuì xué zǐ", "meaning": "众多的学生"},
"子虚乌有": {"pinyin": "zǐ xū wū yǒu", "meaning": "指假设的、不存在的、不真实的事情"},
"有目共睹": {"pinyin": "yǒu mù gòng dǔ", "meaning": "指非常明显,谁都看得见"},
"睹物思人": {"pinyin": "dǔ wù sī rén", "meaning": "看见死去或离别的人留下的东西就想起了这个人"},
"人山人海": {"pinyin": "rén shān rén hǎi", "meaning": "形容人聚集得非常多"},
"海阔天空": {"pinyin": "hǎi kuò tiān kōng", "meaning": "比喻言谈议论等漫无边际,没有中心"},
"空穴来风": {"pinyin": "kōng xué lái fēng", "meaning": "比喻消息和谣言的传播不是完全没有原因的"},
"风言风语": {"pinyin": "fēng yán fēng yǔ", "meaning": "没有根据的、不怀好意的、带有讥讽的话"},
"语重心长": {"pinyin": "yǔ zhòng xīn cháng", "meaning": "话深刻有力,情意深长"},
"长话短说": {"pinyin": "cháng huà duǎn shuō", "meaning": "把要用很多话才能说完的事用简短的话说完"},
"说三道四": {"pinyin": "shuō sān dào sì", "meaning": "形容不负责任地胡乱议论"},
"四面楚歌": {"pinyin": "sì miàn chǔ gē", "meaning": "比喻陷入四面受敌、孤立无援的境地"},
"歌舞升平": {"pinyin": "gē wǔ shēng píng", "meaning": "边歌边舞,庆祝太平,有粉饰太平的意思"},
"平心静气": {"pinyin": "píng xīn jìng qì", "meaning": "心情平和,态度冷静"},
"气宇轩昂": {"pinyin": "qì yǔ xuān áng", "meaning": "形容人精力充沛,风度不凡"},
"昂首阔步": {"pinyin": "áng shǒu kuò bù", "meaning": "抬起头迈开大步向前,形容精神抖擞,意气风发"},
"步履蹒跚": {"pinyin": "bù lǚ pán shān", "meaning": "走路一瘸一拐的样子,形容走路腿脚不方便,歪歪倒倒的样子"},
"跚跚来迟": {"pinyin": "shān shān lái chí", "meaning": "形容慢腾腾地来晚了"},
"迟疑不决": {"pinyin": "chí yí bù jué", "meaning": "形容拿不定主意"},
"决一雌雄": {"pinyin": "jué yī cí xióng", "meaning": "指较量一下胜败高低"},
"雄才大略": {"pinyin": "xióng cái dà lüè", "meaning": "非常杰出的才智和谋略"},
"略知一二": {"pinyin": "lüè zhī yī èr", "meaning": "略微知道一点"},
"二话不说": {"pinyin": "èr huà bù shuō", "meaning": "不说任何别的话,指立即行动"},
"说一不二": {"pinyin": "shuō yī bù èr", "meaning": "说怎么样就怎么样,形容说话算数"},
"二龙戏珠": {"pinyin": "èr lóng xì zhū", "meaning": "两条龙相对,戏玩着一颗宝珠"},
"珠光宝气": {"pinyin": "zhū guāng bǎo qì", "meaning": "形容妇女服饰华贵富丽,闪耀着珍宝的光色"},
"气吞山河": {"pinyin": "qì tūn shān hé", "meaning": "气势可以吞没山河,形容气魄很大"},
"河清海晏": {"pinyin": "hé qīng hǎi yàn", "meaning": "黄河水清,大海平静,形容天下太平"},
"晏然自若": {"pinyin": "yàn rán zì ruò", "meaning": "形容在紧张状态下沉静如常"},
"若无其事": {"pinyin": "ruò wú qí shì", "meaning": "好像没有那么回事似的,形容不动声色或漠不关心"},
"事半功倍": {"pinyin": "shì bàn gōng bèi", "meaning": "指做事得法,因而费力小,收效大"},
"倍道兼行": {"pinyin": "bèi dào jiān xíng", "meaning": "每天加倍行进,一天走两天的路程,形容加速急行"},
"行云流水": {"pinyin": "xíng yún liú shuǐ", "meaning": "形容文章自然不受约束,就像漂浮着的云和流动着的水一样"},
"水落石出": {"pinyin": "shuǐ luò shí chū", "meaning": "水落下去,水底的石头就露出来,比喻事情的真相完全显露出来"},
"出人头地": {"pinyin": "chū rén tóu dì", "meaning": "指高人一等,形容德才超众或成就突出"},
"地大物博": {"pinyin": "dì dà wù bó", "meaning": "指国家疆土辽阔,资源丰富"},
"博古通今": {"pinyin": "bó gǔ tōng jīn", "meaning": "对古代的事知道得很多,并且通晓现代的事情,形容知识丰富"},
"今不如昔": {"pinyin": "jīn bù rú xī", "meaning": "现在不如过去,多表示对世事的感叹"},
"昔不如今": {"pinyin": "xī bù rú jīn", "meaning": "现在比过去好"},
"今非昔比": {"pinyin": "jīn fēi xī bǐ", "meaning": "现在不是过去能比得上的,多指形势、自然面貌等发生了巨大的变化"},
"比比皆是": {"pinyin": "bǐ bǐ jiē shì", "meaning": "到处都是,形容极其常见"},
"是非曲直": {"pinyin": "shì fēi qǔ zhí", "meaning": "正确还是不正确,有理还是无理"},
"直截了当": {"pinyin": "zhí jié liǎo dàng", "meaning": "形容说话做事爽快,不绕弯子"},
"当机立断": {"pinyin": "dāng jī lì duàn", "meaning": "在紧要时刻立即做出决断"},
"断章取义": {"pinyin": "duàn zhāng qǔ yì", "meaning": "指不顾全篇文章或谈话的内容,孤立地取其中的一段或一句的意思"},
"义不容辞": {"pinyin": "yì bù róng cí", "meaning": "道义上不允许推辞"},
"辞旧迎新": {"pinyin": "cí jiù yíng xīn", "meaning": "告别旧的一年,迎接新的一年的到来"},
"新陈代谢": {"pinyin": "xīn chén dài xiè", "meaning": "指生物体不断用新物质代替旧物质的过程"},
"谢天谢地": {"pinyin": "xiè tiān xiè dì", "meaning": "表示目的达到或困难解除后满意轻松的心情"},
"地老天荒": {"pinyin": "dì lǎo tiān huāng", "meaning": "指经历的时间极久"},
"荒诞不经": {"pinyin": "huāng dàn bù jīng", "meaning": "形容言论荒谬,不合情理"},
"经年累月": {"pinyin": "jīng nián lěi yuè", "meaning": "形容经历很长的时间"},
"月朗风清": {"pinyin": "yuè lǎng fēng qīng", "meaning": "月光明朗,微风清爽,形容宁静美好的月夜"},
"清风明月": {"pinyin": "qīng fēng míng yuè", "meaning": "只与清风、明月为伴,比喻不随便结交朋友,也比喻清闲无事"},
"月黑风高": {"pinyin": "yuè hēi fēng gāo", "meaning": "比喻没有月光风也很大的夜晚,比喻险恶的环境"},
"高风亮节": {"pinyin": "gāo fēng liàng jié", "meaning": "形容道德和行为都很高尚"},
"节衣缩食": {"pinyin": "jié yī suō shí", "meaning": "省吃省穿,形容节约"},
"食不甘味": {"pinyin": "shí bù gān wèi", "meaning": "吃东西都觉得没有味道,形容心里有事,吃东西也不香"},
"味同嚼蜡": {"pinyin": "wèi tóng jiáo là", "meaning": "像吃蜡一样,没有一点儿味,形容语言或文章枯燥无味"},
"蜡炬成灰": {"pinyin": "là jù chéng huī", "meaning": "蜡烛烧成了灰,比喻自己为不能相聚而痛苦,无尽无休,仿佛蜡泪直到蜡烛烧成了灰方始流尽一样"},
"灰心丧气": {"pinyin": "huī xīn sàng qì", "meaning": "形容因失败或不顺利而失去信心,意志消沉"},
"气象万千": {"pinyin": "qì xiàng wàn qiān", "meaning": "形容景象或事物壮丽而多变化"},
"千变万化": {"pinyin": "qiān biàn wàn huà", "meaning": "形容变化极多"},
"化为乌有": {"pinyin": "huà wéi wū yǒu", "meaning": "变得什么都没有,指全部消失或完全落空"},
"有备无患": {"pinyin": "yǒu bèi wú huàn", "meaning": "事先有准备,就可以避免祸患"},
"患得患失": {"pinyin": "huàn dé huàn shī", "meaning": "担心得不到,得到了又担心失掉,形容对个人得失看得很重"},
"失之交臂": {"pinyin": "shī zhī jiāo bì", "meaning": "形容当面错过"},
"臂有四肘": {"pinyin": "bì yǒu sì zhǒu", "meaning": "比喻不凡的相貌"},
"肘腋之患": {"pinyin": "zhǒu yè zhī huàn", "meaning": "比喻极近的地方的祸患"},
"患难与共": {"pinyin": "huàn nàn yǔ gòng", "meaning": "共同承担危险和困难,指彼此关系密切,利害一致"},
"共商国是": {"pinyin": "gòng shāng guó shì", "meaning": "共同商量国家的政策和方针"},
"是非分明": {"pinyin": "shì fēi fēn míng", "meaning": "正确与错误非常分明"},
"明目张胆": {"pinyin": "míng mù zhāng dǎn", "meaning": "原指有胆识,敢做敢为,后形容公开放肆地干坏事"},
"胆大包天": {"pinyin": "dǎn dà bāo tiān", "meaning": "形容胆子极大"},
"天长地久": {"pinyin": "tiān cháng dì jiǔ", "meaning": "跟天和地存在的时间那样长,形容时间悠久,也形容永远不变(多指爱情)"},
"久别重逢": {"pinyin": "jiǔ bié chóng féng", "meaning": "指朋友或亲人在长久分别之后再次见面"},
"逢凶化吉": {"pinyin": "féng xiōng huà jí", "meaning": "遇到凶险转化为吉祥、顺利,这是带有迷信的说法"},
"吉祥如意": {"pinyin": "jí xiáng rú yì", "meaning": "多用祝颂他人美满称心"},
"意气风发": {"pinyin": "yì qì fēng fā", "meaning": "形容精神振奋,气概豪迈"},
"发扬光大": {"pinyin": "fā yáng guāng dà", "meaning": "使事业、传统等更加发展壮大"},
"大智若愚": {"pinyin": "dà zhì ruò yú", "meaning": "某些才智出众的人,看来好像愚笨,不露锋芒"},
"愚公移山": {"pinyin": "yú gōng yí shān", "meaning": "比喻坚持不懈地改造自然和坚定不移地进行斗争"},
"山清水秀": {"pinyin": "shān qīng shuǐ xiù", "meaning": "形容风景优美"},
"秀外慧中": {"pinyin": "xiù wài huì zhōng", "meaning": "外表秀丽,内心聪明"},
"中流砥柱": {"pinyin": "zhōng liú dǐ zhù", "meaning": "比喻坚强独立的人能在动荡艰难的环境中起支柱作用"},
"柱石之坚": {"pinyin": "zhù shí zhī jiān", "meaning": "像柱石一样坚硬,比喻大臣坚强可靠,能担负国家重任"},
"坚如磐石": {"pinyin": "jiān rú pán shí", "meaning": "像大石头一样坚固,比喻不可动摇"},
"石破天惊": {"pinyin": "shí pò tiān jīng", "meaning": "原形容箜篌的声音,忽而高亢,忽而低沉,出人意外,有难以形容的奇境,后多比喻文章议论新奇惊人"},
"惊天动地": {"pinyin": "jīng tiān dòng dì", "meaning": "使天地惊动,形容某个事件的声势或意义极大"},
"地动山摇": {"pinyin": "dì dòng shān yáo", "meaning": "地震发生时大地颤动,山河摇摆,亦形容声势浩大或斗争激烈"},
"摇头晃脑": {"pinyin": "yáo tóu huàng nǎo", "meaning": "形容自己感觉很有乐趣或自己认为很不差的样子"},
"脑满肠肥": {"pinyin": "nǎo mǎn cháng féi", "meaning": "形容饱食终日的剥削者大腹便便,肥胖丑陋的形象"},
"肥头大耳": {"pinyin": "féi tóu dà ěr", "meaning": "一个肥胖的脑袋,两只大耳朵,形容体态肥胖,有时指小孩可爱"},
"耳熟能详": {"pinyin": "ěr shú néng详", "meaning": "指听得多了,能够说得很清楚、很详细"},
"详略得当": {"pinyin": "xiáng lüè dé dàng", "meaning": "指应当详细和应当简略的地方都处理得很妥当"},
"当务之急": {"pinyin": "dāng wù zhī jí", "meaning": "当前任务中最急切要办的事"},
"急功近利": {"pinyin": "jí gōng jìn lì", "meaning": "急于求成,贪图眼前的成效和利益"},
"利欲熏心": {"pinyin": "lì yù xūn xīn", "meaning": "贪财图利的欲望迷住了心窍"},
"心灰意冷": {"pinyin": "xīn huī yì lěng", "meaning": "灰心失望,意志消沉"},
"冷若冰霜": {"pinyin": "lěng ruò bīng shuāng", "meaning": "冷得象冰霜一样,比喻待人接物毫无感情,象冰霜一样冷,也比喻态度严正,不可接近"},
"霜露之病": {"pinyin": "shuāng lù zhī bìng", "meaning": "因感受风寒而引起的病"},
"病入膏肓": {"pinyin": "bìng rù gāo huāng", "meaning": "形容病情十分严重,无法医治,比喻事情到了无法挽救的地步"},
"荒诞不经": {"pinyin": "huāng dàn bù jīng", "meaning": "形容言论荒谬,不合情理"},
"经久不息": {"pinyin": "jīng jiǔ bù xī", "meaning": "经过长时间停不下来"},
"息事宁人": {"pinyin": "xī shì níng rén", "meaning": "指调解纠纷,使事情平息下来,消除事端,使人们平安相处"},
"人山人海": {"pinyin": "rén shān rén hǎi", "meaning": "形容人聚集得非常多"},
"海纳百川": {"pinyin": "hǎi nà bǎi chuān", "meaning": "比喻包容的东西非常广泛,而且数量很大"},
"川流不息": {"pinyin": "chuān liú bù xī", "meaning": "形容行人、车马等像水流一样连续不断"},
"息息相关": {"pinyin": "xī xī xiāng guān", "meaning": "形容彼此的关系非常密切"},
"关门大吉": {"pinyin": "guān mén dà jí", "meaning": "指商店倒闭或企业破产停业"},
"吉祥如意": {"pinyin": "jí xiáng rú yì", "meaning": "多用祝颂他人美满称心"},
"意气风发": {"pinyin": "yì qì fēng fā", "meaning": "形容精神振奋,气概豪迈"},
"发扬光大": {"pinyin": "fā yáng guāng dà", "meaning": "使事业、传统等更加发展壮大"}
}
# 谐音字典(简化版,仅包含部分常见谐音)
HOMOPHONES = {
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "亿", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "驿", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "礿", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "使", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "槿", "", "", "", "", "", "", "", "", "", "", "", "", "槿", "", "", "", "", "", "", "", "", "", "", "", "", "槿", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "褿", "", "", "", "", "褿"],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["尿", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "礿", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["广", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["椿", "", "", "", "", "", "", "", "", "", "椿", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
"": ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
}
# 同音字检查函数
def is_homophone(char1, char2):
"""检查两个字是否为同音字"""
if char1 == char2:
return True
# 检查是否在谐音字典中
for key, values in HOMOPHONES.items():
if char1 == key and char2 in values:
return True
if char2 == key and char1 in values:
return True
return False
# 获取下一个成语(本地库)
def get_next_idioms(last_char):
"""获取以指定字符开头的成语(支持谐音)"""
result = []
for idiom in IDIOMS:
first_char = idiom[0]
if idiom.startswith(last_char) or is_homophone(first_char, last_char):
result.append(idiom)
return result
# 验证成语函数
def validate_idiom(idiom, last_char, history):
"""验证成语是否有效完全依赖AI验证支持谐音"""
# 检查是否已经使用过
if idiom in history:
return False, "成语已经使用过"
# 检查首字是否匹配(支持谐音)
if last_char:
first_char = idiom[0]
if not (idiom.startswith(last_char) or is_homophone(first_char, last_char)):
return False, f"成语必须以'{last_char}'或其谐音开头"
# 完全依赖AI验证不再使用本地成语库
if DEEPSEEK_API_KEY and DEEPSEEK_API_KEY != "your_api_key_here":
try:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}"
}
# 专业的成语验证提示
system_prompt = "你是一个专业的成语专家,精通中国成语。请判断以下内容是否为标准的四字成语。\n"
system_prompt += "判断标准:\n"
system_prompt += "1. 必须是四字短语\n"
system_prompt += "2. 必须是约定俗成的成语,而非普通短语\n"
system_prompt += "3. 包括常见成语、典故成语、书面成语和较少见的成语\n"
system_prompt += "4. 只要符合成语特征,即使不太常见也应判断为成语\n"
system_prompt += "请严格按照要求判断,如果是成语,请只回答'';如果不是成语,请只回答''"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"{idiom}"}
]
data = {
"model": "deepseek-chat",
"messages": messages,
"max_tokens": 10,
"temperature": 0.1,
"response_format": {"type": "text"}
}
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data, timeout=8)
response.raise_for_status()
result = response.json()
ai_answer = result['choices'][0]['message']['content'].strip()
print(f"AI验证结果: {idiom} -> {ai_answer}")
# 更宽松的AI回答匹配
if ai_answer in ["", "是的", "", "正确", "是成语"]:
# AI确认是成语
return True, "AI验证通过"
elif ai_answer in ["", "不是", "不对", "错误", "不是成语"]:
return False, "成语不存在"
else:
# AI回答不明确尝试再次验证
print(f"AI回答不明确: {ai_answer}")
try:
messages = [
{"role": "system", "content": "请重新判断,只回答'''',不要添加任何其他内容"},
{"role": "user", "content": f"{idiom}是否是标准的四字成语?"}
]
data['messages'] = messages
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data, timeout=5)
response.raise_for_status()
result = response.json()
ai_answer = result['choices'][0]['message']['content'].strip()
print(f"AI二次验证结果: {idiom} -> {ai_answer}")
if ai_answer in ["", "是的", "", "正确", "是成语"]:
return True, "AI验证通过"
except Exception as e:
print(f"二次验证失败: {e}")
# 多次验证失败
return False, "成语不存在"
except Exception as e:
print(f"AI验证失败: {e}")
# AI验证失败使用兜底验证
if len(idiom) == 4 and all('\u4e00' <= c <= '\u9fff' for c in idiom):
return True, "四字短语验证通过"
else:
return False, "成语不存在"
else:
# 未配置API密钥使用兜底验证
if len(idiom) == 4 and all('\u4e00' <= c <= '\u9fff' for c in idiom):
return True, "四字短语验证通过"
else:
return False, "成语不存在"
# 获取随机成语
def get_random_idiom():
"""获取随机成语"""
return random.choice(list(IDIOMS.keys()))
# 使用DeepSeek API生成接龙成语
def get_deepseek_idiom(last_char, history):
"""使用DeepSeek API生成接龙成语支持谐音"""
if not DEEPSEEK_API_KEY or DEEPSEEK_API_KEY == "your_api_key_here":
# API密钥未配置返回None
return None
try:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}"
}
# 构建系统提示
system_prompt = "你是一个成语接龙专家,擅长根据最后一个字(或谐音)生成接龙成语。\n"
system_prompt += "请按照以下要求生成成语:\n"
system_prompt += "1. 必须是四字成语\n"
system_prompt += "2. 要与前一个成语的最后一个字谐音或同字\n"
system_prompt += "3. 不要重复已经使用过的成语\n"
system_prompt += "4. 尽量使用常见的成语\n"
system_prompt += "5. 只需要返回成语本身,不要添加任何其他内容\n"
# 构建用户提示
user_prompt = f"请生成一个以'{last_char}'(或其谐音)开头的成语,不要使用以下成语:{', '.join(history) if history else ''}"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
]
data = {
"model": "deepseek-chat",
"messages": messages,
"max_tokens": 20,
"temperature": 0.7
}
# 发送请求
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data, timeout=10)
response.raise_for_status()
# 解析响应
result = response.json()
idiom = result['choices'][0]['message']['content'].strip()
# 验证生成的成语
if validate_idiom(idiom, last_char, history)[0]:
return idiom
else:
# 生成的成语无效,尝试再次生成
print(f"AI生成的成语无效: {idiom}")
# 再次调用API尝试生成
try:
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data, timeout=8)
response.raise_for_status()
result = response.json()
idiom = result['choices'][0]['message']['content'].strip()
if validate_idiom(idiom, last_char, history)[0]:
return idiom
else:
return None
except Exception as e:
print(f"二次生成失败: {e}")
return None
except Exception as e:
print(f"DeepSeek API调用失败: {e}")
return None
# Streamlit应用
def main():
"""成语接龙主应用"""
st.title("🤖 智能成语接龙")
st.write("与AI进行成语接龙游戏支持谐音接龙")
# 初始化会话状态
if "game_started" not in st.session_state:
st.session_state.game_started = False
if "current_idiom" not in st.session_state:
st.session_state.current_idiom = ""
if "history" not in st.session_state:
st.session_state.history = []
if "game_over" not in st.session_state:
st.session_state.game_over = False
if "score" not in st.session_state:
st.session_state.score = 0
if "error" not in st.session_state:
st.session_state.error = ""
if "ai_score" not in st.session_state:
st.session_state.ai_score = 0
# 游戏设置
col1, col2 = st.columns(2)
with col1:
game_mode = st.selectbox("游戏模式", ["人机对战", "双人对战"], index=0)
with col2:
difficulty = st.selectbox("难度", ["简单", "中等", "困难"], index=0)
# 开始游戏
if not st.session_state.game_started:
if st.button("开始游戏"):
# 初始化游戏状态
st.session_state.game_started = True
st.session_state.game_over = False
st.session_state.history = []
st.session_state.score = 0
st.session_state.ai_score = 0
st.session_state.error = ""
# 生成第一个成语(仅使用本地成语库)
first_idiom = get_random_idiom()
st.session_state.current_idiom = first_idiom
st.session_state.history.append(first_idiom)
st.success(f"游戏开始!第一个成语是:**{first_idiom}**")
# 游戏进行中
if st.session_state.game_started and not st.session_state.game_over:
# 显示当前成语
st.subheader(f"当前成语:**{st.session_state.current_idiom}**")
last_char = st.session_state.current_idiom[-1]
st.write(f"请接:**{last_char}**(支持谐音)")
# 用户输入
user_input = st.text_input("请输入接龙成语:", key="user_input")
if st.button("提交"):
if user_input:
# 验证用户输入
is_valid, message = validate_idiom(user_input, last_char, st.session_state.history)
if is_valid:
# 验证通过,更新游戏状态
st.session_state.history.append(user_input)
st.session_state.score += 1
st.success(f"回答正确!**{user_input}**")
# 检查是否为双人对战
if game_mode == "人机对战":
# AI接龙
st.write("🤖 AI正在思考...")
ai_idiom = get_deepseek_idiom(user_input[-1], st.session_state.history)
if ai_idiom:
st.session_state.history.append(ai_idiom)
st.session_state.ai_score += 1
st.session_state.current_idiom = ai_idiom
st.info(f"🤖 AI回答**{ai_idiom}**")
else:
# AI无法接龙游戏结束
st.session_state.game_over = True
st.success(f"游戏结束AI无法接龙你赢了")
st.balloons()
else:
# 验证失败
st.error(f"错误:{message}")
st.session_state.error = message
else:
st.error("请输入成语")
# 显示游戏状态
st.sidebar.title("游戏状态")
st.sidebar.write(f"当前分数:{st.session_state.score}")
if game_mode == "人机对战":
st.sidebar.write(f"AI分数{st.session_state.ai_score}")
st.sidebar.write(f"已接龙:{len(st.session_state.history)} 个成语")
# 显示历史记录
if st.sidebar.checkbox("显示历史记录"):
st.sidebar.write("历史接龙:")
for i, idiom in enumerate(st.session_state.history):
if i % 2 == 0:
st.sidebar.write(f"{i+1}. 🧑 **{idiom}**")
else:
st.sidebar.write(f"{i+1}. 🤖 **{idiom}**")
# 游戏结束
if st.session_state.game_over:
st.subheader("游戏结束!")
st.write(f"你的分数:{st.session_state.score}")
if game_mode == "人机对战":
st.write(f"AI分数{st.session_state.ai_score}")
st.write(f"总共接龙:{len(st.session_state.history)} 个成语")
if st.button("重新开始"):
# 重置游戏状态
st.session_state.game_started = False
st.session_state.current_idiom = ""
st.session_state.history = []
st.session_state.game_over = False
st.session_state.score = 0
st.session_state.error = ""
st.session_state.ai_score = 0
st.experimental_rerun()
# 未开始游戏
if not st.session_state.game_started:
st.write("---")
st.info("📝 游戏规则:")
st.write("1. 输入以当前成语最后一个字(或谐音)开头的成语")
st.write("2. 成语不能重复使用")
st.write("3. 支持谐音接龙")
st.write("4. 游戏由AI生成第一个成语之后由AI和玩家交替接龙")
st.write("5. AI会验证你的回答是否正确")
if __name__ == "__main__":
main()