oTree学习教程(七)Apps & rounds

应用

在oTree(和Django)中,app是一个包含Python和HTML代码的文件夹。当您创建oTree项目时,它会预先加载各种应用程序,例如 public_goodsdictator。会话基本上是一个接一个显示的应用程序序列。

创建应用

输入:

这将基于oTree模板创建一个新的app文件夹,其中大部分结构已经为您设置。

关键文件是models.py,pages.py和templates /文件夹下的HTML文件。

您可以将其视为可以根据需要添加的骨架。 您可以添加自己的类,函数,方法和属性,也可以导入任何第三方模块。

然后转到settings.py并在SESSION_CONFIGS中为您的应用创建一个与其他条目类似的条目。

组合应用

在您的SESSION_CONFIGS中,您可以通过设置组合应用程序'app_sequence'

在应用程序之间传递数据

请参阅participant.varssession.vars

 

回合

您可以通过在models.py中设置Constants.num_rounds来使游戏运行多轮。 例如,如果您的Session配置的app_sequence是['app1','app2'],其中app1的num_rounds = 3且app2的num_rounds = 1,那么您的会话将包含4个子会话。

回合数

您可以使用self.round_number (此属性出现在subsession,group,player和page对象上)来获取当前的轮数。回合数字从1开始。

在轮次或应用程序之间传递数据

 

每轮都有单独的Subsession,Group和Player对象。 例如,假设您在第1轮中设置self.player.my_field = True。在第2轮中,如果您尝试访问self.player.my_field,您会发现其值为None(假设这是该字段的默认值)。 这是因为第1轮中的Player对象与第2轮中的Player对象是分开的。

要访问上一轮或应用程序中的数据,您可以使用下面描述的技术之一。

in_rounds,in_previous_rounds,in_round等

Player,group和subsession对象具有以下方法,它们的工作方式类似:

  • in_previous_rounds()
  • in_all_rounds()
  • in_rounds()
  • in_round()

player.in_previous_rounds()和player.in_all_rounds()每个都返回一个代表相同应用前几轮中同一参与者的玩家列表。 区别在于in_all_rounds()包括当前回合的玩家。

例如,如果您想计算参与者对所有前几轮游戏的收益,加上当前游戏的收益:

player.in_rounds(m,n)返回表示从轮次m到n的同一参与者的玩家列表。

player.in_round(m)只返回第m轮的玩家。 例如,要获得上一轮玩家的回报,你可以使用self.player.in_round(self.round_number - 1).payoff。

类似地,subsession对象具有以相同方式工作的方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m)。

组对象也有方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m),但请注意,如果在轮之间重新组合组,则这些方法可能不会返回任何有意义的内容。

participant.vars

如果要在不同应用程序之间传递数据,则应将此数据存储在参与者中,该数据在应用程序中保留(请参阅参与者)。 (in_all_rounds()仅在您需要访问同一应用程序的上一轮数据时才有用。)

participant.vars是一个可以存储任何数据的字典。 例如,您可以设置如下属性:

稍后在会话中(例如在单独的应用程序中),您可以像这样检索它:

在这里所述,可以从页面或玩家访问当前参与者:

只要您检索Player实例(例如,使用get_players()或get_player_by_role()等),您也可以从Group或Subsession访问它。

如果您的key可能存在,也可能不存在,您可以使用.get()方法。 例如,self.participant.vars.get('my_var',DEFAULT_VALUE)。 更多这里。

或者您可以在self.participant.vars中测试'my_var'是否与'my_var'一起存在。

注意:participant.vars不包含在Excel / CSV数据导出中,也不包含在会话管理员的“数据”选项卡中。 如果需要,可以在player上创建一个StringField(例如,名为participant_vars_dump),然后在会话结束时指定:

(同样的概念适用于下面的session.vars。)

session.vars 

对于会话中所有参与者相同的全局变量,可以使用self.session.vars。 这是一个像participant.vars一样的字典。 不同之处在于,如果在self.session.vars中设置变量,它将应用于会话中的所有参与者,而不仅仅是一个。

如此处所述,可以从Page对象或任何模型(Player,Group,Subsession等)访问会话对象。

可变轮数

如果你想要一个可变数量的轮数,考虑设置num_rounds 为某个高数字,然后在你的应用程序中,有条件地隐藏 元素,这样用户就无法进入下一页。{% next_button %}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值