跳到主要内容

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→SCS_QuizAnswer作答
C→SCS_QuizEnter进入答题
S→CSC_QuizQuestion题目/选项/倒计时
S→CSC_QuizResult正确答案/解析
S→CSC_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. 验收标准​

  • 场次、题目、倒计时、计分、连击正确。
  • 排名与奖励发放正确。
  • 答案不提前泄露,超时/重复作答被拒绝。
  • 题库热更与节日题库可扩展。
  • 掉线/重启处理正确。