예제 #1
0
파일: paintbox.py 프로젝트: wayn3w/boxes
    def __init__(self):
        Boxes.__init__(self)

        self.addSettingsArgs(edges.FingerJointSettings)
        self.addSettingsArgs(edges.StackableSettings)

        self.buildArgParser(x=100, y=300)

        self.argparser.add_argument("--canheight",
                                    action="store",
                                    type=int,
                                    default=50,
                                    help="Height of the paintcans")
        self.argparser.add_argument("--candiameter",
                                    action="store",
                                    type=int,
                                    default=30,
                                    help="Diameter of the paintcans")
        self.argparser.add_argument("--minspace",
                                    action="store",
                                    type=int,
                                    default=10,
                                    help="Minimum space between the paintcans")
        self.argparser.add_argument(
            "--hexpattern",
            action="store",
            type=boolarg,
            default=False,
            help="Use hexagonal arrangement for the holes instead of orthogonal"
        )
예제 #2
0
파일: drillbox.py 프로젝트: Rotzbua/boxes
 def __init__(self):
     Boxes.__init__(self)
     self.addSettingsArgs(edges.FingerJointSettings,
                          space=3,
                          finger=3,
                          surroundingspaces=1)
     self.buildArgParser(sx="25*3",
                         sy="60*4",
                         sh="5:25:10",
                         bottom_edge="h")
     self.argparser.add_argument(
         "--holes",
         action="store",
         type=int,
         default=3,
         help="Number of holes for each size",
     )
     self.argparser.add_argument(
         "--firsthole",
         action="store",
         type=float,
         default=1.0,
         help="Smallest hole",
     )
     self.argparser.add_argument(
         "--holeincrement",
         action="store",
         type=float,
         default=.5,
         help="increment between holes",
     )
예제 #3
0
파일: drillbox.py 프로젝트: jiskar/boxes
 def __init__(self):
     Boxes.__init__(self)
     self.addSettingsArgs(edges.FingerJointSettings)
     self.buildArgParser(sx="25*3", sy="60*4", h=60)
     self.argparser.add_argument(
         "--holes",
         action="store",
         type=int,
         default=3,
         help="Number of holes for each size",
     )
     self.argparser.add_argument(
         "--firsthole",
         action="store",
         type=float,
         default=1.0,
         help="Smallest hole",
     )
     self.argparser.add_argument(
         "--holeincrement",
         action="store",
         type=float,
         default=.5,
         help="increment between holes",
     )
예제 #4
0
파일: paperbox.py 프로젝트: Rotzbua/boxes
    def __init__(self):
        Boxes.__init__(self)
        self.buildArgParser("x", "y", "h")

        self.argparser.add_argument(
            "--design",
            action="store",
            type=str,
            default="automatic",
            choices=("automatic", "widebox", "tuckbox"),
            help="different design for paper consumption optimization. The tuckbox also has locking cut for its lid.",
        )

        self.argparser.add_argument(
            "--lid_heigth",
            type=float,
            default=15,
            help="Height of the lid (part which goes inside the box)",
        )
        self.argparser.add_argument(
            "--lid_radius",
            type=float,
            default=7,
            help="Angle, in radius, of the round corner of the lid",
        )
        self.argparser.add_argument(
            "--lid_sides",
            type=float,
            default=20,
            help="Width of the two sides upon which goes the lid",
        )
        self.argparser.add_argument(
            "--margin",
            type=float,
            default=0,
            help="Margin for the glued sides",
        )
        self.argparser.add_argument(
            "--mark_length",
            type=float,
            default=1.5,
            help="Length of the folding outside mark",
        )
        self.argparser.add_argument(
            "--tab_angle_rad",
            type=float,
            default=math.atan(2 / 25),
            help="Angle (in radian) of the sides which are to be glued inside the box",
        )

        self.argparser.add_argument(
            "--finger_hole_diameter",
            type=float,
            default=15,
            help="Diameter of the hole to help catch the lid",
        )
예제 #5
0
    def __init__(self,
                 database_dir='database',
                 selected_box_color=(225, 0, 0),
                 unselected_box_color=(0, 255, 0),
                 rate=2):

        Boxes.__init__(self, rate)
        self.selected_box = 0
        self.set_select_box = 0
        self.selected_box_color = selected_box_color
        self.unselected_box_color = unselected_box_color
        self.database_dir = database_dir
        self.set_image(None)
예제 #6
0
 def __init__(self):
     Boxes.__init__(self)
     self.addSettingsArgs(edges.FingerJointSettings)
     self.buildArgParser(h=30)
     self.argparser.add_argument(
         "--cardwidth",  action="store", type=float, default=65,
         help="Width of the cards")
     self.argparser.add_argument(
         "--cardheight",  action="store", type=float, default=90,
         help="Height of the cards")
     self.argparser.add_argument(
         "--num",  action="store", type=int, default=2,
         help="number of compartments")
예제 #7
0
파일: phoneholder.py 프로젝트: jiskar/boxes
    def __init__(self):
        Boxes.__init__(self)
        self.argparser.add_argument(
            "--phone_height",
            type=float,
            default=142,
            help="Height of the phone.",
        )
        self.argparser.add_argument(
            "--phone_width",
            type=float,
            default=73,
            help="Width of the phone.",
        )
        self.argparser.add_argument(
            "--phone_depth",
            type=float,
            default=11,
            help=("Depth of the phone. Used by the bottom support holding the "
                  "phone, and the side tabs depth as well. Should be at least "
                  "your material thickness for assembly reasons."),
        )
        self.argparser.add_argument(
            "--angle",
            type=float,
            default=25,
            help="angle at which the phone stands, in degrees. 0° is vertical.",
        )
        self.argparser.add_argument(
            "--bottom_margin",
            type=float,
            default=30,
            help="Height of the support below the phone",
        )
        self.argparser.add_argument(
            "--tab_size",
            type=float,
            default=76,
            help="Length of the tabs holding the phone",
        )
        self.argparser.add_argument(
            "--bottom_support_spacing",
            type=float,
            default=16,
            help=(
                "Spacing between the two bottom support. Choose a value big "
                "enough for the charging cable, without getting in the way of "
                "other ports."),
        )

        self.addSettingsArgs(edges.FingerJointSettings)
예제 #8
0
    def __init__(self):
        Boxes.__init__(self)

        self.buildArgParser(x=250, y=154, h=120)

        self.argparser.add_argument(
            "--cornerradius", action="store", type=int, default=30,
            help="Radius of the corners")
        self.argparser.add_argument(
            "--handleheight", action="store", type=int, default=150,
            help="Height of the handle")
        self.argparser.add_argument(
            "--handlewidth", action="store", type=int, default=120,
            help="Width of the handle")
예제 #9
0
파일: paperbox.py 프로젝트: vmario89/boxes
    def __init__(self):
        Boxes.__init__(self)
        self.buildArgParser("x", "y", "h")

        self.argparser.add_argument(
            "--lid_heigth",
            type=float,
            default=15,
            help="Height of the lid (part which goes inside the box)",
        )
        self.argparser.add_argument(
            "--lid_radius",
            type=float,
            default=7,
            help="Angle, in radius, of the round corner of the lid",
        )
        self.argparser.add_argument(
            "--lid_sides",
            type=float,
            default=20,
            help="Width of the two sides upon which goes the lid",
        )
        self.argparser.add_argument(
            "--margin",
            type=float,
            default=0.5,
            help="Space between the two folded sides to glue",
        )
        self.argparser.add_argument(
            "--mark_length",
            type=float,
            default=1.5,
            help="Length of the folding outside mark",
        )
        self.argparser.add_argument(
            "--tab_angle_rad",
            type=float,
            default=math.atan(2 / 25),
            help=
            "Angle (in radian) of the sides which are to be glued inside the box",
        )

        self.argparser.add_argument(
            "--finger_hole_diameter",
            type=float,
            default=15,
            help="Diameter of the hole to help catch the lid",
        )
예제 #10
0
    def __init__(self):
        Boxes.__init__(self)

        self.buildArgParser(x=250, y=154, h=120)

        self.argparser.add_argument("--cornerradius",
                                    action="store",
                                    type=int,
                                    default=30,
                                    help="Radius of the corners")
        self.argparser.add_argument("--handleheight",
                                    action="store",
                                    type=int,
                                    default=150,
                                    help="Height of the handle")
        self.argparser.add_argument("--handlewidth",
                                    action="store",
                                    type=int,
                                    default=120,
                                    help="Width of the handle")
예제 #11
0
 def __init__(self):
     Boxes.__init__(self)
     self.argparser.add_argument(
         "--columns",
         type=int,
         default=4,
         help="Number of columns of capsules.",
     )
     self.argparser.add_argument(
         "--rows",
         type=int,
         default=5,
         help="Number of capsules by columns.",
     )
     self.argparser.add_argument(
         "--backplate",
         type=boolarg,
         default=True,
         help="True if a backplate should be generated.",
     )
예제 #12
0
    def __init__(self):
        Boxes.__init__(self)

        self.addSettingsArgs(edges.FingerJointSettings)
        self.addSettingsArgs(edges.StackableSettings)

        self.buildArgParser(x=100, y=300)

        self.argparser.add_argument(
            "--canheight", action="store", type=int, default=50,
            help="Height of the paintcans")
        self.argparser.add_argument(
            "--candiameter", action="store", type=int, default=30,
            help="Diameter of the paintcans")
        self.argparser.add_argument(
            "--minspace", action="store", type=int, default=10,
            help="Minimum space between the paintcans")
        self.argparser.add_argument(
            "--hexpattern", action="store", type=boolarg, default=False,
            help="Use hexagonal arrangement for the holes instead of orthogonal")
예제 #13
0
def createBoxes():
    for player in playerL:
        boxes = Boxes(player)
        bs.append(boxes)
예제 #14
0
 def create_box_game(self):
     boxes = Boxes()
     boxes.run()
예제 #15
0
 def create_box_game(self):
     boxes = Boxes()
     boxes.run()
예제 #16
0
    def __init__(self):
        Boxes.__init__(self)

        self.addSettingsArgs(edges.FingerJointSettings)
        self.addSettingsArgs(edges.StackableSettings)

        self.buildArgParser(x=56, y=85)

        # count
        self.argparser.add_argument(
            "--sbcs", action="store", type=int, default=5,
            help="how many slots for sbcs",
        )

        # spaces
        self.argparser.add_argument(
            "--clearance-x", action="store", type=int, default=3,
            help="clearance for the board in the box (x) in mm"
        )
        self.argparser.add_argument(
            "--clearance-y", action="store", type=int, default=3,
            help="clearance for the board in the box (y) in mm"
        )
        self.argparser.add_argument(
            "--clearance-z", action="store", type=int, default=28,
            help="SBC Clearance in mm",
        )

        # mounting holes
        self.argparser.add_argument(
            "--hole-dist-edge", action="store", type=decimal.Decimal, default=3.5,
            help="hole distance from edge in mm"
        )
        self.argparser.add_argument(
            "--hole-grid-dimension-x", action="store", type=int, default=58,
            help="width of x hole area"
        )
        self.argparser.add_argument(
            "--hole-grid-dimension-y", action="store", type=int, default=49,
            help="width of y hole area"
        )
        self.argparser.add_argument(
            "--hole-diameter", action="store", type=decimal.Decimal, default=2.75,
            help="hole diameters"
        )

        # i/o holes
        self.argparser.add_argument(
            "--netusb-z", action="store", type=int, default=18,
            help="height of the net/usb hole mm"
        )
        self.argparser.add_argument(
            "--netusb-x", action="store", type=int, default=53,
            help="width of the net/usb hole in mm"
        )

        # features
        self.argparser.add_argument(
            "--stable", action='store', type=boolarg, default=False,
            help="draw some holes to put a 1/4\" dowel through at the base and top"
        )
        self.argparser.add_argument(
            "--switch", action='store', type=boolarg, default=False,
            help="adds an additional vertical segment to hold the switch in place, works best w/ --stable"
        )
        # TODO flesh this idea out better
        self.argparser.add_argument(
            "--fan", action='store', type=int, required=False,
            help="ensure that the x width is at least this much and as well, draw a snug holder for a fan someplace"
        )
예제 #17
0
                               type='prod',
                               roles=['my_network'],
                               site=SITE)
conf.add_network_conf(network)\
    .add_machine(roles=['collector', 'front', 'working'],
                 cluster=CLUSTER,
                 nodes=1,
                 primary_network=network)\
    .finalize()

SEED = 6
NB_QUERY = 1500
NB_CRASHES = 3
EXPORT_TRACES_FILE = Path(f'../../results/result_failures_3_s{SEED}.json')

boxes = Boxes(depth=3, arity=2, kind=BoxesType.WORST)
boxes.print()
longestTimeOfLongest = boxes.getMaxTime()
logging.debug(f"Longest possible task takes {longestTimeOfLongest}ms.")

seed(SEED)

provider = G5k(conf)
roles, networks = provider.init()
roles = discover_networks(roles, networks)

priors = [__python3__, __default_python3__, __docker__]
with play_on(pattern_hosts='all', roles=roles, priors=priors) as p:
    p.pip(display_name='Installing python-docker…', name='docker')

## #A deploy jaeger, for now, we set up with all in one
예제 #18
0
 def __init__(self):
     Boxes.__init__(self)
     self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.0)
예제 #19
0
                               site=SITE)
conf.add_network_conf(network)\
    .add_machine(roles=['collector', 'front', 'working'],
                 cluster=CLUSTER,
                 nodes=1,
                 primary_network=network)\
    .finalize()
                 


SEED = 5
NB_QUERY = 1500
FAIRNESS = 0.2
EXPORT_TRACES_FILE = Path(f'../../results/result_fairness_1b_s{SEED}.json')

boxes = Boxes(depth=3, arity=2, kind=BoxesType.WORST)
boxes.print()
longestTimeOfLongest = boxes.getMaxTime()
logging.debug(f"Longest possible task takes {longestTimeOfLongest}ms.")

seed(SEED)



provider = G5k(conf)
roles, networks = provider.init()
roles = discover_networks(roles, networks)



priors = [__python3__, __default_python3__, __docker__]
예제 #20
0
    def __init__(self):
        Boxes.__init__(self)

        self.addSettingsArgs(edges.FingerJointSettings)
        self.addSettingsArgs(edges.StackableSettings)

        self.buildArgParser(x=56, y=85)

        # count
        self.argparser.add_argument(
            "--sbcs",
            action="store",
            type=int,
            default=5,
            help="how many slots for sbcs",
        )

        # spaces
        self.argparser.add_argument(
            "--clearance_x",
            action="store",
            type=int,
            default=3,
            help="clearance for the board in the box (x) in mm")
        self.argparser.add_argument(
            "--clearance_y",
            action="store",
            type=int,
            default=3,
            help="clearance for the board in the box (y) in mm")
        self.argparser.add_argument(
            "--clearance_z",
            action="store",
            type=int,
            default=28,
            help="SBC Clearance in mm",
        )

        # mounting holes
        self.argparser.add_argument("--hole_dist_edge",
                                    action="store",
                                    type=float,
                                    default=3.5,
                                    help="hole distance from edge in mm")
        self.argparser.add_argument("--hole_grid_dimension_x",
                                    action="store",
                                    type=int,
                                    default=58,
                                    help="width of x hole area")
        self.argparser.add_argument("--hole_grid_dimension_y",
                                    action="store",
                                    type=int,
                                    default=49,
                                    help="width of y hole area")
        self.argparser.add_argument("--hole_diameter",
                                    action="store",
                                    type=float,
                                    default=2.75,
                                    help="hole diameters")

        # i/o holes
        self.argparser.add_argument("--netusb_z",
                                    action="store",
                                    type=int,
                                    default=18,
                                    help="height of the net/usb hole mm")
        self.argparser.add_argument("--netusb_x",
                                    action="store",
                                    type=int,
                                    default=53,
                                    help="width of the net/usb hole in mm")

        # features
        self.argparser.add_argument(
            "--stable",
            action='store',
            type=boolarg,
            default=False,
            help=
            "draw some holes to put a 1/4\" dowel through at the base and top")
        self.argparser.add_argument(
            "--switch",
            action='store',
            type=boolarg,
            default=False,
            help=
            "adds an additional vertical segment to hold the switch in place, works best w/ --stable"
        )
예제 #21
0
 def __init__(self):
     Boxes.__init__(self)
     self.buildArgParser("sx", "sy", "h", "outside")
     self.argparser.add_argument("--slot_depth",
                                 type=float,
                                 default=20,
                                 help="depth of the slot in mm")
     self.argparser.add_argument(
         "--slot_angle",
         type=float,
         default=0,
         help=
         "angle at which slots are generated, in degrees. 0° is vertical.",
     )
     self.argparser.add_argument(
         "--slot_radius",
         type=float,
         default=2,
         help="radius of the slot entrance in mm",
     )
     self.argparser.add_argument(
         "--slot_extra_slack",
         type=float,
         default=0.2,
         help=
         "extra slack (in addition to thickness and kerf) for slot width to help insert dividers",
     )
     self.argparser.add_argument(
         "--divider_bottom_margin",
         type=float,
         default=0,
         help="margin between box's bottom and divider's",
     )
     self.argparser.add_argument(
         "--divider_upper_notch_radius",
         type=float,
         default=1,
         help="divider's notch's upper radius",
     )
     self.argparser.add_argument(
         "--divider_lower_notch_radius",
         type=float,
         default=8,
         help="divider's notch's lower radius",
     )
     self.argparser.add_argument(
         "--divider_notch_depth",
         type=float,
         default=15,
         help="divider's notch's depth",
     )
     self.argparser.add_argument(
         "--left_wall",
         type=boolarg,
         default=True,
         help="generate wall on the left side",
     )
     self.argparser.add_argument(
         "--right_wall",
         type=boolarg,
         default=True,
         help="generate wall on the right side",
     )
예제 #22
0
def process(q, cmd_thread):
    # 初始化
    pygame.init()
    updated_frame = False  # update a frame
    settings = Settings("data\program_settings.json")
    screen = pygame.display.set_mode(
        (32 * settings.screen_scale + 2 * settings.screen_offset,
         28 * settings.screen_scale + 2 * settings.screen_offset))
    sbd = ScoreBoard("data\hiscore.csv")
    passwd = Password(settings, screen)
    tfunc.print_welcome()

    team_flights = Group()
    enemy_flights = Group()

    team1 = TeamFlight([0.8, 0.8], [3.5, 0.5], [1.5, 1.5], [1.5, 26], settings,
                       screen)
    team1.print_info()
    team_flights.add(team1)
    team2 = TeamFlight([0.8, 0.8], [5.5, 0.5], [5.5, 1.5], [5.5, 26], settings,
                       screen)
    team2.print_info()
    team_flights.add(team2)
    team3 = TeamFlight([0.8, 0.8], [9.5, 0.5], [9.5, 1.5], [9.5, 26], settings,
                       screen)
    team3.print_info()
    team_flights.add(team3)
    team4 = TeamFlight([0.8, 0.8], [11.5, 0.5], [13.5, 1.5], [13.5, 26],
                       settings, screen)
    team4.print_info()
    team_flights.add(team4)

    enemy1 = EnemyFlight([0.8, 0.8], [2, 10],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy1.set_velocity([0, -0.11])
    enemy1.print_info()
    enemy_flights.add(enemy1)
    enemy2 = EnemyFlight([0.8, 0.8], [13, 10],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy2.set_velocity([0, 0.11])
    enemy2.print_info()
    enemy_flights.add(enemy2)
    enemy3 = EnemyFlight([0.8, 0.8], [2, 18],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy3.set_velocity([0, -0.11])
    enemy3.print_info()
    enemy_flights.add(enemy3)
    enemy4 = EnemyFlight([0.8, 0.8], [13, 18],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy4.set_velocity([0, 0.11])
    enemy4.print_info()
    enemy_flights.add(enemy4)

    person = Person([0.8, 0.8], [7.5, 0.9], settings, screen)
    boxes = Boxes(settings, screen)

    pygame.display.set_caption("Explore Reactor Room")
    tfunc.update_screen(settings, screen, team_flights, enemy_flights, person,
                        boxes, passwd, sbd)

    follow_status = False

    while True:
        start_time = time.time()
        period_timeout = True

        if settings.reset_request:  # game reset
            settings.reset_request = False
            settings.paused = False
            settings.init_game_args()
            if settings.game_mode != 0:  # set enemy mode according to game mode
                settings.enemy_status = settings.game_mode + 3
            person.reinit([0.8, 0.8], [7.5, 0.9])
            boxes.reinit()
            team1.reinit([0.8, 0.8], [3.5, 0.5], [1.5, 1.5], [1.5, 26])
            team2.reinit([0.8, 0.8], [5.5, 0.5], [5.5, 1.5], [5.5, 26])
            team3.reinit([0.8, 0.8], [9.5, 0.5], [9.5, 1.5], [9.5, 26])
            team4.reinit([0.8, 0.8], [11.5, 0.5], [13.5, 1.5], [13.5, 26])
            enemy1.reinit([0.8, 0.8], [2, 10], rotate_angle=math.pi / 100)
            enemy1.set_velocity([0, -0.11])
            enemy2.reinit([0.8, 0.8], [13, 10], rotate_angle=math.pi / 100)
            enemy2.set_velocity([0, 0.11])
            enemy3.reinit([0.8, 0.8], [2, 18], rotate_angle=math.pi / 100)
            enemy3.set_velocity([0, -0.11])
            enemy4.reinit([0.8, 0.8], [13, 18], rotate_angle=math.pi / 100)
            enemy4.set_velocity([0, 0.11])
            settings.enemy_status_changed = True
            passwd.generate_passwd()

        if settings.run_active and not settings.paused:
            # 帧开始,执行每一帧的预处理
            settings.timer = settings.timer + settings.time_period  # 计算时间
            if settings.clock_1 > 0:  # 计算clock1时间
                settings.clock_1 -= 1
            else:
                settings.clock_1 = 30
                settings.change_font_color()

            n_flights = len(team_flights.sprites()) + len(
                enemy_flights.sprites())  #包含自己一共的飞机数
            p_all = [[0, 0] for i in range(n_flights)]
            p_all_direction = [0 for i in range(n_flights)]
            index = 0
            for team in team_flights.sprites():
                p_all[index] = team.get_info()[0]
                p_all_direction[index] = 0
                index = index + 1
            for enemy in enemy_flights.sprites():
                p_all[index] = enemy.get_info()[0]
                p_all_direction[index] = enemy.get_direction()
                index = index + 1

            # 更新其它状态
            person.move()
            boxes.update_info(settings, person)
            settings.all_open = boxes.all_open()
            if settings.all_open and person.get_info(
            )[0][1] <= 0.5 and not settings.failed:
                settings.complete = True
            elif (settings.timer > 480 or person.get_hp_info()[0] <= 0
                  or settings.out_times * settings.time_period >= 10.0
                  ) and not settings.complete:
                settings.failed = True
            if settings.complete and settings.game_mode != 0 and not settings.hiscore_recorded:
                settings.hiscore_recorded = True
                sbd.set_new_hiscore(settings.game_mode - 1,
                                    settings.complete_time)  # set hiscore
                sbd.write_hiscore()

            # 敌方无人机行动
            if settings.enemy_status == 0:  # 敌方无人机悬停
                for enemy in enemy_flights.sprites():
                    enemy.set_velocity([0, 0])
                    enemy.move()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status == 1:  # 敌方无人机直线运动
                for enemy in enemy_flights.sprites():
                    enemy.move()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status == 2:  # 敌方无人机圆周运动
                for enemy in enemy_flights.sprites():
                    enemy.move_circle()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status == 3:  # 敌方无人机逼近己方无人机
                for enemy, team in zip(enemy_flights.sprites(),
                                       team_flights.sprites()):
                    team_p_flight = team.get_info()[0]
                    enemy_p_flight = enemy.get_info()[0]
                    team_p_flight = [
                        team_p_flight[0] + random.random() * 4 - 2,
                        team_p_flight[1] + 1.5 + random.random() * 4 - 2
                    ]
                    [vx, vy] = apf.compute_next_step(settings,
                                                     enemy_p_flight,
                                                     team_p_flight, [],
                                                     0, [],
                                                     is_team=False)
                    enemy.set_max_v(
                        settings.enemy_mission_args[1][3])  # medium velocity
                    enemy.set_velocity([vx / 1.5, vy / 1.5])
                    enemy.move()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status >= 4 and settings.enemy_status <= 6:  # 执行任务状态
                difficulty = settings.enemy_status - 4  # 0:简单  1:中等  2:困难
                enemy_mission_args = settings.enemy_mission_args[difficulty]
                is_first = True
                flight_index = 0
                p_offset = [[0, enemy_mission_args[6]],
                            [enemy_mission_args[6], 0],
                            [-enemy_mission_args[6], 0],
                            [0, -enemy_mission_args[6]]]
                if boxes.is_in_protect_box(
                        person.get_info()[0]):  # 在保护区域内,一架逼近人,三架逼近己方无人机
                    for enemy, team in zip(enemy_flights.sprites(),
                                           team_flights.sprites()):
                        if is_first:
                            is_first = False
                            person_p_flight = person.get_info()[0]
                            enemy_p_flight = enemy.get_info()[0]
                            person_p_flight = [
                                person_p_flight[0] + random.random() * 4 - 2,
                                person_p_flight[1] + 2 +
                                random.random() * 2 * enemy_mission_args[1] -
                                enemy_mission_args[1]
                            ]
                            [vx, vy] = apf.compute_next_step(settings,
                                                             enemy_p_flight,
                                                             person_p_flight,
                                                             [],
                                                             0, [],
                                                             is_team=False)
                        else:
                            team_p_flight = team.get_info()[0]
                            enemy_p_flight = enemy.get_info()[0]
                            team_p_flight = [
                                team_p_flight[0] + random.random() * 4 - 2,
                                team_p_flight[1] + 1.5 +
                                random.random() * 2 * enemy_mission_args[1] -
                                enemy_mission_args[1]
                            ]
                            [vx, vy] = apf.compute_next_step(settings,
                                                             enemy_p_flight,
                                                             team_p_flight, [],
                                                             0, [],
                                                             is_team=False)
                        enemy.set_max_v(enemy_mission_args[3])
                        enemy.set_velocity([
                            vx * enemy_mission_args[0],
                            vy * enemy_mission_args[0]
                        ])
                        enemy.move()
                        if settings.enemy_status_changed:
                            enemy.set_attack_args(enemy_mission_args[4],
                                                  enemy_mission_args[5])
                        enemy.attack(person, boxes)
                else:  # 在保护区域外,四架逼近人
                    for enemy, team in zip(enemy_flights.sprites(),
                                           team_flights.sprites()):
                        person_p_flight = person.get_info()[0]
                        enemy_p_flight = enemy.get_info()[0]
                        person_p_flight = [
                            person_p_flight[0] + p_offset[flight_index][0] +
                            random.random() * 2 * enemy_mission_args[2] -
                            enemy_mission_args[2],
                            person_p_flight[1] + p_offset[flight_index][1] +
                            random.random() * 2 * enemy_mission_args[2] -
                            enemy_mission_args[2]
                        ]
                        flight_index = flight_index + 1
                        [vx, vy] = apf.compute_next_step(settings,
                                                         enemy_p_flight,
                                                         person_p_flight, [],
                                                         0, [],
                                                         is_team=False)
                        enemy.set_max_v(enemy_mission_args[3])
                        enemy.set_velocity([
                            vx * enemy_mission_args[0],
                            vy * enemy_mission_args[0]
                        ])
                        enemy.move()
                        if settings.enemy_status_changed:
                            enemy.set_attack_args(enemy_mission_args[4],
                                                  enemy_mission_args[5])
                        enemy.attack(person, boxes)

            settings.enemy_status_changed = False

            # 己方无人机行动
            all_reach_final_goal = True  # 假定都达到了密码箱位置(final pos)
            if follow_status:
                # 跟随主飞机模式
                is_first = True
                index = 0
                for team in team_flights.sprites():
                    if not team.reach_final_goal():
                        all_reach_final_goal = False

                    if is_first:
                        is_first = False
                        p_flight = team.get_info()[0]
                        if p_flight[1] >= 26.1:  #达成目标,恢复原队形
                            follow_status = False
                            p_goal = [1.5, 26]
                            team.set_goal(p_goal)
                            continue
                        p_leader = p_flight
                        p_goal = [tcmd_temp_line, 27.1]
                        team.set_goal(p_goal)
                    else:
                        if not follow_status:  #恢复现场
                            p_goal[0] = p_goal[0] + 4
                            team.set_goal(p_goal)
                            continue
                        p_flight = team.get_info()[0]
                        team.set_goal([p_leader[0], p_leader[1] - index])
                        index = index + tcmd_follow_length
                        p_goal = team.get_goal()

                    [vx, vy] = apf.compute_next_step(settings,
                                                     p_flight,
                                                     p_goal,
                                                     p_all,
                                                     n_flights,
                                                     p_all_direction,
                                                     is_team=True)
                    [vx, vy] = [
                        vx + random.random() * 0.02 - 0.01,
                        vy + random.random() * 0.01 - 0.005
                    ]  # 速度扰动
                    team.set_velocity([vx, vy])
                    team.move()
                    team.heal(person, boxes)

            else:
                # 独立模式
                for team in team_flights.sprites():
                    if not team.reach_final_goal():
                        all_reach_final_goal = False

                    p_flight = team.get_info()[0]
                    p_goal = team.get_goal()
                    [vx, vy] = apf.compute_next_step(settings,
                                                     p_flight,
                                                     p_goal,
                                                     p_all,
                                                     n_flights,
                                                     p_all_direction,
                                                     is_team=True)
                    [vx, vy] = [
                        vx + random.random() * 0.02 - 0.01,
                        vy + random.random() * 0.01 - 0.005
                    ]  # 速度扰动
                    team.set_velocity([vx, vy])
                    team.move()
                    team.heal(person, boxes)

            if not settings.crack_qrcode:
                boxes.crack(all_reach_final_goal)  # 全部到达目的地,破译密码

            # 获取终端指令
            if not q.empty():
                try:
                    [cmd_content, cmd_args] = q.get().split(' ', 1)
                    if cmd_content == "thenextcontentisthepassword":
                        # 玩家输入密码
                        try:
                            tcmd_passwd = cmd_args
                            if passwd.check_passwd(tcmd_passwd):
                                print("[Boxes] Password correct.")
                                settings.get_key = True
                            else:
                                print("[Boxes] Password error, try again.")
                        except:
                            print("[Boxes] Password input error.")

                    elif cmd_content == "y":
                        # 更改己方飞机目标点(Y轴平齐)策略
                        try:
                            [cmd_arg_1, cmd_arg_2] = cmd_args.split(' ')
                            new_goal = float(cmd_arg_1)
                            interval = float(cmd_arg_2)
                        except:
                            new_goal = float(cmd_args)
                            interval = 4.0
                        x_offset = 7.5 - interval * 1.5
                        print(
                            "[Team] Move team flights to Y-line %.3f m with interval %.3f m ."
                            % (new_goal, interval))
                        for team in team_flights.sprites():
                            team.set_goal([x_offset, new_goal])
                            x_offset += interval
                    elif cmd_content == "f":
                        # 跟随主飞机运动策略
                        [cmd_arg_1, cmd_arg_2] = cmd_args.split(' ')
                        tcmd_temp_line = float(cmd_arg_1)
                        tcmd_follow_length = float(cmd_arg_2)
                        print(
                            "[Team] Follow the leader team flight with X-line %.3f m and interval %.3f m ."
                            % (tcmd_temp_line, tcmd_follow_length))
                        follow_status = True
                    elif cmd_content == "s":
                        # 即刻在前方悬停策略
                        follow_status = False
                        ahead_length = float(cmd_args)
                        print("[Team] Hover at %.3f m ahead ." %
                              (ahead_length))
                        for team in team_flights.sprites():
                            temp_goal = team.get_info()[0]
                            team.set_goal(
                                [temp_goal[0], temp_goal[1] + ahead_length])
                    else:
                        print("[Team] Unknown command.")
                except:
                    print("[Team] Command error.")

            if settings.crack_qrcode and not settings.get_key:
                cmd_thread.input_passwd_request()  # input the password in tcmd

        tfunc.update_screen(settings, screen, team_flights, enemy_flights,
                            person, boxes, passwd, sbd)

        # Watch update frame time (for test)
        #if updated_frame:
        #    updated_frame = False
        #    print("Update time: %.3fs" % (time.time() - start_time))

        # 等待更新时间
        while period_timeout:
            tfunc.check_events(settings, screen, cmd_thread, team_flights,
                               enemy_flights, person, sbd)
            if time.time() - start_time >= 0.04:
                period_timeout = False
                updated_frame = True