Otree怎么读,Otree文化传媒
型号
models.py
是您定义应用程序数据模型的地方:SubsionGroupPlayer是Group的一部分,Group是Subsession的一部分。请参见概念概述。
primary models.py是定义数据库表的列。假设您希望实验生成如下数据:
下面是如何定义上面的表结构:
定义列
字段类型
以下是主要的字段类型:BooleanField(用于真/假值和是/否值)
货币字段货币金额;看钱和支付。IntegerFieldFloatField(用于实数)StringField(用于文本字符串)LongStringField(用于长文本字符串;其表单小部件为多行textarea)StringField,LongStringField为新增(2018年1月新增)。有关更多信息,请参见oTree 2.0。
初始/默认值
除非您设置None
,否则字段的初始值将为initial=:
。
最小,最大,选择
有关如何设置字段最小值、最大值或选项的信息,请参见简单表单字段验证。内置字段和方法(
内置字段和方法)
)中定义的字段和方法。比如Player表中有一个名为payroll和id_in_group的列,在_all_rounds()和get_others_in_group()中有类似的方法。下面列出了这些内置字段和方法。
子进程
session
此会话所属的会话。看什么是自我。
round_number
根据目前的回合数。仅在应用程序有多轮(set Constants.num_rounds)时相关。参见Rounds。
creating_session()
与大多数其他内置的子会话方法不同,这个方法是一个您必须自己定义的方法。创建会话时,将执行您在此处放置的任何代码:
creating_session
允许您通过设置玩家、组、参与者或子会话字段的初始值来初始化子级别。例如:有关治疗和分组洗牌的更多信息。
注意self是一个subsession对象,因为我们在Subsession类中。所以,你不能做self.player,因为子会话中有1个以上的玩家。而是用self.get_players()来获取所有这些。
如果您的应用程序有多轮,creating_session会连续运行几次:
将输出
before_session_starts
之前会话启动已重命名为创建会话()。但是,为了向后兼容,before_session_starts仍将执行新版本的oTree。
group_randomly()
请参见组匹配。
group_like_round()
请参见组匹配。
get_group_matrix()
请参见组匹配。
set_group_matrix()
请参见组匹配。
get_groups()
返回子会话中所有组的列表。
get_players()
返回子会话中所有玩家的列表。
in_previous_rounds()
请参见在轮次或应用程序之间传递数据。
in_all_rounds()
请参见在轮次或应用程序之间传递数据。
in_round(round_number)
请参见在轮次或应用程序之间传递数据。
in_rounds(self,first,last)
请参见在轮次或应用程序之间传递数据。
组
会议/子会话
该组所属的会话/子会话。看什么是“自我”?
get_players()
参见群组。
get_player_by_role(角色)
参见群组。
get_player_by_id(id_in_group)
参见群组。
set_players(players_list)
请参见组匹配。
in_previous_rounds()
请参见在轮次或应用程序之间传递数据。
in_all_rounds()
请参见在轮次或应用程序之间传递数据。
in_round(round_number)
请参见在轮次或应用程序之间传递数据。
in_rounds(self,first,last)
请参见在轮次或应用程序之间传递数据。
玩家
id_in_group
从1开始自动分配整数。在多人游戏中,指明这是玩家1,玩家2,等等。
支付
玩家在这一轮的奖励。看到好处。
会话/子会话/组/参与者
该玩家所属的会话/子会议/组/参与者。看什么是“自我”?
get_others_in_group()
参见群组。
get_others_in_subsession()
参见群组。
角色()
与大多数其他内置播放器方法不同,这是您自己的方法。
这个函数应该返回带有玩家角色的标签,通常取决于id_in_group。
例如:
然后就可以通过_player_by_role(卖家)来获取玩家。2.参见群组。
此外,玩家的角色将显示在oTree管理界面的“结果”选项卡中。
in_previous_rounds()
请参见在轮次或应用程序之间传递数据。
in_all_rounds()
请参见在轮次或应用程序之间传递数据。
in_round(round_number)
请参见在轮次或应用程序之间传递数据。
in_rounds(self,first,last)
请参见在轮次或应用程序之间传递数据。
会话
NUM_PARTICIPANTS
会议的参与者人数。
配置
请参阅配置会话和选择要播放的进程。
vars
请参见session.vars.
参加者
vars
参见participant.vars.
标签
请参见参与者选项卡。
id_in_session
会话中的参与者ID。与该玩家相同的id_in_subsession。
支付
看到好处。
payoff_plus_participation_fee()
看到好处。
常数
常量建议使用这个类来放置应用程序的参数和常量,这些参数和常量不会因播放器而异。以下是必需的常量:
Name_in_url:用于在参与者的url中标识您的应用程序的名称。
例如,如果您将其设置为public_goods,则参与者的URL可能如下所示:
http://otree-demo . heroku app . com/p/zuzepona/public _ goods/Introduction/1/
每组玩家(在组中描述)
Num_Rounds(以轮数描述)
杂项主题(杂项)
定义自己的方法
您可以在模型上定义自己的方法。这可以帮助您在代码变得更加复杂时保持代码有序。例如,您可以定义一个函数来设置玩家的收入:请记住从某个地方调用这个函数,比如您的页面:
因为不会自动执行,不像creating_session()、after_all_players_arrive()等内置函数。
oTree如何执行代码
任何不在方法中的代码基本上都是全局的,只会执行一次——当服务器启动时。有些人错误地认为代码会在每个新的会话中重新执行。例如,想要生成硬币投掷的随机概率的人可以在models.py中这样做:
从打印输出可以看出,P只计算一次:服务器启动时:
这意味着所有会议的所有参与者都是相同的。
出于同样的原因,这也行不通:
解决方案是在方法内生成随机变量,比如creating_session()。
“玩家”和“玩家”之间有什么区别?
在你的代码中,你应该总是使用小写的player,group和subsession。唯一的例外是类是在models.py中定义的,你使用classPlayer(BasePlayer)等等。Player在引用整个玩家表时使用大写(例如),在引用特定玩家即表中的一行时使用小写()。在Python中,player是一个类,Player是该类的一个实例。
例如,在模板中,为了显示玩家的收益,我们必须使用{ { player . payroll } }而不是{ { player . payroll } }。
但是,因为常数的原因,我们总是使用大写。那是因为常数不是一个有实例/行的数据库表,因为所有玩家的常数都是一样的。
IntegerField和Integer有什么区别?
IntegerField
是数据库表中的一列。Integer
是此表中的一个值。
如何制作多个字段
假设您的应用程序有许多几乎相同的字段,例如:很复杂;你应该寻找一种简化的方法。
这些字段都显示在不同的页面上吗?如果有,请考虑转换成只有一个场的10回合游戏。请参考真功夫示例游戏,学习如何进行多轮一页循环,改变每轮显示的问题。
如果那是不可能的,那么你可以通过定义一个返回字段的函数来减少重复代码的数量(make_field这只是一个例子名称;什么都可以叫)。