Git Product home page Git Product logo

battle-sim's Introduction

Contributors Issues Pull Request MIT License


Logo

Battle Sim

Software para simular batallas bélicas entre ejércitos. Proyecto que vincula conocimientos de Inteligencia Artificial, Simulación y Compilación.
Ver informe »
Descargar informe

Reportar Error · Solicitar Función

Tabla de contenidos
  1. Acerca del proyecto
  2. Primeros pasos
  3. Uso
  4. Contribuciones
  5. Licencia
  6. Desarrolladores

Acerca del proyecto

A lo largo de la historia, los conflictos bélicos han estado fuertemente ligados al desarrollo de la humanidad. Existen pruebas que desde la prehistoria, los hombres luchaban entre ellos por tierras y recursos naturales. Con el pasar del tiempo, los hombres fueron evolucionando, y así también lo hicieron los objetivos de los conflictos bélicos, los armamentos y estrategias utilizados en estos conflictos.

El objetivo de este proyecto es el desarrollo de un programa que permita la simulación de diferentes batallas que se hayan producido en un pasado distante, en épocas más recientes e incluso simular batallas futuristas o con elementos de fantasía. Además se podrían simular batallas entre diferentes épocas, por ejemplo podríamos enfrentar 300 soldados armados con las más modernas armas contra 1000 soldados armados con espadas y escudos.

Para esto se tienen pensado los siguientes aspectos que van a ser fijos en cada una de las simulaciones:

  • La existencia de un mapa o terreno donde ocurre el enfrentamiento.
  • Las acciones serán por turnos.

Se tiene la idea de poder implementar una opción para que el usuario pueda definir las reglas de la simulación a través del lenguaje de dominio específico, como por ejemplo: definir si las unidades serán destruidas cuando se acaben sus puntos de vida o serán baja al recibir un único impacto, si algunas en específico solo pueden ser destruidas por otras unidades que cumplen ciertas características, etc. Así mismo el usuario debe definir cuál es el objetivo de cada bando y poder elaborar una estrategia para cada uno. Cuando un bando consiga su objetivo se declara como ganador.

(volver arriba)

Construido con

(volver arriba)

Primeros pasos

Siga la guía de instalación para ejecutar el proyecto de forma local.

Prerequisitos

Es necesario tener Docker instalado en su ordenador, si usted no tiene Docker obedezca las siguientes instrucciones

Instalación

Ejecute los siguientes comandos en la consola:

  1. docker build -t battle_sim --rm .
  2. docker run -it --name compiler --rm battle_sim

(volver arriba)

Uso

Para ejecutar el compilador del lenguaje siga las instrucciones:

Compilar en un archivo .py

Para obtener el compilado a .py, ejecute python -m src <bs-path> --py=<py-path> --no-run, si py-path no es provisto, el archivo generado se salvará en el directorio de bs-path.

Para compilar y ejecutar el archivo

Ejecute la siguiente linea python -m src <bs-path>

(volver arriba)

Contribuciones

Si tienes alguna sugerencia de funcionalidades o reporte de errores, puedes ayudarnos revisando los issues del proyecto, si no se está trabajando en ello entonces abre un issue nuevo:

Estructura del repositorio

El repositorio tiene la siguiente estructura, sígala para contribuir:

battle-sim
|- doc
|  |_ (aquí la documentación)
|- src
|  |_ (aquí los códigos fuentes del proyecto)
|- test
|  |_ (aquí los casos de prueba)
|- LICENSE
|- README.md
|_

Política de Ramas

Se tendrán dos ramas principales:

  • main donde estará una versión estable del proyecto donde todas las componentes hayan pasado los casos de prueba.
  • dev donde se irán mezclando las ramas resultantes de nuevas funcionalidades, corrección de errores y ramas personales. Luego de que en esta rama todo funcione bien y pase los casos de prueba entonces se mezcla hacia main.

Respuesta a nuevas funcionalidades

Abre una nueva rama a partir de main con el siguiente nombre features/<funcionalidad> y ahí implementa la funcionalidad, realiza los casos de prueba y haz un pull request para revisar entre todos los cambios, para posteriormente aprobar los cambios.

Arreglo de errores

Abre una nueva rama con el siguiente nombre bug/<error>, corrige el error, corre los casos de prueba, y haz el pull request correspondiente. Para posteriormente mezclar.

Casos de prueba

Usted debe siempre que arregle un error o añada nuevas funcionalidades agregar casos de prueba utilizando la librería pytest y el plugin pytest-cov para verificar cuanto de su código está probando con sus casos de prueba. Antes de hacer un pull request todo su código debe pasar los casos de prueba con un coverage mayor a 90%, y no introducir que fallen los casos de prueba de otras funcionalidades.

Sus casos de prueba deben ir en la carpeta test. Para ejecutar los casos de pruba ejecute los comandos siguientes:

python -m pytest --cov

El primer comando ejecutará todos los comandos en la carpeta test y calculará el coverage de los casos de prueba.

(volver arriba)

Licencia

El siguiente proyecto está distribuido bajo MIT License. Ver LICENSE.txt para más información.

(volver arriba)

Desarrolladores


Rocio Ortiz Gancedo
🤔📝💻

Carlos Toledo Silva
💻🤔📝

Ariel Alfonso Triana Pérez
💻🤔📝

(volver arriba)

battle-sim's People

Contributors

atp-ariel avatar cts-crypto avatar rocioog00 avatar imgbotapp avatar

Stargazers

yzxu_hzau avatar PEP 8 Speaks avatar

Watchers

 avatar

battle-sim's Issues

[SOLICITUD] Definición de los objetos del mundo, funciones y propiedades

Solicitud de función

¿Está tu solicitud relacionada con un problema? Descríbelo

Es necesario poder crear instancias de los diferentes objetos del mundo, así como poder definir las propiedades y funciones de los mismos.

Describe la solución que te gustaría

Se tiene la idea de de tener la siguiente jerarquía de clases implícita dentro del lenguaje:

                                  Objeto
                                  /    \
                           Unidad    Estático

La clase Objeto será abstracta y la más general, esta se refiere a todos los objetos que pueden ser posicionados en el terreno. Estos objetos tendrán definidos propiedades como: id, vida, defensa, área que ocupan en el terreno (que esta siempre será rectangular), la posición (expresada por el vértice de la esquina superior izquierda y el vértice de la esquina inferior derecha) y el mundo al que pertenecen.

La clase Estático se refiere a objetos estructurales o bien a objetos de la naturaleza; estos no se mueven, ni atacan pero si pueden ser destruidos. No tienen características, ni funciones propias, solo las heredadas de Objeto. Esta clase será abstracta

La clase Unidad se refiere a los objetos controlables por los diferentes bandos que se enfrentarán para lograr sus respectivos objetivos. Además de las propiedades heredadas de Objeto, también tienen las siguientes propiedades: ataque, velocidad, alcance y área de impacto. Además tienen el método Mover(posición), tal que esta posición estará expresada según las posiciones de los vértices de las esquinas superior izquierda e inferior derecha; para que el movimiento sea válido la casillas recorridas desde la posición de origen a la de destino deben ser menores o igual que la velocidad de la unidad y se debe respetar que se mantenga el área de la unidad. Otro método que tienen las unidades es el de Atacar(posición); aquí posición será un par de enteros i,j que indicarán la posición donde se hará el ataque. Según el área de impacto, los objetos en esta recibirán daño según su cercanía al centro del impacto. Los cálculos de daño se realizarán teniendo en cuenta el ataque de la unidad que ataca y la defensa de la unidad que recibe el ataque; luego el daño se restará a la vidad de la unidad que recibió el ataque y si la vida de esta llega a cero la unidad se destruye. Para esto cada unidad tendrá un método RecibirDaño(daño). Esta clase será abstracta

Para definir una unidad, el usuario simplemente debe hacer que la unidad que vaya a definir herede de la clase Unidad y proporcione un constructor que inicialice los parámetros de la clase y en caso de desearlo le puede añadir nuevas propiedades y funciones (o redefinir las que ya están, aunque esto lo hace bajo a su responsabilidad). Mismo caso para crear objetos estáticos. La herencia hasta ahora se tiene pensada que sea simple, sin la utilización de interfaces ni nada que simule una multiherencia. Se le da la oportunidad al usuario que además defina tipos heredando de otros tipos que el haya definido.

[SOLICITUD] Implementar un parser LR

Solicitud de función

¿Está tu solicitud relacionada con un problema? Descríbelo

Necesidad de implementar un parser LR para parsear una secuencia de tokens, obteniendose un arbol de sintaxis abstracta.

Describe la solución que te gustaría

Implementar un generador de automata a partir de una gramatica dada, para luego obtener la tabla ActionGoTo. Luego implementar un parser que cargue la tabla y la use para parsear una cadena determinada.

Describe las alternativas que has considerado

Implementar las clases Item, ItemLR, y State que representan estos conceptos. Luego implementar la clase Automaton que construye un automata a partir de una gramatica representado mediante un conjunto de estados y las transiciones entre los mismos. Luego definir la clase TableActionGoTo que a partir construye dos tablas 'action' y 'go_to' y las guarda en json, a partir del automata construido a partir de una gramatica. Por ultimo implementar la clase Parser que carga dichas tablas y tiene una funcion que permite parsear la cadena utilizando las tablas y construye el AST correspondiente

[SOLICITUD] Representación y creación de mundos

Solicitud de función

¿Está tu solicitud relacionada con un problema? Descríbelo

Es necesario definir la representación y la creación de mapas. Definir como a través del lenguaje el usuario puede crear los terrenos donde va a simular.

Describe la solución que te gustaría

La representación del terreno debería ser una matriz de float donde la posición i, j represente la altura del terreno.

Me gustaría que el usuario pueda obtener un mapa aleatorio, definiendo restricciones del mismo como el porciento de alturas.

La sintaxis propuesta es:

world w = world(1000, 1000, high=0.3)

Esto debería generar un mapa que es una matriz de 1000x1000 donde el 30% del mismo deben ser porciones de tierra que esten sobre un nivel a definir (viene a ser la noción del nivel del mar).

Habría que explorar cómo generar los mundos utilizando IA. Se puede modelar utilizando Algoritmos genéticos, o Problemas de satisfacción de restricciones.

Describe las alternativas que has considerado

Otra de las alternativas en cuanto a la creación es que el usuario pueda introducir directamente el mundo. Él define una matriz de alturas y con eso crea el mundo. La sintaxis propuesta es:

world w = world(map=[[0, 0.3], [0.23, 0.27]])

Considero que es importante tener ambas opciones.

[SOLICITUD] Implementar un sistema de expresiones regulares

Solicitud de función

¿Está tu solicitud relacionada con un problema? Descríbelo

Se necesita un sistema de expresiones regulares para utilizar en el lexer del lenguaje, un sistema que evalúe rápidamente si una regex matchea con un string.

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.