グループ

マルチプレイヤーゲームでは、プレイヤーをグループに分けることができます。(プレイヤーが互いに対応しない "treatment groups" の意味でのグループが必要な場合は、処理の割り当て を参照してください。)

グループサイズを設定するには、Constants の PLAYERS_PER_GROUP を設定します。たとえば、2人用のゲームの場合、 PLAYERS_PER_GROUP = 2 を設定します。

すべてのプレイヤーを同じグループに含める必要がある場合、またはシングルプレイヤーのゲームの場合は、 None に設定します。

各プレイヤーには属性 id_in_group を持っており、プレイヤー1であるか、プレイヤー2であるかなどを示します。

プレイヤーを取得

グループオブジェクトには、次のメソッドがあります。

get_players()

グループ内のプレイヤーのリストを返します。( id_in_group によって順序付けされます)

get_player_by_id(n)

id_in_group で指定されたグループ内のプレイヤーを返します。

他のプレイヤーを取得

プレイヤーオブジェクトは get_others_in_group()get_others_in_subsession() メソッドを持ち、グループおよびサブセッション内の他のプレイヤーのリストを返します。

Roles

各グループに購入者/販売者、プリンシパル/エージェントなどの複数の役割がある場合は、定数でそれらを定義できます。名前を _ROLE で終わらせます:

class C(BaseConstants):
    ...

    PRINCIPAL_ROLE = 'Principal'
    AGENT_ROLE = 'Agent

次に、oTreeはそれぞれの role を異なるプレイヤーに自動的に割り当てます。( id_in_group による順番に従う。)これを使用して、各役割にさまざまなコンテンツを表示できます。例:

class AgentPage(Page):

    @staticmethod
    def is_displayed(player):
        return player.role == C.AGENT_ROLE

テンプレートの場合:

You are the {{ player.role }}.

get_player_by_id() のように group.get_player_by_role() を使用することもできます。

def set_payoffs(group):
    principal = group.get_player_by_role(C.PRINCIPAL_ROLE)
    agent = group.get_player_by_role(C.AGENT_ROLE)
    # ...

プレイヤーの役割を切り替えたい場合は、 group.set_players()subsession.group_randomly() 等を使用して、グループを再配置する必要があります。

グループマッチング

固定マッチング

デフォルトでは、各ラウンドで、プレイヤーは C.PLAYERS_PER_GROUP 人で構成されたグループに分割されます。それらは順番にグループ化されます。たとえば、グループごとに2人のプレイヤーがいる場合、P1とP2は一緒にグループ化され、P3とP4も同様にグループ化されます。 また、 id_in_group は、各グループ内で順番に割り当てられます。

これは、デフォルトではグループは各ラウンドや、同じ PLAYERS_PER_GROUP を持っているアプリ間でも同じであることを意味します。

グループを再構成する場合は、以下の手法を使用できます。

group_randomly()

サブセッションには、プレイヤーをランダムにシャッフルする group_randomly() メソッドがあり、プレイヤーは任意のグループ、およびグループ内の任意の位置に配置できます。

グループ間でプレイヤーをシャッフルしたいが、プレイヤーの役割は固定したい場合は、 group_randomly(fixed_id_in_group=True) を使用します。

たとえば、これにより、ラウンドごとにプレイヤーがランダムにグループ化されます。

def creating_session(subsession):
    subsession.group_randomly()

これにより、プレイヤーはラウンドごとにランダムにグループ化されますが、 id_in_group は固定されたままになります。

def creating_session(subsession):
    subsession.group_randomly(fixed_id_in_group=True)

次の例では、セッションに12人の参加者がおり、 PLAYERS_PER_GROUP = 3 であると仮定します。

def creating_session(subsession):
    print(subsession.get_group_matrix()) # outputs the following:
    # [[1, 2, 3],
    #  [4, 5, 6],
    #  [7, 8, 9],
    #  [10, 11, 12]]

    subsession.group_randomly(fixed_id_in_group=True)
    print(subsession.get_group_matrix()) # outputs the following:
    # [[1, 8, 12],
    #  [10, 5, 3],
    #  [4, 2, 6],
    #  [7, 11, 9]]

    subsession.group_randomly()
    print(subsession.get_group_matrix()) # outputs the following:
    # [[8, 10, 3],
    #  [4, 11, 2],
    #  [9, 1, 6],
    #  [12, 5, 7]]

group_like_round()

グループの構成をあるラウンドから別のラウンドにコピーするには、 group_like_round(n) メソッドを使用します。このメソッドの引数は、グループ構成をコピーするラウンド数です。

以下の例では、グループはラウンド1でシャッフルされ、その後のラウンドはラウンド1のグループ構成をコピーします。

def creating_session(subsession):
    if subsession.round_number == 1:
        # <some shuffling code here>
    else:
        subsession.group_like_round(1)

get_group_matrix()

サブセッションには、グループの構造を行列として返す get_group_matrix() というメソッドがあります。次に例を示します。

[[1, 3, 5],
 [7, 9, 11],
 [2, 4, 6],
 [8, 10, 12]]

set_group_matrix()

set_group_matrix() は、グループ構造を任意の方法で変更できます。まず、 get_players() を使用して、プレイヤーのリストを取得するか、 get_group_matrix() を使用して既存のグループ行列を取得します。行列を作成し、それを set_group_matrix() に渡します。

def creating_session(subsession):
    matrix = subsession.get_group_matrix()

    for row in matrix:
        row.reverse()

    # now the 'matrix' variable looks like this,
    # but it hasn't been saved yet!
    # [[3, 2, 1],
    #  [6, 5, 4],
    #  [9, 8, 7],
    #  [12, 11, 10]]

    # save it
    subsession.set_group_matrix(matrix)

整数の行列を渡すこともできます。1からサブセッションのプレイヤー数までのすべての整数が含まれている必要があります。各整数は、プレイヤーの id_in_subsession を表します。例えば:

def creating_session(subsession):

    new_structure = [[1,3,5], [7,9,11], [2,4,6], [8,10,12]]
    subsession.set_group_matrix(new_structure)

    print(subsession.get_group_matrix()) # will output this:

    # [[1, 3, 5],
    #  [7, 9, 11],
    #  [2, 4, 6],
    #  [8, 10, 12]]

グループシャッフルが正しく機能したかどうかを確認するには、ブラウザを開いてセッションの "結果" タブを開き、各ラウンドの列 groupid_in_group を確認してください。

group.set_players()

これは set_group_matrix に似ていますが、グループ内のプレイヤーをシャッフルするだけです。たとえば、プレイヤーにさまざまな役割を与えることができます。

セッション中のシャッフル

creating_session は、通常はグループをシャッフルするのに適した場所ですが、 creating_session はセッションが作成され、プレイヤーがプレイを開始する前に実行されることを忘れないでください。そのため、シャッフルがセッションの開始後に発生する何かをもとに行いたい場合は、代わりにWaitPageでシャッフルを実行する必要があります。

wait_for_all_groups=True にした WaitPage を作成し、 after_all_players_arrive にシャッフルのためのコードを挿入する必要があります。

class ShuffleWaitPage(WaitPage):

    wait_for_all_groups = True

    @staticmethod
    def after_all_players_arrive(subsession):
        subsession.group_randomly()
        # etc...

到着時間によるグループ化

group_by_arrival_time を参照してください。