from otree.api import * import sys,os import random, json import networkx as nx import io doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'seeker_training' PLAYERS_PER_GROUP = None NUM_ROUNDS = 20 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): to_be_removed = models.IntegerField( label= "您選擇的節點為:" ) num_removed = models.IntegerField() num_remain = models.IntegerField() confirm = models.BooleanField( label = "確定要刪除這個節點嗎?" ) G = nx.barabasi_albert_graph(30, 3) original_size = models.IntegerField(initial=len(G.nodes())) # PAGES class Training(Page): form_model = 'player' form_fields = ['to_be_removed'] @staticmethod def is_displayed(player: Player): if player.G.size() == 0: return False return True @staticmethod def vars_for_template(player: Player): degree = {node: degree for (node, degree) in player.G.degree} # graph structure links = [] for (i, j) in player.G.edges(): links.append({"source": i, "target": j}) links.append({"source": j, "target": i}) return { "nodes": [{"id": i, "degree": degree[i], } for i in player.G.nodes()], "links": links, "which_round": player.round_number, } @staticmethod def before_next_page(player: Player, timeout_happened): caught = player.to_be_removed neighbors = [n for n in player.G.neighbors(caught)] player.num_removed = len(neighbors) + 1 player.original_size = len(player.G.nodes()) for n in neighbors: player.G.remove_node(n) player.G.remove_node(caught) player.num_remain = len(player.G.nodes()) class ConfirmPage(Page): @staticmethod def is_displayed(player: Player): if player.original_size == 0: return False return True @staticmethod def vars_for_template(player: Player): line_plot = [[0, player.in_round(1).original_size]] for (x, p) in zip(range(1, player.round_number), player.in_previous_rounds()): line_plot.append([x, p.num_remain]) line_plot.append([player.round_number, player.num_remain]) print(line_plot) return { "line_plot": line_plot, "which_round": player.round_number, "caught": player.to_be_removed, "num_removed": player.num_removed, "num_remain": player.num_remain, } page_sequence = [Training, ConfirmPage]