PRD-039 每日答题
文档编号:PRD-039
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/activity/quiz.lua
1. 背景与目标
每日答题提供轻量知识玩法与活跃奖励。题库、场次、计分规则经常更新,适合用 Lua 管理题目与结算。
目标
- 题库可配置,支持单选/多选/判断题。
- 每日固定场次,实时排名与奖励。
- 支持 GM 临时加题、节日题库、热更。
2. 核心规则
- 每日 3 场:12:00、18:00、21:00,每场 10 题。
- 每题 15 秒作答,答对 +10 分,答错/超时 0 分。
- 连续答对有连击加成,最高 +5 分/题。
- 同分按总答题时间短者优先。
- 每场前 10 名获得排名奖励,参与奖答对 ≥5 题。
- 每题结束后显示正确答案与解析。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/activity/quiz.lua
Quiz = {
rounds = { {hour=12}, {hour=18}, {hour=21} },
question_count = 10,
answer_seconds = 15,
score_base = 10,
combo_bonus = 1,
}
function OnQuizStart(ctx, round)
local questions = ctx:PickQuestions(Quiz.question_count, ctx:GetDayKey())
ctx:SetState("questions", questions)
ctx:Broadcast("world", "每日答题开始,输入 //answer 参与")
ctx:SetTimer("next", 5, OnNextQuestion)
end
function OnAnswer(ctx, role, answer)
local q = ctx:GetCurrentQuestion()
if not q or ctx:IsAnswered(role, q.id) then return ctx:Fail(role, "已作答") end
local correct = ctx:CheckAnswer(q, answer)
ctx:AddScore(role, correct and Quiz.score_base + ctx:GetCombo(role) * Quiz.combo_bonus or 0)
ctx:MarkAnswered(role, q.id)
end
function OnQuizEnd(ctx)
ctx:GrantRankReward(ctx:GetRank(), 10)
ctx:GrantParticipantReward(5)
ctx:Cleanup()
end
- 题目顺序按
day_key固定,防止同场不同题。 - 答案只在题目结束后广播,避免抓包。
- 排名与奖励走
RecordServer,断线保留分数。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_QuizAnswer | 作答 |
| C→S | CS_QuizEnter | 进入答题 |
| S→C | SC_QuizQuestion | 题目/选项/倒计时 |
| S→C | SC_QuizResult | 正确答案/解析 |
| S→C | SC_QuizRank | 实时排名 |
3.3 防作弊
- 答案不下发到客户端,只下发题目。
- 作答按服务端时间窗口校验,超时拒绝。
- 同一角色每题只能答一次。
- 客户端 UI 只显示倒计时,不参与判定。
4. 客户端设计
- 答题面板:题号、题干、选项、倒计时、连击。
- 选择后锁定,等待公布答案。
- 答案解析与得分飘字。
- 实时排名侧栏,自己高亮。
- 场次预告与参与提醒。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
rounds | 场次 |
question_count | 每题数量 |
answer_seconds | 作答时间 |
score_base / combo_bonus | 计分 |
question_bank | 题库 |
Lua 接口:PickQuestions、GetCurrentQuestion、CheckAnswer、AddScore、GetRank、GrantRankReward。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 答题中掉线 | 分数保留,重连可看排名 |
| 重复作答 | 拒绝 |
| 题目不足 | 从题库循环/跳过,记录告警 |
| 服务器重启 | 本场取消,参与奖补发 |
| 脚本异常 | 结束本场,保留已得分 |
7. 验收标准
- 场次、题目、倒计时、计分、连击正确。
- 排名与奖励发放正确。
- 答案不提前泄露,超时/重复作答被拒绝。
- 题库热更与节日题库可扩展。
- 掉线/重启处理正确。