1. 程式人生 > >oTree學習教程(七)Apps & rounds

oTree學習教程(七)Apps & rounds

應用

在oTree(和Django)中,app是一個包含Python和HTML程式碼的資料夾。當您建立oTree專案時,它會預先載入各種應用程式,例如 public_goodsdictator。會話基本上是一個接一個顯示的應用程式序列。

建立應用

輸入:

這將基於oTree模板建立一個新的app資料夾,其中大部分結構已經為您設定。

關鍵檔案是models.py,pages.py和templates /資料夾下的HTML檔案。

您可以將其視為可以根據需要新增的骨架。 您可以新增自己的類,函式,方法和屬性,也可以匯入任何第三方模組。

然後轉到settings.py並在SESSION_CONFIGS中為您的應用建立一個與其他條目類似的條目。

組合應用

在您的SESSION_CONFIGS中,您可以通過設定組合應用程式'app_sequence'

在應用程式之間傳遞資料

回合

您可以通過在models.py中設定Constants.num_rounds來使遊戲執行多輪。 例如,如果您的會話配置的app_sequence是['app1','app2'],其中app1的num_rounds = 3且app2的num_rounds = 1,那麼您的會話將包含4個子會話。

回合數

您可以使用self.round_number (此屬性出現在subsession,group,player和page物件上)來獲取當前的輪數。回合數字從1開始。

在輪次或應用程式之間傳遞資料

每輪都有單獨的Subsession,Group和Player物件。 例如,假設您在第1輪中設定self.player.my_field = True。在第2輪中,如果您嘗試訪問self.player.my_field,您會發現其值為None(假設這是該欄位的預設值)。 這是因為第1輪中的Player物件與第2輪中的Player物件是分開的。

要訪問上一輪或應用程式中的資料,您可以使用下面描述的技術之一。

in_rounds,in_previous_rounds,in_round等

Player,group和subsession物件具有以下方法,它們的工作方式類似:

  • in_previous_rounds()
  • in_all_rounds()
  • in_rounds()
  • in_round()

player.in_previous_rounds()和player.in_all_rounds()每個都返回一個代表相同應用前幾輪中同一參與者的玩家列表。 區別在於in_all_rounds()包括當前回合的玩家。

例如,如果您想計算參與者對所有前幾輪遊戲的收益,加上當前遊戲的收益:

player.in_rounds(m,n)返回表示從輪次m到n的同一參與者的玩家列表。

player.in_round(m)只返回第m輪的玩家。 例如,要獲得上一輪玩家的回報,你可以使用self.player.in_round(self.round_number - 1).payoff。

類似地,subsession物件具有以相同方式工作的方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m)。

組物件也有方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m),但請注意,如果在輪之間重新組合組,則這些方法可能不會返回任何有意義的內容。

participant.vars

如果要在不同應用程式之間傳遞資料,則應將此資料儲存在參與者中,該資料在應用程式中保留(請參閱參與者)。 (in_all_rounds()僅在您需要訪問同一應用程式的上一輪資料時才有用。)

participant.vars是一個可以儲存任何資料的字典。 例如,您可以設定如下屬性:

稍後在會話中(例如在單獨的應用程式中),您可以像這樣檢索它:

在這裡所述,可以從頁面或玩家訪問當前參與者:

只要您檢索Player例項(例如,使用get_players()或get_player_by_role()等),您也可以從Group或Subsession訪問它。

如果您的key可能存在,也可能不存在,您可以使用.get()方法。 例如,self.participant.vars.get('my_var',DEFAULT_VALUE)。 更多這裡。

或者您可以在self.participant.vars中測試'my_var'是否與'my_var'一起存在。

注意:participant.vars不包含在Excel / CSV資料匯出中,也不包含在會話管理員的“資料”選項卡中。 如果需要,可以在player上建立一個StringField(例如,名為participant_vars_dump),然後在會話結束時指定:

(同樣的概念適用於下面的session.vars。)

session.vars 

對於會話中所有參與者相同的全域性變數,可以使用self.session.vars。 這是一個像participant.vars一樣的字典。 不同之處在於,如果在self.session.vars中設定變數,它將應用於會話中的所有參與者,而不僅僅是一個。

如此處所述,可以從Page物件或任何模型(Player,Group,Subsession等)訪問會話物件。

可變輪數

如果你想要一個可變數量的輪數,考慮設定num_rounds 為某個高數字,然後在你的應用程式中,有條件地隱藏 元素,這樣使用者就無法進入下一頁。{% next_button %}