from ants import * ################ # Strategies # ################ def interactive_strategy(colony): """A strategy that starts an interactive session and lets the user make changes to the colony. For example, one might deploy a ThrowerAnt to the first tunnel by invoking colony.deploy_ant('tunnel_0_0', 'Thrower') """ print('colony: ' + str(colony)) msg = '<Control>-D (<Control>-Z <Enter> on Windows) completes a turn.\n' interact(msg) def start_with_strategy(args, strategy): """Reads command-line arguments and starts a game with those options.""" import argparse parser = argparse.ArgumentParser(description="Play Ants vs. SomeBees") parser.add_argument('-d', type=str, metavar='DIFFICULTY', help='sets difficulty of game (test/easy/medium/hard/extra-hard)') parser.add_argument('-w', '--water', action='store_true', help='loads a full layout with water') parser.add_argument('--food', type=int, help='number of food to start with when testing', default=2) args = parser.parse_args() assault_plan = make_normal_assault_plan() layout = dry_layout tunnel_length = 10 num_tunnels = 3 food = args.food if args.water: layout = wet_layout if args.d in ['t', 'test']: assault_plan = make_test_assault_plan() num_tunnels = 1 elif args.d in ['e', 'easy']: assault_plan = make_easy_assault_plan() num_tunnels = 2 elif args.d in ['n', 'normal']: assault_plan = make_normal_assault_plan() num_tunnels = 3 elif args.d in ['h', 'hard']: assault_plan = make_hard_assault_plan() num_tunnels = 4 elif args.d in ['i', 'extra-hard']: assault_plan = make_extra_hard_assault_plan() num_tunnels = 4 beehive = Hive(assault_plan) dimensions = (num_tunnels, tunnel_length) return AntColony(strategy, beehive, ant_types(), layout, dimensions, food).simulate() ################# # Assault Plans # ################# class AssaultPlan(dict): """The Bees' plan of attack for the Colony. Attacks come in timed waves. An AssaultPlan is a dictionary from times (int) to waves (list of Bees). >>> AssaultPlan().add_wave(4, 2) {4: [Bee(3, None), Bee(3, None)]} """ def add_wave(self, bee_type, bee_armor, time, count): """Add a wave at time with count Bees that have the specified armor.""" bees = [bee_type(bee_armor) for _ in range(count)] self.setdefault(time, []).extend(bees) return self @property def all_bees(self): """Place all Bees in the beehive and return the list of Bees.""" return [bee for wave in self.values() for bee in wave] def make_test_assault_plan(): return AssaultPlan().add_wave(Bee, 3, 2, 1).add_wave(Bee, 3, 3, 1) def make_easy_assault_plan(): plan = AssaultPlan() for time in range(3, 16, 2): plan.add_wave(Bee, 3, time, 1) plan.add_wave(Wasp, 3, 4, 1) plan.add_wave(NinjaBee, 3, 8, 1) plan.add_wave(Hornet, 3, 12, 1) plan.add_wave(Boss, 15, 16, 1) return plan def make_normal_assault_plan(): plan = AssaultPlan() for time in range(3, 16, 2): plan.add_wave(Bee, 3, time, 2) plan.add_wave(Wasp, 3, 4, 1) plan.add_wave(NinjaBee, 3, 8, 1) plan.add_wave(Hornet, 3, 12, 1) plan.add_wave(Wasp, 3, 16, 1) #Boss Stage for time in range(21, 30, 2): plan.add_wave(Bee, 3, time, 2) plan.add_wave(Wasp, 3, 22, 2) plan.add_wave(Hornet, 3, 24, 2) plan.add_wave(NinjaBee, 3, 26, 2) plan.add_wave(Hornet, 3, 28, 2) plan.add_wave(Boss, 20, 30, 1) return plan def make_hard_assault_plan(): plan = AssaultPlan() for time in range(3, 16, 2): plan.add_wave(Bee, 4, time, 2) plan.add_wave(Hornet, 4, 4, 2) plan.add_wave(Wasp, 4, 8, 2) plan.add_wave(NinjaBee, 4, 12, 2) plan.add_wave(Wasp, 4, 16, 2) #Boss Stage for time in range(21, 30, 2): plan.add_wave(Bee, 4, time, 3) plan.add_wave(Wasp, 4, 22, 2) plan.add_wave(Hornet, 4, 24, 2) plan.add_wave(NinjaBee, 4, 26, 2) plan.add_wave(Hornet, 4, 28, 2) plan.add_wave(Boss, 30, 30, 1) return plan def make_extra_hard_assault_plan(): plan = AssaultPlan() plan.add_wave(Hornet, 5, 2, 2) for time in range(3, 16, 2): plan.add_wave(Bee, 5, time, 2) plan.add_wave(Hornet, 5, 4, 2) plan.add_wave(Wasp, 5, 8, 2) plan.add_wave(NinjaBee, 5, 12, 2) plan.add_wave(Wasp, 5, 16, 2) #Boss Stage for time in range(21, 30, 2): plan.add_wave(Bee, 5, time, 3) plan.add_wave(Wasp, 5, 22, 2) plan.add_wave(Hornet, 5, 24, 2) plan.add_wave(NinjaBee, 5, 26, 2) plan.add_wave(Hornet, 5, 28, 2) plan.add_wave(Boss, 30, 30, 2) return plan from utils import * @main def run(*args): Insect.reduce_armor = class_method_wrapper(Insect.reduce_armor, pre=print_expired_insects) start_with_strategy(args, interactive_strategy)