【oTree】他プレイヤーの選択と利得を表示する公共財ゲーム get_others_in_group()

統計・資料

メソッドget_others_in_group() (https://otree.readthedocs.io/en/latest/multiplayer/groups.html)は、自分以外のグループメンバーを取得します。
それを使って、結果のフィードバック画面に他プレイヤーの選択と利得が表示される公共財ゲームを作りました。

これを作ります

Models.py

今回のゲームでは、協力 (貢献する) と非協力 (貢献しない) の二択、4人で行う設定にしました。
こちらのページ (https://github.com/akrgt/otree_2019KG/tree/master/2_SD) を参考にさせていただきました。

from otree.api import (
    models,
    widgets,
    BaseConstants,
    BaseSubsession,
    BaseGroup,
    BasePlayer,
    Currency as c,
    currency_range,
)


author = 'Mizuno'

doc = """
公共財ゲーム
"""


class Constants(BaseConstants):
    name_in_url = 'pgg'
    players_per_group = 4
    num_rounds = 20
    endowment = c(20)
    multiplier = 1.6


class Subsession(BaseSubsession):
    pass


class Group(BaseGroup):
    total_contribution = models.CurrencyField()
    individual_share = models.CurrencyField()

    def compute(self):
        contributions = [p.contribution for p in self.get_players()]
        self.total_contribution = sum(contributions)
        self.individual_share = self.total_contribution * Constants.multiplier / Constants.players_per_group
        for p in self.get_players():
            p.payoff = Constants.endowment - p.contribution + self.individual_share

class Player(BasePlayer):
    contribution = models.CurrencyField(
        choices=[
            [c(Constants.endowment), '貢献する'],
            [c(0), '貢献しない']
        ],

        label="下のいずれかを選択し、クリックしてください。",
        widget=widgets.RadioSelect
    )

Pages.py

class Page2(Page) のところで、他のプレイヤーをそれぞれp1、p2、p3としています。例えばプレイヤー自身のIDが2のときはp1=ID1のプレイヤー、p2=ID3のプレイヤー、p2=ID4のメンバーとなります。

from otree.api import Currency as c, currency_range
from ._builtin import Page, WaitPage
from .models import Constants


class Page1(Page):
    form_model = 'player'
    form_fields = ['contribution']


class Wait(WaitPage):

    def after_all_players_arrive(self):
        self.group.compute()



class Page2(Page):
    def vars_for_template(self):
         p1,p2,p3 = self.player.get_others_in_group()
         return dict(
            p1 = p1,
            p2 = p2,
            p3 = p3
        )


page_sequence = [
    Page1,
    Wait,
    Page2
]

Page1.html

{% extends "global/Page.html" %}
{% load otree static %}
{% block title %}

{% endblock %}
{% block content %}
<center>
<p>
    このラウンドで、{{ Constants.endowment }}をお渡しします。 <br>
    この{{ Constants.endowment }}を使って、グループに貢献しますか?<br>
    <br>
</p>
{% formfield player.contribution %}
    {% next_button %}
</center>
{% endblock %}

Page2.html

{% extends "global/Page.html" %}
{% load otree static %}
{% block title %}
    <center>結果</center>
{% endblock %}

{% block content %}
<center>
<p>
    あなたがこのラウンドで獲得したトークンは<br><br>
    <strong> {{ player.payoff }}</strong><br><br><br><br>
    <table border='1'>
        <tr><th>プレイヤー</th><th>選択</th><th>手元</th><th>分配額</th><th>合計</th>
        </tr>
        <tr>
        <td>あなた</td>
        <td>{% if player.contribution == Constants.endowment %}
            貢献する
            {% else %}
            貢献しない
            {% endif %}
        <td>{% if player.contribution == Constants.endowment %}
            0トークン
            {% else %}
            20トークン
            {% endif %}
        <td>{{group.individual_share}}
        </td>
        <td>{{player.payoff}}
        </td>
        </tr>

        <tr>
        <td>A</td>
        <td>{% if p1.contribution == Constants.endowment %}
            貢献する
            {% else %}
            貢献しない
            {% endif %}
        <td>{% if p1.contribution == Constants.endowment %}
            0トークン
            {% else %}
            20トークン
            {% endif %}
        <td>{{group.individual_share}}
        </td>
        <td>{{p1.payoff}}
        </td>
        </tr>

        <tr>
        <td>B</td>
        <td>{% if p2.contribution == Constants.endowment %}
            貢献する
            {% else %}
            貢献しない
            {% endif %}
        <td>{% if p2.contribution == Constants.endowment %}
            0トークン
            {% else %}
            20トークン
            {% endif %}
        <td>{{group.individual_share}}
        </td>
        <td>{{p2.payoff}}
        </td>
        </tr>

        <tr>
        <td>C</td>
        <td>{% if p3.contribution == Constants.endowment %}
            貢献する
            {% else %}
            貢献しない
            {% endif %}
        <td>{% if p3.contribution == Constants.endowment %}
            0トークン
            {% else %}
            20トークン
            {% endif %}
        <td>{{group.individual_share}}
        </td>
        <td>{{p3.payoff}}
        </td>
        </tr>

    </table>
 <br>
</p>

    {% next_button %}

</center>
{% endblock %}

コメント

タイトルとURLをコピーしました