实验组(Treatments)

To assign participants to different treatment groups, you can use creating_session. For example:

class Player(BasePlayer):
    color = models.StringField()

def creating_session(subsession):
    # randomize to treatments
    for player in subsession.get_players():
        player.color = random.choice(['blue', 'red'])
        print('set player.color to', player.color)

你也可以将实验组设为小组级别(将 StringField 加入 Group 并将上面的代码改为使用 get_groups()group.color)。

creating_session is run immediately when you click the “create session” button, even if the app is not first in the app_sequence.

实验组与多轮次

If your game has multiple rounds, a player could have different colors in different rounds, because creating_session gets executed for each round independently. To prevent this, set it on the participant, rather than the player. Add color to PARTICIPANT_FIELDS, then do this:

def creating_session(subsession):
    if subsession.round_number == 1:
        for player in subsession.get_players():
            participant = player.participant
            participant.color = random.choice(['blue', 'red'])

Then elsewhere in your code, you can access the participant’s color with participant.color.

获取有关vars的更多信息,参见 Participant fields.

平衡实验组

上面的代码对每个玩家都进行随机分配,故你可能最终得到一个不平衡的“蓝色”与“红色”分组。为解决此问题,你可以使用 itertools.cycle:

def creating_session(subsession):
    import itertools
    colors = itertools.cycle(['blue', 'red'])
    for player in subsession.get_players():
        player.color = next(colors)

选择特定实验组进行游戏

在实际实验中,你一般会随机将玩家分配到实验组。但是当你测试你的游戏时,常常需要显式指定某一实验组进行游戏。假定你在基于上面的例子开发游戏,并想向你的同学展示两个实验组(红色和蓝色)。你可以创建2个除了 color 外完全相同的session config(在oTree Studio中,添加一个”custom parameter”):

SESSION_CONFIGS = [
    dict(
        name='my_game_blue',
        app_sequence=['my_game'],
        num_demo_participants=1,
        color='blue'
    ),
    dict(
        name='my_game_red',
        app_sequence=['my_game'],
        num_demo_participants=1,
        color='red'
    ),
]

然后在你的代码中,你可以通过 session.config['color'] 获当前会话的颜色。

You can even combine this with the randomization approach. You can check if 'color' in session.config:; if yes, then use that color; if no, then choose it randomly.

配置会话

你可以使你的会话可配置,这样你就可以在管理员界面调整游戏的参数。

_images/edit-config.png

举例来说,假定你有一个“num_apple”参数。通常的方法是将其定义在 Constants 中,如 Constants.num_apples.但是要使其可配置,你可以将其定义在你的session config中。例如:

dict(
    name='my_session_config',
    display_name='My Session Config',
    num_demo_participants=2,
    app_sequence=['my_app_1', 'my_app_2'],
    num_apples=10
),

当你在管理员界面创建会话的时候,就会有一个文本框可改变这一值。你也可以使用 'doc' 添加帮助信息:

dict(
    name='my_session_config',
    display_name='My Session Config',
    num_demo_participants=2,
    app_sequence=['my_app_1', 'my_app_2'],
    num_apples=10,
    doc="""
    Edit the 'num_apples' parameter to change the factor by which
    contributions to the group are multiplied.
    """
),

在你的代码中,可使用 session.config['num_apples'].

注意:

  • 对于一个可配置的参数,它的值必须是数值,布尔或字符串。
  • 在管理员界面的“Demo”部分,会话是不可配置的。它仅在 “Sessions” 或 “Rooms”中创建会话时可用。