基于Otree(Python库)实现双人简易计分器的技术咨询
在Otree中实现双人每轮+10分的计分器
我来帮你一步步实现这个Otree里的双人计分器功能,先完成每轮结束后加10分的基础功能,后续你可以再扩展特定条件的判断逻辑:
1. 完善models.py中的Player类
首先我们需要给Player模型添加存储分数的字段,再实现专门的加分方法,方便后续调用:
from otree.api import BasePlayer, models, BaseSubsession class Player(BasePlayer): # 初始化分数为0,用于存储玩家累计得分 score = models.IntegerField(initial=0) def add_round_points(self): # 每轮结束后增加10分 self.score += 10 # 保存更新后的分数到数据库 self.save() class Subsession(BaseSubsession): def creating_session(self): # 游戏初始化时,将玩家按2人一组分配(适配双人游戏) if self.round_number == 1: self.group_randomly()
这里的Subsession配置是为了确保两名玩家能分到同一组,方便后续获取对方的分数。
2. 在pages.py中调用加分函数并配置结果页
接下来我们要在答题页的跳转钩子中调用加分方法,同时配置结果页来展示两人的分数:
from otree.api import Page, WaitPage from .models import Player class QuizPage(Page): # 这是你的答题页面,假设这里有玩家需要完成的题目表单 form_model = 'player' # 示例:如果有答题字段,在这里定义,比如: # question_answer = models.StringField(label="请回答问题:") def before_next_page(self): # 玩家完成答题并点击下一页时,执行加分操作 self.player.add_round_points() class ResultsPage(Page): # 展示本轮结束后的分数结果 def vars_for_template(self): # 把当前玩家和组内另一位玩家的分数传递给模板 return { 'my_score': self.player.score, 'opponent_score': self.player.get_others_in_group()[0].score } # 页面顺序:先答题,再看结果 page_sequence = [QuizPage, ResultsPage]
before_next_page是Otree的内置钩子函数,会在页面跳转前执行,非常适合用来处理每轮结束后的分数更新逻辑。
3. 编写结果页的HTML模板
最后创建对应的结果页模板(路径一般是templates/你的app名称/ResultsPage.html),用来直观展示分数:
{% extends "global/Page.html" %} {% load otree %} {% block title %} 本轮得分结果 {% endblock %} {% block content %} <div class="score-display"> <p>你的当前总分:<strong>{{ my_score }}</strong></p> <p>对手的当前总分:<strong>{{ opponent_score }}</strong></p> </div> {% next_button %} {% endblock %}
这样玩家完成每轮答题后,就能看到自己和对手的累计分数了。
额外提示
- 如果后续需要改成“特定条件下才加分”,只需要修改
add_round_points方法,比如加入判断逻辑:def add_round_points(self): # 示例:只有当玩家答对题目时才加分 if self.question_answer == "正确答案": self.score += 10 self.save() - 测试时可以用Otree的
runserver预览模式,创建两名玩家来验证分数是否正确累加。
内容的提问来源于stack exchange,提问作者Parseltongue
相关产品推荐
相关产品推荐

