処理の割り当て

参加者ごとに異なる処理を割り当てるには、 creating_session を使用します。例えば、次のようにします:

def creating_session(subsession):
    import random
    for player in subsession.get_players():
        player.time_pressure = random.choice([True, False])
        print('set time_pressure to', player.time_pressure)

グループレベルで異なる処理を割り当てることもできます (BooleanFieldGroup に入れて、上記のコードを get_groups()group.time_pressure を使うように変更します)。

creating_session は、アプリが app_sequence の先頭でなくても、 "create session" ボタンをクリックするとすぐに実行されます。

複数ラウンドにまたがる処理

ゲームに複数のラウンドがある場合、 creating_session が各ラウンドで独立して実行されるため、プレイヤーはラウンドごとに異なる処理を受ける可能性があります。これを防ぐには、 player ではなく、 participant に設定します:

def creating_session(subsession):
    if subsession.round_number == 1:
        for player in subsession.get_players():
            participant = player.participant
            participant.time_pressure = random.choice([True, False])

バランスの取れた処理

上記のコードでは、プレイヤーごとに独立して無作為抽出を行っているため、バランスが悪くなってしまうことがあります。これを解決するためには、 itertools.cycle を使用します:

def creating_session(subsession):
    import itertools
    pressures = itertools.cycle([True, False])
    for player in subsession.get_players():
        player.time_pressure = next(pressures)

実行する処理の選択

ライブ実験では、プレイヤーにランダムな処理を施したいことがよくあります。しかし、ゲームをテストする際には、どちらの処理を実行するかを明示的に選択することが有用な場合があります。例えば、上記の例でゲームを開発していて、同僚に両方の処理を見せたいとします。 1つのパラメータを除いて、同じ内容の2つのセッションコンフィグを作成することができます (oTree Studio では、 "custom parameter" を追加します):

SESSION_CONFIGS = [
    dict(
        name='my_game_primed',
        app_sequence=['my_game'],
        num_demo_participants=1,
        time_pressure=True,
    ),
    dict(
        name='my_game_noprime',
        app_sequence=['my_game'],
        num_demo_participants=1,
        time_pressure=False,
    ),
]

そうすれば、コードの中で、現在のセッションの処理を次のようにして取得することができます:

session.config['time_pressure']

これを無作為化の方法と組み合わせることもできます。 if 'time_pressure' in session.config: をチェックし、含まれていればそれを使用し、含まれていなければランダムに選択します。

セッションの設定

管理画面でゲームのパラメータを調整できるように、セッションを設定できます。

_images/edit-config.png

例えば、 num_apples というパラメータがあるとします。通常の方法では、 C.NUM_APPLES のように C に定義します。しかし、これをセッションごとに変更可能にするために、代わりにセッションコンフィグで定義することができます。例えば、以下のようになります:

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" でセッションを作成するときにのみ有効です。