【问题标题】:Python: Simple Counter in OtreePython:Otree 中的简单计数器
【发布时间】:2018-03-12 18:56:55
【问题描述】:

我正在尝试通过修改问答游戏模板使其成为两个玩家,在 Otree(Python 库)中实现一个简单的计分器。

最终,我希望这个计数器仅在特定条件下更新,但现在,我只是尝试在每轮之后添加 10。

在 models.py 中,我定义了一个播放器类,如下所示:

class Player(BasePlayer):

    question_id = models.IntegerField()
    confidence = models.FloatField(widget=widgets.Slider(attrs={'step': '0.01'}))

    question = models.StringField()
    solution = models.StringField()
    submitted_answer = models.StringField(widget=widgets.RadioSelect)
    is_correct = models.BooleanField()
    total_score = models.IntegerField(initial = 0)

    def other_player(self):
        return self.get_others_in_group()[0]

    def current_question(self):
        return self.session.vars['questions'][self.round_number - 1]

    def check_correct(self):
        self.is_correct = self.submitted_answer == self.solution

    def check_if_awarded_points(self):
        self.get_others_in_group()[0].submitted_answer == self.submitted_answer == self.solution

    def score_points(self):
        self.total_score+=10
        self.payoff += c(10)

上面唯一相关的功能是我在 pages.py 模板中调用的“得分点”,如下所示:

class ResultsWaitPage(WaitPage):
    def after_all_players_arrive(self):
        for p in self.group.get_players():
            p.score_points()

然后,我创建一个结果页面,在每个问题之后向我显示测验的结果,以测试“total_score”或“pay-offs”每个问题增加 10。

class IntermediateResults(Page):

    def vars_for_template(self):
        return {
            'total_score': [p.total_score for p in self.group.get_players()],
            'total_payoff': [p.payoff for p in self.group.get_players()]

        }

如果我使用 Django 公开 total_payoff 和 total_score 的值,我看到它们的值是 10,并且它永远不会改变。我不知道为什么会这样。有什么想法吗?

【问题讨论】:

  • 你知道你有一个total_score和self.total_score吧?

标签: python otree


【解决方案1】:

如果你修改作为oTree包(here)的一部分的标准quiz游戏,那么你可以看到它是多轮游戏,每组问题都在一个单独的轮中。

在 oTree 中,每一轮都有自己的一组玩家(属于一个 participant)。这意味着您的代码可以正常工作,但是您只获得了有关当前回合的信息(实际上他们的总分是 10。您需要的是从前几轮中获取分数和收益,而不是只有当前的。

类似的东西应该可以工作:

class IntermediateResults(Page):

  def vars_for_template(self):
    allplayers = self.group.get_players()
    total_score = sum([sum([p.total_score for p in pp.in_all_rounds()]) for pp in allplayers])
    total_payoff = sum([sum([p.payoff for p in pp.in_all_rounds()]) for pp in allplayers])
    return {
        'total_score': total_score,
        'total_payoff': total_payoff,

    } 

虽然我应该注意,您在total_score 中得到的是迄今为止两位玩家所有分数的总和 - 我不确定在什么情况下有人需要此信息,但我不知道了解您的具体设计。

【讨论】:

  • 谢谢!我整天都在尝试调试这个。你让我头疼不已。
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多