Coder Social home page Coder Social logo

melodyromeromd / zerg-infestation-strategy Goto Github PK

View Code? Open in Web Editor NEW

This project forked from joelibaceta/zerg-infestation-strategy

0.0 1.0 0.0 1.53 MB

Los Zergs en un principio, eran controlados por una supermente, ahora trataremos de crear nuestra propia de versión artificial de esta, usando Python.

Python 100.00%

zerg-infestation-strategy's Introduction

En este ejemplo evita el conocido Zergling Rush poder disponer de una duración mas prolongada de la partida, presenciar algunas interesantes batallas y el efecto de los algoritmos

No se está usando alguna estrategia de aprendizaje por reforzamiento ya que el objetivo es tener una primera aproximación con el API de Starcraft II

Estrategia usada:

  1. Mantener un nivel optimo de obreros por Hatchery y todos correctamente distribuidos trabajanado.
  2. Mantener los Overlords en constante exploracion para tener una vision general del mapa.
  3. Dar la orden de atacar cada vez que se cumplan las siguientes condiciones:
  • Se cuenta con 50 Zerglins en espera
  • Se cuenta con varios Zerglings y 10 Hidraliscos en espera.
  1. Investigar el Boost Metabolic para mejorar el ataque de los Zerglings.
  2. Construir overlords cada vez que sea necesario.
  3. Desarrollar el arbol de tecnologias lo mas rapido posible para construir Zerglings.
  4. Desarrollar el arbol de tecnologias lo mas rapido posible para construir Hidraliscos.
  5. Construir expaciones eligiendo aleatoriamente algun lugar optimo para una base nueva.
  6. Construir una Reina (Queen) por cada base y usar la habilidad Inject Larva para mejorar la produccion de larvas.

¿Cómo Funciona?

Starcraft2 disponibiliza un API para poder interactuar y ejecutar acciones en el juego a travez de un bot, para este caso hice uno en particular para la raza Zerg (Mi favorita).

Para interactuar con el API de SC2 usando Python, debemos instalar el paquete sc2 y descargar algun mapa. (Incluyo uno en el repo).

Con esto ya podemos empezar a escribir algun script basico, el siguiente inicia el juego carga el bot el mapa y define un nombre para guardar el replay.

def main():
    sc2.run_game(sc2.maps.get("AutomatonLE"), [
        Bot(Race.Zerg, ZergInfestationStrategyBot()),
        Computer(Race.Terran, Difficulty.Hard)
    ], realtime=False, save_replay_as="ZvT.SC2Replay")

if __name__ == '__main__':
    main()

ZergInfestationStrategyBot es la clase que contiene la logica del Bot

Luego es necesario incluir en el loop del juego las ordenes que vamos a ir ejecutando.

class ZergInfestationStrategyBot(sc2.BotAI):
    async def on_step(self, iteration):
        # Ejecutar acciones en cada iteracion

Construir, distribuir trabajadores y producir recursos

build-and-work

Por ejemplo para construir y distribuir en posiciones de trabajo los Drones usamos el siguiente snippet

class ZergInfestationStrategyBot(sc2.BotAI):

    def __init__(self):
        self.extractors = 0
    
    async def on_step(self, iteration):
        await self.build_and_distribute_workers()
    
    async def build_and_distribute_workers(self):
        await self.distribute_workers()
        
        if self.hq.assigned_harvesters < self.hq.ideal_harvesters:
            if self.can_afford(DRONE) and self.larvae.amount > 0:
                await self.do(self.larvae.random.train(DRONE))

        if self.extractors == 0:
            drone = self.workers.random
            target = self.state.vespene_geyser.closest_to(drone.position)
            err = await self.do(drone.build(EXTRACTOR, target))
            if not err:
                self.extractors += 1

        if self.extractors < self.units(HATCHERY).amount and self.units(LAIR).ready.exists:
            if self.can_afford(EXTRACTOR) and self.workers.exists:
                drone = self.workers.random
                target = self.state.vespene_geyser.closest_to(drone.position)
                err = await self.do(drone.build(EXTRACTOR, target))
                if not err:
                    self.extractors += 1

Aqui le decimos al Bot que empiece distribuyendo los trabajadores, posteriormente valide si el numero de trabajadores es menor al optimo necesario en ese caso si hay larvas disponibles construir uno.

Adicionalmente se valida si el contador de extractores es 0 para construir el primero lo mas rapido posible y los siguientes poco antes de poder construir Hidraliscos para no penalizar los recursos tan pronto.

Se controla que el numero de extractores sea unicamente 1 por base.

zerg-infestation-strategy's People

Contributors

joelibaceta avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.