背景介绍
第一次接触海龟汤时,我还以为这是某种美食烹饪挑战,直到朋友抛出第一个谜题 ——'一个人走进酒吧,要了一杯水,酒保却掏出一把枪对准他,可这个人不仅没害怕,反而说了声谢谢离开了',才惊觉这是场烧脑的逻辑游戏。海龟汤,学名情境猜谜,玩家只能通过提问获取'是''否'或'无关'的回答,一步步拼凑出汤底背后的完整故事。这种用有限线索破解无限想象的过程,就像在黑暗中摸索开关,每次提问都是试探,当真相突然亮起时,那种恍然大悟的快感让人上瘾。
作为计算机专业的学生,在完成课程设计时,我常思考如何将文本逻辑交互应用于实际项目。既然海龟汤的本质是文本逻辑交互,为什么不做一款属于自己的海龟汤游戏?最初的念头源于对解谜的热爱。深夜和朋友玩海龟汤时,看着大家为了一个谜题争论到面红耳赤,最后被反转的汤底惊得笑出眼泪,我意识到这种互动游戏的魅力。市面上虽然有不少海龟汤游戏,但要么谜题老套,要么交互不够灵活。我想利用大模型 API 的高反应速度和灵活度,打造一款能实时生成新谜题、根据玩家提问动态调整线索的游戏,让每场推理都充满新鲜感。
技术选型
在开发课程设计和参与项目实践时,API 的选择直接影响着开发效率和最终成果。经过对比,选择支持多种编程语言和调用方式的通用大模型 API,无论是 Python、Java 还是其他语言,都能轻松适配。接口设计人性化,配合详细的文档和示例代码,能快速上手,大大节省了学习成本和开发时间。
对于项目开发来说,充足的调用额度是常态需求。API 提供的调用额度十分慷慨,完全能满足日常学习和项目实践的需求,不用担心因为调用次数不够而中断开发。同时,合理的定价策略也降低了试错成本,让开发者能将更多精力集中在功能实现上。
实现步骤
首先进行 API 的获取以及确认需要调用的模型编号。在模型广场中选择一个模型,复制其名称下方的 AI 模型编号。
然后创建 API Key 并进行复制。
参考 API 调用的官方文档,这里选择 Python 代码进行 AI 的调用,需要将你的 API Key 和要调用的模型名称粘贴进去。
from openai import OpenAI
# 构造 client
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="YOUR_API_BASE_URL",
)
# 流式
stream = True
# 请求
chat_completion = client.chat.completions.create(
model="YOUR_MODEL_ID",
messages=[
{
"role": "user",
"content": "你是谁",
}
],
stream=stream,
)
if stream:
for chunk in chat_completion:
# 打印思维链内容
if hasattr(chunk.choices[0].delta, 'reasoning_content'):
print(f"{chunk.choices[0].delta.reasoning_content}")
# 打印模型最终返回的 content
if hasattr(chunk.choices[0].delta, 'content'):
if chunk.choices[0].delta.content != None and len(chunk.choices[0].delta.content) != 0:
print(chunk.choices[0].delta.content)
else:
result = chat_completion.choices[0].message.content
打开 IDE 对 AI 说出你的提示词,让 AI 帮你开发一个具体的应用。
经过几轮调试生成好代码。代码生成好了之后,直接在终端输入命令 python main.py。运行之前一定记得将依赖都安装好。
下面是部分核心代码,供参考:
import gradio as gr
import json
import requests
API_KEY = "YOUR_API_KEY"
API_URL = "YOUR_API_BASE_URL/chat/completions"
def get_initial_riddle():
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
data = {
"model": "YOUR_MODEL_ID",
"messages": [
{
"role": "user",
"content": "请你扮演一个出题人,给我出一道海龟汤题目。请按照以下格式输出:1. 题目描述 2. 正确答案。请确保题目有趣且富有创意。"
}
],
"stream": False
}
response = requests.post(API_URL, headers=headers, json=data)
response_data = response.json()
return response_data['choices'][0]['message']['content']
def check_answer(user_answer, history):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
messages = [
{"role": "assistant", "content": history[0][1]}, # 原题目和答案
{"role": "user", "content": f"玩家的回答是:{user_answer}。请你判断这个回答是否接近正确答案,如果正确就表扬他,如果错误就给出一些提示,但不要直接告诉答案。"}
]
data = {
"model": "YOUR_MODEL_ID",
"messages": messages,
"stream": False
}
response = requests.post(API_URL, headers=headers, json=data)
response_data = response.json()
ai_response = response_data['choices'][0]['message']['content']
history.append((user_answer, ai_response))
return "", history
def create_new_riddle(history):
new_riddle = get_initial_riddle()
history = [(None, new_riddle)]
return history
with gr.Blocks(theme=gr.themes.Soft()) as demo:
chatbot = gr.Chatbot(
[],
elem_id="chatbot",
bubble_full_width=False,
avatar_images=(None, "🤖"),
)
with gr.Row():
txt = gr.Textbox(
scale=4,
show_label=False,
placeholder="请输入你的答案...",
container=False,
)
submit_btn = gr.Button("提交", scale=1)
new_riddle_btn = gr.Button("出新题")
txt.submit(check_answer, [txt, chatbot], [txt, chatbot])
submit_btn.click(check_answer, [txt, chatbot], [txt, chatbot])
new_riddle_btn.click(create_new_riddle, [chatbot], [chatbot])
demo.load(create_new_riddle, [chatbot], [chatbot])
if __name__ == "__main__":
demo.launch()
结语
开发过程中,大模型的高效响应为谜题秒级生成提供支持,灵活的接口适配让玩法设计不受束缚,充足的调用量与合理的价格,则为游戏的持续优化与迭代保驾护航。结合创新思维与技术工具,让这款融合了逻辑推理与硬核实力的游戏得以成型。


