有这样一个需求:使用python实现一个游戏,一共有10个问题,依次回答每个问题,每个用户可以输入问题的答案,但是互相不能看到,有一个管理员可以看到所有人的答案,并且当所有人都填写完成后可以公布所有人的答案,并且打分。在回答的下面有一个得分表,每打完一轮问题的得分则实时计算总得分和排名。限制一个IP只能登录一个用户。
下面给出一个基于 Flask 的简化示例,演示如何用 Python 实现这样一个游戏的核心功能,主要包括:
- 10 个问题的答题流程。
- 用户只能看到自己的答案,管理员可以看到所有人的答案。
- 当所有人都填写完成后,管理员可以公布所有人的答案并进行打分。
- 显示得分表,每轮更新后实时计算总得分和排名。
- 限制同一个 IP 地址只能登录一个用户。
为演示方便,以下示例仅做最小可行的流程说明,使用字典存储用户和答案信息;在实际生产环境中,可以结合数据库、认证机制、前端模板等进行更完善的开发。
主要功能说明
-
注册/登录:
- 用户首次进入时,需要填写用户名进行注册并登录。
- 同一个 IP 地址只允许注册一个用户,后续从同一 IP 再访问则直接视为该用户登录或禁止二次注册。
-
答题:
- 一共 10 个问题,这里演示时以简单的问卷形式呈现。
- 每个用户在提交完所有答案后,才能等待管理员公布结果。
-
管理员查看与公布答案:
- 管理员可以查看所有用户答案。
- 管理员可进行打分,并将所有用户答案与分数公示。
- 每完成一轮题目即可查看实时总得分并进行排名。
-
得分统计与排名:
- 每一轮提交答案后,管理员打分并把分数汇总到用户总分中。
- 根据所有用户的总分动态计算排名并显示。
代码示例
下面的示例使用 Flask 进行演示,提供了若干路由(URL)以完成相应功能。请先安装 Flask:
pip install flask
然后创建一个脚本文件(如 quiz_game.py
),内容如下:
from flask import Flask, request, session, redirect, url_for, render_template_string
import functools
app = Flask(__name__)
app.secret_key = "your_secret_key" # 用于 session 加密
# 记录哪些 IP 已经注册过用户
ip_to_user = {
}
# 存储用户信息,包括用户名、答案、分数等
# 结构示例:
# users_data = {
# 'alice': {
# 'answers': ["ans1", "ans2", ...], # 当前轮次的答案
# 'scores': [5, ...], # 历史每一轮的得分
# 'total_score': 5
# },
# 'bob': {...},
# ...
# }
users_data = {
}
# 定义题目,这里示例 10 个问题
QUESTIONS = [
"问题1:你最喜欢的颜色是什么?",
"问题2:你最喜欢的动物是什么?",
"问题3:你的故乡在哪里?",
"问题4:你最喜欢吃什么?",
"问题5:你最喜欢哪个季节?",
"问题6:你最喜欢做的运动是什么?",
"问题7:你最喜欢的电影类型是什么?",
"问题8:假期里你最想去哪里旅行?",
"问题9:你希望学习哪项新技能?",
"问题10:你最喜欢的音乐类型是什么?",
]
# 标记当前答题是否开放,如果轮次结束后可以由管理员统一切换
answer_open = True
# 标记这一轮是否已经公布答案
answers_revealed = False
# ========== 帮助函数 ==========
def login_required(func):
"""需要用户已登录,否则跳转到登录页面。"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
if 'username' not in session:
return redirect(url_for('login'))
return func(*args, **kwargs)
return wrapper
def admin_required(func):
"""需要管理员权限,否则跳转到登录。此示例简单地将用户名为 'admin' 视为管理员。"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
if session.get('username') != 'admin':
return "只有管理员能访问此页面。", 403
return func(*args, **kwargs)
return wrapper