Aplicaciones y rondas
Aplicaciones
Una aplicación de oTree es una carpeta que contiene código Python y HTML. Un proyecto contiene múltiples aplicaciones. Una sesión es básicamente una secuencia de aplicaciones que se juegan una tras otra.
Combinando aplicaciones
Puedes combinar aplicaciones configurando el app_sequence de tu sesión.
Paso de datos entre aplicaciones
Consulta participant fields y session fields.
Rondas
Puedes hacer que un juego se ejecute durante múltiples rondas configurando C.NUM_ROUNDS. Por ejemplo, si el app_sequence de tu sesión es ['app1', 'app2'], donde app1 tiene NUM_ROUNDS = 3 y app2 tiene NUM_ROUNDS = 1, entonces tus sesiones contendrán 4 subsesiones.
Números de ronda
Puedes obtener el número de ronda actual con player.round_number (este atributo está presente en los objetos subsession, group y player). Los números de ronda comienzan desde 1.
Pasar datos entre rondas o aplicaciones
Cada ronda tiene objetos de subsession, Group y Player separados. Por ejemplo, supongamos que estableces player.my_field = True en la ronda 1. En la ronda 2, si intentas acceder a player.my_field, encontrarás que su valor es None. Esto se debe a que los objetos Player en la ronda 1 son distintos de los objetos Player en la ronda 2.
Para acceder a datos de una ronda o aplicación anterior, puedes utilizar una de las técnicas descritas a continuación.
in_rounds, in_previous_rounds, in_round, etc.
Los objetos Player, group y subsession tienen los siguientes métodos:
in_previous_rounds()
in_all_rounds()
in_rounds()
in_round()
Por ejemplo, si estás en la última ronda de un juego de 10 rondas, player.in_previous_rounds() devolverá una lista con 9 objetos de jugador, que representan al participante actual en todas las rondas anteriores.
player.in_all_rounds() es casi lo mismo, pero la lista tendrá 10 objetos, porque incluye el jugador de la ronda actual.
player.in_rounds(m, n) devuelve una lista de jugadores que representan al mismo participante desde la ronda m hasta la ronda n.
player.in_round(m) devuelve solo el jugador en la ronda m. Por ejemplo, para obtener el pago del jugador en la ronda anterior, harías:
prev_player = player.in_round(player.round_number - 1)
print(prev_player.payoff)
Estos métodos funcionan de la misma manera para subsesiones (por ejemplo, subsession.in_all_rounds()).
También funcionan de la misma manera para grupos, pero no tiene sentido usarlos si reorganizas los grupos entre rondas.
Campos de participante
Si deseas acceder a los datos de un participante de una aplicación anterior, debes almacenar estos datos en el objeto participante, que persiste entre aplicaciones (ver Participante). (in_all_rounds() solo es útil cuando necesitas acceder a datos de una ronda anterior de la misma aplicación.)
Ve a la configuración y define PARTICIPANT_FIELDS, que es una lista de los nombres de los campos que deseas definir en tu participante.
Entonces, en tu código, puedes obtener y establecer cualquier tipo de dato en estos campos:
participant.mylist = [1, 2, 3]
(Internamente, todos los campos de participantes se almacenan en un diccionario llamado participant.vars. participant.xyz es equivalente a participant.vars['xyz'].)
Campos de sesión
Para las variables globales que son las mismas para todos los participantes en la sesión, agrégalas a SESSION_FIELDS, que funciona de la misma manera que PARTICIPANT_FIELDS. Internamente, todos los campos de sesión se almacenan en session.vars.
Número variable de rondas
Si deseas un número variable de rondas, considera usar Páginas en vivo.
Alternativamente, puedes establecer NUM_ROUNDS en un número alto y luego, en tu aplicación, ocultar condicionalmente el elemento {{ next_button }}, de modo que el usuario no pueda proceder a la siguiente página, o usar app_after_this_page. Pero ten en cuenta que tener muchas rondas (por ejemplo, más de 100) podría causar problemas de rendimiento, así que prueba tu aplicación cuidadosamente.