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.