Matuiss2

Roach rush AI- v1

Jul 23rd, 2018
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.80 KB | None | 0 0
  1. import sc2
  2. from sc2 import run_game, maps, Race, Difficulty
  3. from sc2.constants import HATCHERY, ZERGLING, QUEEN, LARVA, EFFECT_INJECTLARVA, \
  4. SPAWNINGPOOL, RESEARCH_ZERGLINGMETABOLICBOOST, OVERLORD, EXTRACTOR, DRONE, ROACHWARREN, ROACH, \
  5. QUEENSPAWNLARVATIMER, EVOLUTIONCHAMBER, RESEARCH_ZERGMISSILEWEAPONSLEVEL1, AbilityId, \
  6. RESEARCH_ZERGGROUNDARMORLEVEL1
  7. from sc2.player import Bot, Computer
  8.  
  9.  
  10. class ZergRoach(sc2.BotAI):
  11.     def __init__(self):
  12.         self.flag1 = False
  13.         self.flag2 = False
  14.  
  15.     async def on_step(self, iteration):
  16.         await self.distribute_workers()
  17.         await self.build_workers()
  18.         await self.build_overlords()
  19.         await self.build_hatchery()
  20.         await self.build_spawning_pool()
  21.         await self.build_queens_inject_larva()
  22.         await self.build_Roach_Warren()
  23.         await self.build_extrator()
  24.         await self.build_evochamber()
  25.         await self.build_Roaches()
  26.         await self.defend_attack()
  27.         await self.one_one()
  28.  
  29.     async def build_workers(self):
  30.         larvas = self.units(LARVA)
  31.         if self.units(DRONE).amount < 18 * self.units(HATCHERY).amount \
  32.                 and self.can_afford(DRONE) and larvas.exists\
  33.                 and self.supply_left >= 1:
  34.             await self.do(larvas.random.train(DRONE))
  35.  
  36.     async def build_overlords(self):
  37.         larvas = self.units(LARVA)
  38.         if self.supply_left < 3 and self.can_afford(OVERLORD) and larvas.exists \
  39.                 and not self.already_pending(OVERLORD):
  40.             await self.do(larvas.random.train(OVERLORD))
  41.  
  42.  
  43.     async def build_hatchery(self):
  44.         hatch_amount = self.units(HATCHERY).amount
  45.         if self.can_afford(HATCHERY) and hatch_amount <= 4\
  46.                 and not self.already_pending(HATCHERY):
  47.             if hatch_amount == 1:
  48.                 await self.expand_now()
  49.             elif hatch_amount * 10 < self.units(ROACH).amount:
  50.                 await self.expand_now()
  51.  
  52.     async def build_spawning_pool(self):
  53.         hatcherys = self.units(HATCHERY)
  54.         if self.can_afford(SPAWNINGPOOL) and not self.units(SPAWNINGPOOL).exists \
  55.                 and hatcherys.amount == 2:
  56.                     await self.build(SPAWNINGPOOL, near=hatcherys.first)
  57.  
  58.     async def build_queens_inject_larva(self):
  59.         hatcherys = self.units(HATCHERY).random
  60.         if self.units(SPAWNINGPOOL).exists:
  61.             if self.units(QUEEN).amount < 2 and hatcherys.is_ready\
  62.                     and not self.already_pending(QUEEN) and hatcherys.noqueue:
  63.                 if self.can_afford(QUEEN):
  64.                     await self.do(hatcherys.train(QUEEN))
  65.         for queen in self.units(QUEEN).idle:
  66.             abilities = await self.get_available_abilities(queen)
  67.             if AbilityId.EFFECT_INJECTLARVA in abilities:
  68.                 await self.do(queen(EFFECT_INJECTLARVA, hatcherys))
  69.  
  70.     async def build_Roach_Warren(self):
  71.         sp = self.units(SPAWNINGPOOL)
  72.         if self.can_afford(ROACHWARREN) and sp.exists\
  73.                 and not self.units(ROACHWARREN).exists\
  74.                 and not self.already_pending(ROACHWARREN):
  75.             await self.build(ROACHWARREN, near=sp.first)
  76.  
  77.     async def build_extrator(self):
  78.         if self.units(EXTRACTOR).amount < 3 and not self.already_pending(EXTRACTOR) \
  79.                 and self.units(HATCHERY).amount == 2 and self.can_afford(EXTRACTOR):
  80.             drone = self.workers.random
  81.             await self.do(drone.build(EXTRACTOR, self.state.vespene_geyser.closest_to(drone.position)))
  82.  
  83.     async def build_evochamber(self):
  84.         rw = self.units(ROACHWARREN)
  85.         if self.can_afford(EVOLUTIONCHAMBER)and rw.exists \
  86.                 and self.units(EVOLUTIONCHAMBER).amount < 2\
  87.                 and not self.already_pending(EVOLUTIONCHAMBER)\
  88.                 and self.units(ROACH).amount < 10:
  89.             await self.build(EVOLUTIONCHAMBER, near=rw.first)
  90.  
  91.     async def build_Roaches(self):
  92.         larvas = self.units(LARVA)
  93.         if self.supply_left > 1 and self.can_afford(ROACH) and larvas.exists \
  94.                 and not self.already_pending(ROACH):
  95.             await self.do(larvas.random.train(ROACH))
  96.  
  97.     async def defend_attack(self):
  98.         roaches = self.units(ROACH)
  99.         enemy_units = self.known_enemy_units
  100.         enemy_buildings = self.known_enemy_structures
  101.         if roaches.amount in range(1, 5):
  102.             for r in roaches.idle:
  103.                 if enemy_units.exists:
  104.                     await self.do(r.attack(enemy_units.closest_to(r.position)))
  105.         if roaches.amount > 15:
  106.             for r in roaches.idle:
  107.                 if enemy_units.exists:
  108.                     await self.do(r.attack(enemy_units.closest_to(r.position)))
  109.                 elif enemy_buildings.exists:
  110.                     await self.do(r.attack(enemy_buildings.closest_to(r.position)))
  111.                 else:
  112.                     await self.do(r.attack(self.enemy_start_locations[0]))
  113.  
  114.     async def one_one(self):
  115.         evochambers = self.units(EVOLUTIONCHAMBER)
  116.         if evochambers.exists and any(i is False for i in [self.flag2, self.flag1]):
  117.                 for evoc in evochambers.idle.noqueue:
  118.                     if self.can_afford(RESEARCH_ZERGMISSILEWEAPONSLEVEL1) and not self.flag1 \
  119.                             and evoc.is_ready:
  120.                         self.flag1 = True
  121.                         await self.do(evoc(RESEARCH_ZERGMISSILEWEAPONSLEVEL1))
  122.                     if self.can_afford(RESEARCH_ZERGGROUNDARMORLEVEL1) and not self.flag2 \
  123.                             and evoc.is_ready:
  124.                         self.flag2 = True
  125.                         await self.do(evoc(RESEARCH_ZERGGROUNDARMORLEVEL1))
  126.  
  127.  
  128. run_game(maps.get("AbyssalReefLE"), [
  129.         Bot(Race.Zerg, ZergRoach()),
  130.         Computer(Race.Zerg, Difficulty.Medium)
  131.     ], realtime=False)
Advertisement
Add Comment
Please, Sign In to add comment