Semantic_Hunter / app.py
jiang buqing
1. 删除放弃按钮
2e254f6
print("Starting...")
from flask import Flask, render_template, request, jsonify
import random
from sentence_transformers import SentenceTransformer, util
import torch
import os
import sys
import pkg_resources
import platform
# 打印版本信息函数
def print_version_info():
print("=" * 50)
print(f"Python 版本: {platform.python_version()}")
print(f"Python 实现: {platform.python_implementation()}")
print(f"系统信息: {platform.system()} {platform.release()}")
print("-" * 50)
print("已安装的依赖包版本:")
# 检查主要依赖库的版本
packages = [
'flask',
'sentence-transformers',
'torch',
'numpy',
'transformers' # sentence-transformers 依赖的库
]
for package in packages:
try:
version = pkg_resources.get_distribution(package).version
print(f" - {package}: {version}")
except pkg_resources.DistributionNotFound:
print(f" - {package}: 未安装")
print("=" * 50)
# 启动时打印版本信息
print_version_info()
app = Flask(__name__)
HF_CACHE = "./hf_cache"
os.makedirs(HF_CACHE, exist_ok=True)
# Load model
model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2', cache_folder=HF_CACHE)
# Load word pool
with open("words.txt", "r", encoding="utf-8") as f:
word_pool = [line.strip() for line in f if line.strip()]
# 初始化游戏状态函数
def initialize_game_state():
secret_word = random.choice(word_pool)
secret_vec = model.encode(secret_word, convert_to_tensor=True)
print(f"新游戏已开始,秘密词语: {secret_word}")
return {
"secret_word": secret_word,
"secret_vec": secret_vec,
"guesses": []
}
# 服务启动时初始化游戏状态
game_state = initialize_game_state()
@app.route('/')
def home():
return render_template('index.html')
@app.route('/game-status', methods=['GET'])
def game_status():
"""获取当前游戏状态,包括猜测历史,但不包含秘密词语"""
# 对猜测列表按相似度降序排序
sorted_guesses = sorted(game_state["guesses"], key=lambda x: x["similarity"], reverse=True)
# 检查是否有人已经猜对了
has_correct_guess = any(guess["is_correct"] for guess in game_state["guesses"])
return jsonify({
"status": "success",
"guesses": sorted_guesses,
"has_correct_guess": has_correct_guess,
"is_game_active": True
})
@app.route('/new-game', methods=['POST'])
def new_game():
global game_state
# 检查是否有人已经猜对了
has_correct_guess = any(guess["is_correct"] for guess in game_state["guesses"])
# 只有在已经猜中的情况下才重置游戏
if has_correct_guess:
# 重置游戏状态
game_state = initialize_game_state()
return jsonify({"status": "success", "message": "新游戏已开始"})
else:
# 不重置游戏状态
return jsonify({"status": "success", "message": "游戏仍在进行中"})
@app.route('/guess', methods=['POST'])
def guess():
data = request.json
guess_word = data.get('guess', '').strip()
if not guess_word:
return jsonify({"status": "error", "message": "请输入猜测词语"})
# Encode the guess
guess_vec = model.encode(guess_word, convert_to_tensor=True)
# Calculate similarity
similarity = util.pytorch_cos_sim(game_state["secret_vec"], guess_vec)
percent = round(float(similarity[0][0]) * 100, 2)
# Check if correct
is_correct = (game_state["secret_word"] == guess_word)
# 检查猜测的词是否已存在于历史记录中
word_exists = any(g["word"] == guess_word for g in game_state["guesses"])
# 仅当词语不在历史记录中时,才添加到猜测历史
if not word_exists:
# Store guess
game_state["guesses"].append({
"word": guess_word,
"similarity": percent,
"is_correct": is_correct
})
# Sort guesses by similarity (descending)
sorted_guesses = sorted(game_state["guesses"], key=lambda x: x["similarity"], reverse=True)
response = {
"status": "success",
"similarity": percent,
"is_correct": is_correct,
"guesses": sorted_guesses
}
if is_correct:
response["message"] = "猜对啦!"
return jsonify(response)
if __name__ == '__main__':
port = int(os.environ.get("PORT", 7860))
print(f"启动服务器在端口: {port}")
app.run(host='0.0.0.0', port=port)