ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI) INGENIERO EN INFORMÁTICA INTELIGENCIA DE PLATAFORMA PARA EL DESARROLLO DE JUEGOS POR COMPUTADOR Autor: Antonio Jesús Berbel Rodríguez-Campra Directores: Álvaro Arranz Domingo Manuel Alvar Miró Madrid Septiembre 2012 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Agradecimientos En primer lugar, agradecer la finalización de este proyecto a mi madre que, aunque ya sepa lo mucho que la aprecio, pero quiero que sirvan estas palabras para expresarle mi absoluta admiración y gratitud por el apoyo que me ha prestado a lo largo de lo que ha sido mi vida académica. A los profesores que me han impartido clase en las diferentes carreras que he cursado en esta Universidad ya no sólo por los conocimientos técnicos que me han enseñado sino por los valores humanos y profesionales que han sabido inculcarme. En especial quiero agradecer a Álvaro Sánchez Miralles, Álvaro Arranz Domingo y Manuel Alvar Miró por la oportunidad que me han brindado con la realización de este proyecto y por haber confiado siempre en mí. Y en último lugar pero no menos importante a mis compañeros de clase durante todos estos años en ICAI, en especial a Alberto Rodríguez Gómez y Alberto Gutierrez García porque sin ellos no hubiese sido lo mismo. Me voy feliz de poder contar con su amistad ahora y en tiempos venideros. I Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador INTELIGENCIA DE PLATAFORMA PARA EL DESARROLLO DE JUEGOS POR COMPUTADOR Autor: Berbel Rodríguez-Campra, Antonio Jesús. Directores: Arranz Domingo, Álvaro. Alvar Miró, Manuel. Entidad Colaboradora: ICAI – Universidad Pontificia Comillas. RESUMEN DEL PROYECTO El proyecto consiste en el modelado, desarrollo de un módulo para una Plataforma de juegos multijugador que sea capaz de interpretar los distintos elementos y reglas de los juegos que sean desarrollados para ésta y que pueda simular una partida entre varios jugadores y el desarrollo del juego de mesa Risk para esta plataforma. Para ello la aplicación es capaz de leer los ficheros donde se le indican las reglas del juego y la descripción de las entidades que participan en éste e interpretarlos para ser capaz de aplicarlas durante el desarrollo de una partida entre diferentes oponentes. 1 ESTADO DEL ARTE La idea de que las computadoras pudiesen jugar contra un contrincante humano existe desde la creación de éstas. Babbage, conocido como “El padre de la computación” [GuiV10], ya trató de programar su máquina analítica para que jugara al ajedrez pero debido a la falta de financiación nunca llegó a terminarla y solo consiguió terminar un diseño plenamente funcional. Los juegos en comparación con otras aplicaciones de inteligencia artificial no necesitan grandes cantidades de conocimiento por lo que en un primer momento se pensó que se podrían resolver por búsqueda exhaustiva en el árbol de juego. Considerando como ejemplo el ajedrez, la cantidad de movimientos que el ordenador debe evaluar, no solo lo suyos sino también los de su contrincante, genera un elevado coste computacional por lo que es necesario algún tipo de procedimiento de búsqueda heurística. En nuestro país, el ocio digital supera ampliamente al cine y la música juntos en ingresos. Según un estudio de la consultora Ibis Capital los videojuegos han logrado II Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador colocarse en todo el mundo prácticamente a la altura de toda la maquinaria global de Hollywood, juntando la recaudación en cines y ventas en DVD. Debido a este avance de la industria del ocio digital se ha visto una necesidad de desarrollar una aplicación sencilla para el usuario con la que pueda desarrollar sus propios juegos y poder compartirlos con otros jugadores. Actualmente existen diferentes herramientas que facilitan el desarrollo de juegos basados en motores gráficos ya desarrollados. Una de estas herramientas es UnrealEngine [UNRE12] implementado inicialmente para el shotter en primera personal Unreal. Fue desarrollado por la compañía EpicGames y es compatible en diversas plataformas como PC, Apple Macintosh y la mayoría de las consolas. Actualmente es considerada una de las herramientas para el desarrollo de juegos más potentes que existen en la actualidad. Este motor está orientado a juegos en primera persona y es de licencia propietaria por lo que limita mucho su uso para poder utilizarlo en juegos amateur. El motor Unity es otro motor para el desarrollo de videojuegos en 3D. Una de las mayores diferencias con respecto al motor Unreal es que puede utilizarse para el desarrollo de juegos por navegador y móviles ampliando enormemente el número de plataformas sobre el que puede utilizarse. Existe también un proyecto ideado por BarneyPell con el que pretendía crear un programa que sirviese para poder jugar diferentes juegos a partir de unas reglas que el programa interpretaría y aprendería a jugar [PELL92]. Aparte, la aplicación era capaz de generar automáticamente nuevas reglas en base a las aprendidas anteriormente creando un nuevo juego comprensible y jugable. El programa fue desarrollado en Prolog por lo que era muy útil para explorar y experimentar con Metajuegos pero insuficiente para escribir juegos de una mayor complejidad. En este proyecto se desarrollará una aplicación capaz de interpretar las reglas de un juego de mesa por turnos para partidas multijugador tanto con jugadores humanos como jugadores manejados por la máquina. Las reglas del juego se podrán modificar sin necesidad de recompilar todo el código desarrollado permitiendo la creación de nuevos juegos. III Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 3 DESARROLLO Análisis Durante la etapa del análisis de la aplicación, se estudió la forma de plantear las reglas del juego y entidades de éste.Esta primera etapa consistió en el modelado de la forma, estructura y reglas de los juegos de mesa en general. El objetivo era conseguir que el desarrollador se guiase por este modelo a la hora de crear juegos y que el módulo de Inteligencia Artificial pudiese leer esta información a partir de unos ficheros creados por los usuarios que contuviesen toda la información necesaria del juego de una forma sencilla e intuitiva. Otro factor importante era conseguir que la lectura de estos ficheros no implicase la recompilación de la aplicación. Se decidió utilizar el lenguaje XML y el lenguaje de script Python para escribir esta información ya que es un lenguaje sencillo de utilizar y no es necesario compilar el código para cada juego. Para recabar toda esta información en un único sitio se desarrolló el Kernel de la aplicación que sería el encargado de procesar todos estos datos y gestionar las diferentes llamadas a las funciones Python. El siguiente paso consistió en describir e implementar un juego de mesa utilizando XML. Se decidió usar el juego de mesa Risk ya que era un juego conocido por todos los participantes en el proyecto y muy extendido. Se desarrollaron los ficheros que contenían las entidades del juego que se dividieron en: Recursos, Unidades, Estructuras y Eventos. Para la información del juego se crearon dos ficheros XML: Estados del juego e Información del juego. A continuación se describieron las diferentes clases que formarían la lógica de objetos mediante un modelo lógico. Utilizando la herramienta de IBM SDP que permite convertir el Modelo lógico a clases en C++. Desarrollo Para el desarrollo del Kernelde la aplicación, uno de los elementos fundamentales, se crearon tres grandes bloques. El primer bloque, Lectura XML, se crearía el módulo encargado de leer los ficheros XML. En el segundo bloque se crearía el módulo Manejador de estados que sería el encargado de decidir el curso del juego para la Inteligencia de jugadores no humanos. Por último el tercer bloque sería el encargado de definir las funciones internas de la aplicación y ejecutar las funciones externas a la aplicación que tendrían acceso a las funciones internas. Durante la primera etapa se desarrolló el módulo de Lectura de los ficheros XML. Se eligió este lenguaje ya que se trata de un metalenguaje extensible de etiquetado muy útil IV Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador para el intercambio de información en aplicaciones estructuradas. Para conseguir esto se decidió utilizar la librería TinyXML[TINY12] ya que facilitaba su desarrollo. En la segunda etapa se desarrolló el Manejador de Estados. Su función es la de tener almacenada la información de los diferentes estados por los que puede transcurrir un juego y conocer los diferentes saltos de un estado a otro. A continuación se desarrollaron las funciones internas del juego. Su propósito es el de simplificar la comunicación entre las funciones externas desarrolladas por los usuarios de la plataforma y el núcleo de la aplicación. Para el desarrollo de las funciones externas se estudiaron varios lenguajes de script. Se decidió utilizar el lenguaje Python ya que se trata de un lenguaje de alto nivel que utiliza una sintaxis limpia y legible. A parte, soporta la orientación a objetos, herencia múltiple, polimorfismo y es un lenguaje multiplataforma. Para la comunicación entre la aplicación desarrollada en C++ y las funciones externas se utilizó la librería boost [ BOOS12]. Por último se desarrolló el juego de mesa Risk para comprobar el buen funcionamiento del motor. Se definieron las reglas y los diferentes elementos que participaban en el juego y se realizaron pruebas utilizando este juego para comprobar satisfactoriamente el buen funcionamiento del motor desarrollado. 4 REFERENCIAS [PELL92] [GUIJ10] [TINY12] [BOOS12] [UNRE12] Barney Pell. University of Cambridge. METAGAME: A New Challenge for Games and Learning. Victor Guijarro. La quimera del autómata matemático: del calculador medieval a la máquina analítica de Babbage. http://www.grinninglizard.com/tinyxml/ http://www.boost.org/ http://www.unrealengine.com/ V Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador INTELLIGENCE PLATFORM COMPUTER GAMES FOR THE DEVELOPMENT OF Author: Berbel Rodríguez-Campra, Antonio Jesús. Supervisors: Arranz Domingo, Álvaro. Alvar Miró, Manuel. Affiliation: ICAI – Universidad Pontificia Comillas. ABSTRACT The goal of this project is developing a module for a multiplayer gaming platform to be able to interpret the different elements and rules of the games that are developed for this and you can simulate a game between multiple players. This application should be able to read the files where you indicate the game and the description of the entities involved in this and interprets them to be able to apply during the course of a game between different opponents. 1 INTRODUCTION Artificial Intelligence According to Stuart Russell enunciated in 1995, "Artificial Intelligence is the discipline that deals with the creation of computer programs that simulate the action and human thought and rational behavior." To better explain the above definition on Artificial Intelligence, understood to mean an agent capable of receiving information about the surrounding environment, process it and act on that environment tend to maximize the expected result. There are different kinds of knowledge and means of representation of such knowledge, which can be loaded into the agent designer or artificial intelligence, it can be learned by using learning techniques. Artificial Intelligence is applicable in different fields such as economics, medicine, engineering and a variety of software applications. Lately he has taken a considerable weight the use of artificial intelligence in virtual worlds that simulate a world or artificial environment inspired or not in reality, in which users can interact with characters or avatars VI Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 2 STATE OF THE ART The idea that computers could play against a human opponent has existed since the creation thereof. Babbage, known as the "Father of computing" [GUIJ10], tried to set his analytical engine to play chess but due to lack of funding never finish it and only managed to complete a fully functional design. The games compared to other artificial intelligence applications do not need large amounts of knowledge so that at first it was thought that could be solved by exhaustive search in the game tree. Considering the example of chess, the number of movements that the computer must evaluate not only what his own but those of his opponent, resulting in a high computational cost that is necessary for some form of heuristic search procedure. In our country, the digital entertainment exceeds the movies and music together in revenues. According to a study by consultancy Capital Ibis video games have been placed in virtually every one at the height of the entire global machinery of Hollywood, joining the collection in cinemas and DVD sales. Due to the advancement of digital entertainment industry has seen a need to develop a user-friendly application with which to develop their own games and to share them with other players. Currently there are different tools that facilitate the development of games based on graphics engines already developed. One such tool is Unreal Engine [UNRE12] Shotter initially implemented for the first Unreal staff. It was developed by Epic Games and it is compatible on various platforms like PC, Apple Macintosh and most consoles. He is currently considered one of the tools for game development more powerful than currently exist. This engine is aimed at first-person games is proprietary license and therefore limits their use to use in amateur games. There is also a project designed by Barney Pell to pre-create a program that would serve to play different games from the program rules that interpret and learn to play [PELL92]. Besides, the application was able to automatically generate new rules based on previously learned by creating a new game understandable and playable. The program was developed in Prolog so it was very useful to explore and experiment with metagames but not enough to write more complex games. VII Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador This project will develop an application capable of interpreting the rules of a board game for multiplayer turn-based human players as both players managed by the machine. The game rules can be modified without recompiling all the code developed allowing the creation of new games. 3 DEVELOPMENT Analysis During the stage of application development, we studied how to approach the game and entities thereof. The aim was to make the AI module could read this information from some files created by users all necessary information contais the game in a simple and intuitive. Another important factor was to make the reading of these files did not involve recompiling the application. We decided to use XML to write this information because a language is easy to use and is not necessary to compile the code for each game. The next step was to describe a board game using XML. It was decided to use the board game Risk as it was a game known by all project participants and widespread. Files were developed that contained the bodies of the game that were divided into: resources, units, structures and events. For game information created two XML files: State of play and game information. Below are described the different classes of objects form logic by a logic model. Using the IBMSDPtool for converting the logical model classes in C++. Development For application development, created three large blocks. The first block, reading XML, you create the module responsible for reading XML files. In the second block Manager Module creates the states would be responsible for deciding the course of the game for players nonhuman intelligence. Finally the third group would be responsible for defining the internal functions of the application and execute external functions to the application that have access to internal functions. During the first stage was developed in the form of reading XML files. Language VIII Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador was chosen because it is an extensible meta tagging useful for exchanging structured information in applications. To achieve this we decided to use the TinyXML library[TINY12] and facilitating their development. In the second step developed Handler States. Its function is to have stored he information of the different states through which it can take a game and know the different jumps from one state to another. Then we developed internal functions of the game. Its purpose is to simplify communication between the external functions developed by the users of the platform and the application core. For the development of the internal functions were studied several scripting languages. We decided to use the Python language as it is a high-level language that uses a clean and readable syntax. Besides, it supports object-orientation, multiple inheritance, polymorphism, and is a multiplatform language. For communication between the application developed in C++ and external functions are used the boost library [BOOS12]. 4 REFERENCES [PELL92] [GUIJ10] [TINY12] [BOOS12] [UNRE12] Barney Pell. University of Cambridge. METAGAME: A New Challenge for Games and Learning. Victor Guijarro. La quimera del autómata matemático: del calculador medieval a la máquina analítica de Babbage. http://www.grinninglizard.com/tinyxml/ http://www.boost.org/ http://www.unrealengine.com/ IX Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Índice de la memoria 1. Introducción .....................................................................................................................1 1.1 Introducción .............................................................................................................. 2 1.2 Estado del Arte .......................................................................................................... 3 2. Alcance del Proyecto ......................................................................................................15 2.1 Motivación .............................................................................................................. 16 2.2 Objetivos ................................................................................................................. 17 3. Tecnologías.....................................................................................................................19 3.1 C++ .......................................................................................................................... 20 3.2 XML ......................................................................................................................... 21 3.3 Python ..................................................................................................................... 23 4. Arquitectura ...................................................................................................................29 4.1 Arquitectura del Sistema ......................................................................................... 30 4.2 Módulo: Información del Juego ............................................................................... 33 4.3 Módulo: Reglas del Juego ........................................................................................ 35 4.4 Módulo: Kernel ........................................................................................................ 37 5. Diseño del Sistema .........................................................................................................41 5.1 Introducción ............................................................................................................ 42 5.2 Diagrama de Secuencia ............................................................................................ 43 5.3 Diagrama de Flujo.................................................................................................... 45 5.4 Diagrama de Clases.................................................................................................. 46 6. Risk .................................................................................................................................51 6.1 Introducción ............................................................................................................ 52 6.2 Elementos del Juego ................................................................................................ 53 6.3 Diseño del Risk ........................................................................................................ 61 7. Planificación ...................................................................................................................65 8. Estudio Económico .........................................................................................................69 X Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 9. Conclusiones y trabajos futuros......................................................................................75 9.1 Conclusiones ........................................................................................................... 76 9.2 Trabajos Futuros ...................................................................................................... 78 10. Bibliografía .....................................................................................................................79 Anexo 1Manual de Instalación ...............................................................................................81 Anexo 2Manual de Usuario ....................................................................................................87 Anexo 3Manual de Desarrollador......................................................................................... 101 XI Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1. Introducción Escuela Técnica Superior de Ingeniería (ICAI) Página 1 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.1 Introducción El proyecto planteado busca proporcionar una solución a la dificultad siempre latente del desarrollo rápido y sencillo de juegos para ordenador. El sistema que se ha desarrollado es capaz de interpretar la información y las reglas de un juego de mesa por turnos desarrollado en un lenguaje de programación de escasa dificultad para poder simular una partida entre varios jugadores. El usuario será por tanto capaz de desarrollar un juego sin llegar a necesitar unos conocimientos elevados de programación y podrá compartirlo con otros usuarios que hagan uso de esta herramienta. También podrá modificar juegos desarrollados por terceros sin necesidad de conocer el funcionamiento interno del sistema de una forma sencilla y escalable. Gracias a la solidez de su arquitectura, se deja abierta la posibilidad de que el sistema sea capaz de simular partidas entre múltiples jugadores por lo que pueda definirse como una aplicación interactiva y de fácil manejo. Para las pruebas realizadas a la herramienta se han desarrollado las reglas del juego de mesa “Risk” debido a su popularidad. Escuela Técnica Superior de Ingeniería (ICAI) Página 2 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2 Estado del Arte Un videojuego es un software desarrollado para el entretenimiento en general que está basado en la interacción entre una o varias personas y una máquina que ejecutará dicho juego. Este dispositivo puede ser una computadora, una videoconsola o incluso un teléfono móvil. Los primeros videojuegos informáticos hacían uso de un teclado para interactuar con la computadora. Los videojuegos modernos permiten utilizar tanto el teclado como el ratón de forma simultánea. En muchas ocasiones, los videojuegos recrean entornos o mundos virtuales en los que el jugador es capaz de controlar uno o más personajes que interactúen con dicho entorno para conseguir los objetivos marcados por el creador de juego respetando una serie de reglas predeterminadas y conocidas. Durante una partida, la interacción puede producirse entre una persona y una máquina o entre dos o más personas que jueguen en la misma computadora o a través de una red LAN o Internet compitiendo contra la máquina, con ella o entre ellos mismos. 1.2.1 Historia de los videojuegos La industria de los videojuegos surgió con bastante fuerza en Estados Unidos, Europa y Australia con la salida al mercado de Pong a principios de la década de los 70 y se extendió rápidamente por todo el mundo. Este videojuego fue publicado por Atari y fue creado por NolanBushnell. Estaba basado en el deporte de tenis de mesa (ping pong). Fue desarrollado en dos dimensiones y consistía en que el jugador controlaba una paleta moviéndola verticalmente en la parte izquierda de la pantalla. Podía competir contra la misma computadora o contra otro jugador humano que controlase una segunda paleta en la parte opuesta. El objetivo consistía en que uno de los jugadores consiguiese más puntos que el oponente al finalizar el juego. Escuela Técnica Superior de Ingeniería (ICAI) Página 3 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Pese a que existieron con anterioridad otros videojuegos como OXO o el Spacewar!, Pong está considerado como el más importante de entre la primera generación de videojuegos modernos debido a que fue el primero en comercializarse a nivel masivo y no ejecutarse en máquinas únicas. Tras alcanzar un crecimiento espectacular, la industria japonesa comenzó a perfeccionar y desarrollar la tecnología del videojuego introduciendo juegos tan conocidos como el Super Mario Bros de NintendoCompany Ltd. Durante la década de los 90, Nintendo y Sega realizaron importantes esfuerzos por controlar y afianzar el mercado del videojuego. Durante esta época comenzaron a surgir las críticas por el aumento de la violencia y la introducción de temas para adultos en juegos infantiles. Los videojuegos han tenido en ocasiones mala imagen en la sociedad originada en muchas ocasiones por opiniones vertidas por los medios de comunicación aunque últimamente este tipo de opiniones han ido mejorando. Según un estudio un niño actualmente desarrolla habilidades mentales y su capacidad de razonamiento es más activa en comparación con un niño de hace 20 años que no contaba con esta tecnología. Por el contrario, la falta de socialización y algunos aspectos de su desarrollo motriz pueden verse influenciados negativamente debido a las nuevas tecnologías. En cambio, para los adultos los videojuegos han resultado ser un liberador de estrés. 1.2.2 Industria de los videojuegos Es el sector económico involucrado en el desarrollo, distribución, mercadotecnia y la venta de videojuegos y hardware asociado a éstos. Actualmente engloba a docenas de disciplinas de trabajo y emplea a miles de personas alrededor del mundo. Actualmente, la industria de videojuegos ha experimentado unas altas tasas de crecimiento debido al desarrollo de la computación, a la mejora en la capacidad de procesamiento de imágenes más reales y a la cada vez más estrecha relación entre películas de cine y los videojuegos. Los videojuegos han pasado a generar más dinero que el cine y la música juntos, como es el caso de España. Solo el ocio digital acapara el 53 por ciento de las ventas de entretenimiento en los Escuela Técnica Superior de Ingeniería (ICAI) Página 4 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador hogares españoles dejando el resto a la música, el cine y el DVD. Esta industria generó 57.600 millones de euros durante 2009 en todo el mundo. Ibis Capital calcula que actualmente la media de desarrollo por juegos se mueve entre los 7,4 y los 9,7 millones de euros, por lo que destaca la importancia de apostar por las franquicias consolidadas. Mario sigue a la cabeza del „ranking‟ de sagas más vendidas, seguido por Pokémon, Tetris, Los Sims, NeedforSpeed y Final Fantasy. Nintendo, EA, SquareEnix y TakeTwo son las compañías más populares. Otra tendencia que destaca dicho estudio es la importancia que han ganado los juegos online y para móviles que representan el 32 por ciento de los ingresos totales de la industria. Los principales “culpables” de esta tendencia son Wii con su éxito entre los jugadores casuales y su servicio WiiWare, Apple Store para iPhone y el juego online World of Warcraft de la compañía Blizzard. Según Ibis Capital, en el mercado de las consolas de sobremesa Nintendo acapara el 47% de la cuota con la Wii, Xbox 360 posee un 35% y la PlayStation 3 un 18%. Figura 2 – Wii, Xbox 360 y PS3 1.2.3 Videojuegos para PC El mercado de videojuegos para computadoras personales ha ido en descenso desplazado por las consolas. Este tipo de plataforma fue más popular en los noventa con la aparición del CD-ROM. Actualmente, el sector de los videojuegos de PC se mantiene principalmente por las siguientes razones: Mayor versatilidad: Existen a disposición de los jugadores lo necesario para la creación de nuevos mapas e incluso han surgido las nuevas comunidades Escuela Técnica Superior de Ingeniería (ICAI) Página 5 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador denominadas “moders” que consisten en extensiones para el juego original que proporciona nuevas aventuras, ambientaciones, personajes, objetos, etc. Comodidad: Algunos juegos resultan incómodos jugarlos utilizando un joystick o mando de consola como los juegos de estrategia en tiempo real. Flexibilidad del hardware: Al poder incluir en el PC tarjetas de video de distinta potencia en función a la capacidad económica del usuario o al rendimiento que se desea se obtienen mayores resultados en calidad gráfica y de procesamiento que las limitadas a consolas. 1.2.4 Videojuegos e Internet Las grandes oportunidades de crecimiento de la industria del videojuego vienen de Internet, tanto para las computadoras personales como para las consolas. Grandes empresas como ElectronicArts o Nintendo han firmado convenios con America Online (AOL) para proveer juegos en línea y entretenimiento interactivo para los suscriptores de AOL. En la actualidad, World of Warcraft desarrollado por BlizzardEntertainment es el juego multijugador en línea con más suscriptores, 12 millones mensuales1. En 2010 se estimó que este juego mantenía el 67% del mercado multijugador masivo en línea (MMOG). 1 http://www.vadejuegos.com/noticias/2010/10/07/mas-de-12-millones-de-suscriptores-para-world-ofwarcraft-153446.html Escuela Técnica Superior de Ingeniería (ICAI) Página 6 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2.5 Motores de videojuego Un motor de videojuego son una serie de rutinas de programación que permiten el diseño, la creación y presentación de un videojuego. La funcionalidad básica de un motor es de proveer al juego de un motor de renderizado para gráficos 2D y 3D, un motor físico para la detección de colisiones, sonidos, una inteligencia artificial para el control del entorno, una administración de memoria y la gestión de partidas online ya sean LAN o a través de Internet. 1.2.5.1 UnrealEngine El UnrealEngine es un motor de videojuego de PC y consolas desarrollado por la compañía EpicGames. Fue uno de los motores más conocidos para shooters en primera persona como el UnrealTournament, Gears of Wars o Batman: ArkhamAsylum. Figura 3 – UnrealEngine También ha sido utilizado en otros géneros como el rol y de perspectiva en tercera persona. Está implementado en C++ y es compatible con varias plataformas como PC (Windows y GNU/Linux), Apple Macintosh y la mayoría de las consolas. Su última versión apareció en 2006 y fue diseñado para PC, Xbox 360 y PlayStation 3. El motor soporta técnicas avanzadas como HDRR, normal mapping y sombras dinámicas. Permite la renderización de un número elevado de objetos simultáneos, físicas más realistas para efectos del agua, IA mejorada y efectos de luces y sombras con rutinas más avanzadas. Escuela Técnica Superior de Ingeniería (ICAI) Página 7 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Debido a su política de licencias, consiguió numerosos contratos con Atari, Activision, Ubisoft, Sega, ElectronicArts, entre otras. Según la popular revista IGN el motor Unreal fue considerado uno de los mejores motores para videojuegos en 2009. Sus principales ventajas son su gran eficiencia pudiendo funcionar en ordenadores tanto de gama alta como del gama bajamedia sin reducir considerablemente sus prestaciones ysu estandarización y aceptación dentro de la industria de los videojuegos. Por desgracia, para poder utilizar este motor es necesario tener unos conocimientos de programación altos para poder desarrollar videojuegos aceptables. Otro de sus puntos débiles que comparte con la gran mayoría de motores existentes es que una vez generado el videojuego es imposible por parte del usuario modificarlo. 1.2.5.2 UnityEngine Unity es una herramienta para la creación de videojuegos en 3D y otros tipos de contenidos interactivos tales como visualizaciones arquitectónicas o animaciones en tiempo real en 3D. elUnityEngien es compatible con diferentes plataformas tales como Windows, Mac, Xbox 360, Play Station 3, Wii, iPhone y Android. También permite el desarrollo de videojuegos de navegador web utilizando el plugin para navegadores de Unity. Permite la exportación de videojuegos a formato Flash pero ciertas funcionalidades soportadas por el pluginUnity no pueden ser utilizadas en Flash debido a sus limitaciones. El motor de videojuegos Unity es utilizado por más de 500,000 desarrolladores. Figura 4 – UnityEngine Unity consiste tanto en un editor para el desarrollo y diseño de contenidos como en un motor de videojuegos para el producto final. Una de sus principales ventajas su portabilidad a plataformas como videoconsojas o móviles iPhone y Android aunque esta Escuela Técnica Superior de Ingeniería (ICAI) Página 8 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador posibilidad requiere de una licencia adicional. Otra de sus ventajas es que para su desarrollo se permite el uso del lenguaje script UnityScript, C# o Boo (insipirado en la sintaxis de Python), lenguajes de alto nivel sencillos de utilizar. Pese a esto, el usuario final no podrá modificar los videojuegos que haya adquirido para este motor siendo ésta una de sus mayores desventajas. Escuela Técnica Superior de Ingeniería (ICAI) Página 9 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2.6 TheMetaGameProject Pensado por BarneyPell, la idea que sugería era crear un programa que sirviese para poder jugar diferentes juegos. A partir de unas reglas de juego, el programa las interpretaba y aprendía a jugar dicho juego. Propuso una clase que llamó “symmetricchess-likegames” (simetría de juegos parecidos al ajedrez) y desarrolló el programa MetagameWorkbench para poder trabajar sobre ellos. Este programa podía interpretar reglas de este tipo de juegos y generar juegos aleatorios nuevos. La idea de este programa era crear juegos de este tipo que pudiesen ser comprensibles y jugables. Para ello, al generar las reglas el programa, las traducía a un lenguaje más simple “GameDescriptionLanguage in theMetagameWorkbench”. El programa está escrito en Prolog. Este lenguaje lo hace útil para metajuegos sencillos pero no de alto nivel. Figura5 – Diagrama de flujo “theMetagame Project” Escuela Técnica Superior de Ingeniería (ICAI) Página 10 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2.7 Lenguajes Script Un lenguaje interpretado es un lenguaje de programación diseñado para ser ejecutado mediante un intérprete, a diferencia de los lenguajes compilados. Muchos lenguajes han sido implementados usando tanto compiladores como intérpretes, como por ejemplo Lisp, Pascal o Python. Inicialmente, los lenguajes interpretados eran compilados línea a línea, es decir, cada línea era compilada a medida q iba a ser ejecutada. El problema de esta técnica era que si se iba a ejecutar un loop, las líneas dentro de éste tenían que ser recompiladas repetidamente. Actualmente, la mayoría de los lenguajes interpretados utilizan una representación intermedia que combina tanto la compilación como la interpretación. El compilador puede producir una interpretación intermedia como el bytecode que será ejecutado por un intérprete de bytecode. Las ventajas de un lenguaje script o interpretado es que ofrecen una flexibilidad adicional frente a los lenguajes compilados. Algunas características más sencillas de implementar sobre intérpretes son: Independencia de la plataforma. Tipos de datos dinámicos. Mayor facilidad en la depuración. Gestión de la memoria automática. Por el contrario, la mayor desventaja de los lenguajes script radica en que es menos eficiente su ejecución. El motivo es que cada instrucción debe de pasar por una interpretación en tiempo de ejecución por lo que es menos eficiente en tiempo. La máquina virtual es una solución parcial a este problema ya que realiza una definición a un lenguaje intermedio que es más cercano al lenguaje de máquina y su traducción es más sencilla en tiempo de ejecución. Otra desventaja remarcable es la necesidad de tener un intérprete en la máquina donde se vaya a ejecutar la aplicación. Escuela Técnica Superior de Ingeniería (ICAI) Página 11 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2.7.1 Basic4GL Es un lenguaje de programación interpretado gratuito para Microsoft Windows con soporte para la librería gráfica OpenGL. Fue diseñado para que fuese sencillo su aprendizaje y sencillo de utilizar para el desarrollo de aplicaciones en 3D como juegos, demos y otro tipo de utilidades sin todos los problemas de configuración asociados con la mayoría de lenguajes compilados. Sus principales ventajas son: Herramienta gratuita y de fácil aprendizaje. Entorno para el aprendizaje de OpenGL y los conceptos básicos de gráficos en 3D. Útil para el desarrollo de juegos sencillos o pequeñas demostraciones gráficas. Su principal desventaja es que, al ser tan sencillo no ofrece todo el potencial de OpenGL limitando demasiado su uso. 1.2.7.2 Perl Es un lenguaje de programación diseñado por Larry Wall en 1987. Toma características del lenguaje C, Shell y Lisp. Fue originalmente desarrollado para la manipulación de texto pero ahora se utiliza para la administración de sistemas, desarrollo web, desarrollo GUI y otras utilidades. Es sencillo de utilizar y tiene soporte para programación estructurada y orientada a objetos. Figura 6 – Logo Perl En un estudio realizado por “ComputerLanguageShootoutBenchmarks” se comparó su funcionamiento con otros lenguajes interpretados y compilados. La conclusión fue que utiliza más memoria que las implementaciones de otros lenguajes afectando a la velocidad de ejecución. Escuela Técnica Superior de Ingeniería (ICAI) Página 12 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2.7.3 Python Es un lenguaje de programación muy expresivo, es decir, los programas Python son muy compactos: suele ser bastante corto en comparación con otros lenguajes de programación de alto nivel. Su sintaxis es muy legible, mucho más sencilla que la de otros lenguajes. A parte, posee un rico juego de estructuras de datos que pueden manipularse de una forma sencilla e intuitiva para el desarrollador. 1.2.7.4 Ruby Es un lenguaje de programación interpretado, reflexivo y orientado a objetos creado por el programador japonés YukihiroMatsumoto que lo presentó públicamente en 1995. Su sintaxis está inspirada en Python y Perl. Según su propio creador “Ruby es simple en apariencia, pero complejo por dentro, como el cuerpo humano”. Su principal objetivo es desarrollar un lenguaje natural, no simple. Figura 7 – Logo Ruby Se trata de un lenguaje flexible ya que permite al desarrollador alterarlo libremente. Las partes esenciales de Ruby pueden ser eliminadas o redefinidas. Se puede agregar funcionalidad a partes ya existentes permitiendo no restringir al desarrollador. 1.2.7.5 VBScript Visual Basic Script Edition es un lenguaje interpretado por el Windows Scripting Host de Microsoft. Su sintaxis es una variación de lenguaje de programación Visual Basic. Es parte fundamental de la ejecución de aplicaciones de servidor programadas en ASP (Active Server Pages). Solo puede ser utilizado en la plataforma Microsoft Windows. Escuela Técnica Superior de Ingeniería (ICAI) Página 13 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 1.2.7.6 NWNScript Es un lenguaje interpretado utilizado en el videojuego NeverwinterNights y NeverwinterNights 2. Su principal función es la de permitir a un desarrollador crear nuevos mods para estos juegos aumentando su historia, criaturas, objetos, etc. Escuela Técnica Superior de Ingeniería (ICAI) Página 14 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 2. Alcance del Proyecto Escuela Técnica Superior de Ingeniería (ICAI) Página 15 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 2.1 Motivación El desarrollo de juegos para ordenador ha planteado desde siempre pero ahora más que nunca debido a las nuevas tecnologías una dificultad muy elevada para los desarrolladores noveles y con poca o ninguna experiencia en este campo. Cada vez más, los desarrollos de juegos no realizan una diferenciación entre la lógica o comportamiento de un juego de su visualización final debido a la complejidad que esto conlleva y a que no suele reutilizarse el código para nuevos desarrollos. Este proyecto busca desarrollar una aplicación que facilite el desarrollo de juegos para usuarios con ciertos conocimientos de programación. Para ello será necesario separar y definir bien la lógica del juego de la interfaz de éste abstrayendo al desarrollador del funcionamiento interno de la aplicación y dándole libertad total a la hora de definir las reglas del juego y los elementos que forman parte de él sin estar condicionado por la herramienta. Gracias a este aspecto se permitirá la reutilización de código ya que al haber realizado una separación bien definida de la lógica del juego, un desarrollador podrá modificar las reglas de un juego desarrollado anteriormente por él mismo o por un tercero y los elementos que participan en éste creando una nueva versión y, por lo tanto, ofreciendo al usuario final una nueva experiencia. Se ha conseguido desarrollar un motor de videojuego totalmente interpretado abriendo la posibilidad de alterar el juego por parte del usuario final. Debido a las limitaciones de tiempo propias de un Proyecto Fin de Carrera se ha desarrollado solo para juegos de estrategia por turnos. A diferencia de los motores de videojuegos nombrados en el apartado 1.2.5, este motor sólo se ha enfocado a la parte lógica de un videojuego dejando para un posible futuro su versión gráfica. Escuela Técnica Superior de Ingeniería (ICAI) Página 16 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 2.2 Objetivos El objetivo es desarrollar un marco de programación en el que, mediante un lenguaje de script y XML, se pueda expresar la lógica de un juego de mesa por turnos para su interpretación en tiempo de ejecución. Se deberá desarrollar tanto la interfaz con el lenguaje de script como el propio intérprete. Para alcanzar este objetivo es necesario marcar una serie de objetivos más específicos: Desarrollo y diseño de un modelo general de la lógica de los juegos de mesa por turnos para su interpretación. Desarrollo conceptual de la interfaz entre el intérprete y el código script. Elección de un lenguaje script a utilizar. Diseño y desarrollo del intérprete. Ejecución por parte del intérprete del desarrollo script. Implementación de un juego real: Para la realización de las pruebas de la aplicación se han desarrollado las reglas del Risk y se han definido los elementos que participan en dicho juego. Se deberán tener en cuenta las siguientes características: Juegos multijugador: La aplicación (kernel) tiene que ser capaz de de permitir partidas de uno o más jugadores dependiendo de las propiedades del juego. Sencillo de utilizar: La aplicación (kernel) tiene que ser sencilla e intuitiva separando bien los diferentes elementos del juego y las reglas de éste. Escuela Técnica Superior de Ingeniería (ICAI) Página 17 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 18 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 3. Tecnologías Escuela Técnica Superior de Ingeniería (ICAI) Página 19 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 3.1 C++ C++ es un lenguaje de programación diseñado a mediados de los años ochenta por BjarneStroustrup. Su intención era la de extender el exitoso lenguaje de programación C con mecanismo que permitiesen el manejo de objetos. Posteriormente se añadieron otros dos paradigmas que ya estaban admitidos: programación estructurada y programación orientada a objetos. Por este motivo, C++ es considerado un lenguaje de programación multiparadigma. 2 Actualmente existe un estándar para este lenguaje, denominado ISO C++, al que se adhirieron la mayoría de los desarrolladores de compiladores de este lenguaje. Otra particularidad de este lenguaje es la posibilidad de redefinir los operadores, o comúnmente denominado “sobrecarga de operadores” que nos permite utilizar los operadores básicos con las clases desarrolladas. 2 http://es.wikipedia.org, http://www.cplusplus.com Escuela Técnica Superior de Ingeniería (ICAI) Página 20 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 3.2 XML Extensible MarkupLanguage (XML) es un metalenguaje extensible de etiquetado desarrollado por el World Wide Web Consortium (W3C). Consiste en una simplificación y adaptación del lenguaje GML (GeneralizedMarkupLanguage) desarrollado por IBM en los años setenta que surgió por la necesidad de dicha empresa para almacenar grandes volúmenes de información. XML permite definir la gramática de lenguajes específicos. XML no es considerado un lenguaje de programación sino que es una herramienta para definir lenguajes específicos para diferentes necesidades. Este lenguaje no nació únicamente para su aplicación en Internet sino que se propuso como un estándar para el intercambio de información de una manera estructurada entre diferentes plataformas. Una de las ventajas más remarcable de este metalenguaje es su extensibilidad. Después del desarrollo y puesto en producción, es posible extender XML con la adición de nuevas etiquetas sin verse afectado el código anterior. Por lo tanto, si un tercero decide utilizar el documento XML, podrá comprenderlo gracias a su desarrollo estructurado. Como se ha comentado anteriormente, XML es un metalenguaje basado en el etiquetado. Dichas etiquetas consisten en marcas en el documento que señalan una porción de éste como un elemento. Las etiquetas son definidas como “<nombre>” donde “nombre” es el identificador del elemento marcado. A continuación se muestra un pequeño ejemplo para comprender la estructura de un documento XML: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE Edit_Mensaje SYSTEM "Edit_Mensaje.dtd"> <Ficha> </Ficha> <Nombre>Antonio</Nombre> <Apellido>Rodríguez</Apellido> <Estudios>Ingeniería</Estudios> Escuela Técnica Superior de Ingeniería (ICAI) Página 21 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Los documentos XML bien formados (“wellformed”) son aquellos que cumplen las definiciones básicas de formato. Esto es útil ya que si un documento está bien formado podrá ser interpretado por cualquier analizador sintáctico que cumpla con la norma. Estructura jerárquica: El modelo de etiquetado del documento tiene que seguir una estructura estrictamente jerárquica, es decir, las etiquetas tiene que estar correctamente anidadas y cualquier elemento con contenido tiene que estar cerrado. Solo puede existir un elemento raíz en todo el documento. Es necesario asignar nombres a todos los elementos presentes en el documento XML. Uno de los principales motivos por el que se ha elegido este lenguaje para el almacenamiento de la información del juego ha sido su estructura jerárquica que permite la creación de elementos con diferentes atributos y propiedades. A parte, puesto que todos los elementos tienen que tener asignado un nombre se evita la inclusión de información incompleta por parte del usuario. 3.2.1 TinyXML TinyXML es una librería para analizar código XML para el lenguaje C++. Es un producto de código abierto y gratuito distribuido bajo la licencia zlib/libpng. Analiza y procesa el código XML en un árbol DOM (Documento ObjectModel) y es capaz tanto de leer código XML como de generarlo. Cada una de las etiquetas del documento XML son consideradas por la librería TinyXML como nodos (TiXmlNode) dentro de un árbol en el que cada etiqueta incluida dentro de otra forma parte de un nodo hijo y nodo padre respectivamente. Se ha decidido utilizar esta librería ya que es un producto gratuito bajo licencia zlib/libpng y es una librería sencilla de utilizar. Escuela Técnica Superior de Ingeniería (ICAI) Página 22 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 3.3 PYTHON Python es un lenguaje de programación de alto nivel interpretado creado a finales de los ochenta por Guido van Rossum en el NationalResearchInstituteforMathematics and ComputerScience (CWI), en los Países Bajos. Su idea original era ser el sucesor del lenguaje de programación ABC, capaz de manejar excepciones e interactuar con el sistema operativo Amoeba. Figura 1 – Logotipo de Python La filosofía de este lenguaje es la de hacer hincapié en una sintaxis muy limpia favoreciendo un código legible. Python es un lenguaje de programación multiparadigma, es decir, en vez de adoptar un estilo particular de programación permite utilizar una filosofía orientada a objetos, imperativa o funcional. Otra característica importante es la resolución dinámica de nombres. Lo que enlaza a un método o un nombre de variable durante la ejecución de un programa se resuelve de forma dinámica. En Python todo es un objeto, incluidas las clases. Las clases, puesto que son consideradas objetos, son instancias de una metaclase. Además puede soportar herencia múltiple, es decir, una clase puede heredar comportamientos y características de más de una superclase. Aparte, soporta polimorfismo que consiste en que varias clases derivadas de una antecesora puedan utilizar un mismo método de forma diferente. 3.3.1 Boost.Python Boost es un conjunto de librerías de software libre creadas originalmente por BemanDawes y David Abrahams utilizadas para extender las capacidades del lenguaje de programación C++. Boost está formado por más de ochenta librerías individuales incluidas las librerías de procesamiento de cadenas, contenedores, procesamiento de Escuela Técnica Superior de Ingeniería (ICAI) Página 23 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador imágenes y diferentes algoritmos. La mayoría de librerías no necesitan ser construidas para su uso. Pueden ser utilizadas en cualquier tipo de proyectos, ya sean comerciales o no. Varios de los fundadores de Boost forman parte del Comité ISO de Estándares C++ mencionado en el apartado 1. La próxima versión estándar de C++ incorporará varias de estas librerías. Actualmente cuenta con más de 3.000 personas suscritas a la lista de correo. Boost.Python es una librería del conjunto de librerías Boost. Permite exportar las clases y tipos de datos definidos en C++ a Python. Fue diseñada pensando en que no fuese necesario modificar las clases desarrolladas en C++ para que el intérprete de Python pudiese utilizarlas. Todas las funcionalidades de esta librería han sido desarrolladas en C++ por lo que no es necesaria una herramienta externa para utilizarlas. Actualmente, Python cuenta con una API para C++ que permite la interacción entre estos dos lenguajes. La librería Boost.Python añade cuatro características importantes a dicha API: Intercambio de objetos: Como se ha comentado anteriormente, Boost.Python permite que el intérprete de Python conozca la estructura y las funcionalidades de las clases desarrolladas en C++. Gracias a un diccionario de datos es posible intercambiar objetos creados en C++ con Python y viceversa. Sobrecarga de clases:Boost.Python permite añadir nuevas funcionalidades a las clases desarrolladas en C++ manteniendo el paradigma de la Programación Orientada a Objetos para que únicamente sean utilizables por el intérprete de Python. Control de errores: Incluyendo el fichero “module_tail.cpp” al final del fichero fuente C++ donde se invoca a Python, es posible controlar el lugar donde el código Python falla traduciéndolo a una excepción de C++. Tratamiento de tipos básicos de C++: Boost.Python también permite utilizar las operaciones de objetos básicos de C++ en Python siguiendo el Escuela Técnica Superior de Ingeniería (ICAI) Página 24 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador estilo de la Programación Orientada a Objetos. Por ejemplo, para escribir en Python la siguiente línea de código en C++ x = vector[i]; Utilizando la API básica de Python sería: x = PySequence_GetItem(vector, i); En cambio, si se utiliza la librería Boost.Python: x = vector[i]; Tanto la API básica de Python para C++ como la librería Boost.Python pueden convivir juntas en la misma aplicación. Si es necesario incluir alguna funcionalidad de la API básica no es necesario incluir la cabecera Python.h ya que viene incluida en la librería Boost.Python. 3.3.2 Boost.Python: Ejemplo A continuación se va a explicar cómo conseguir que el intérprete de Python pueda comprender y utilizar las clases desarrolladas en C++. Para este ejemplo se utilizará una clase sencilla en C++: class HolaMundo { private: string nombre; public: HolaMundo(string nombre); ~HolaMundo(); void set_nombre(string nombre); string get_nombre(); void saludo(); }; El primer paso consistiría en crear el módulo Boost.Python al que accedería Python para interpretar la clase HolaMundo. Escuela Técnica Superior de Ingeniería (ICAI) Página 25 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador #include <boost/python.hpp> namespace python = boost::python; using namespace boost::python; BOOST_PYTHON_MODULE(HolaMundo) { python::class_<HolaMundo>("HolaMundo") .def("setnombre", &HolaMundo::set_nombre) .def("getnombre", &HolaMundo::get_nombre) .def("saludoPython", &HolaMundo::saludo); } A continuación, es necesario añadir el módulo Python generado anteriormente al intérprete de Python. En caso de que no se pudiese se lanzaría un error informando de esto. Siempre que se vaya a utilizar cualquier código de la librería Boost.Python o de la API original de Python para C++ éste debe de comenzar con “Py_Initialize();”. Py_Initialize(); if (PyImport_AppendInittab("HolaMundo ", initHolaMundo) == -1) throw std::runtime_error("Failed to add HolaMundo to the interpreter's " "builtin modules"); Por último obtenemos el espacio de nombres o diccionario de datos que comparten Python y nuestro programa realizado en C++. python::object main = python::import("__main__"); // Retrieve the main module's namespace python::object global(main.attr("__dict__")); python::object PythonDerived = global["PythonDerived"]; A partir de este momento se podrá utilizar el objeto “global” para importar objetos entre los diferentes lenguajes sin compartición de memoria por lo que un objeto importado desde C++ a Python no podrá ser actualizado desde éste pero sí podrá ser modificado para poder recogerlo nuevamente desde C++. HolaMundo variable(“C++”); Escuela Técnica Superior de Ingeniería (ICAI) Página 26 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Global[“variable”] = variable; El último paso consistiría en invocar al fichero Python que recibirá la variable global y que hará uso de la clase desarrollada en C++. python::object result = python::exec_file(“ejemplo.py”, global, global); Para recuperar desde C++ una variable utilizada en Python habría que utilizar el objeto “global”. HolaMundoaux = python::extract<HolaMundo>(global["auxiliar"]); A continuación se muestra el fichero Python que se ha utilizado para desarrollar el ejemplo. # Fichero ejemplo.py importHolaMundo print '¡Hola Mundo!' variable.saludoPython(); auxiliar = HolaMundo("Python"); auxiliar.saludoPython(); Salida del programa: ¡Hola Mundo! Hola desde la variable de C++ Hola desde la variable de Python Para más información sobre el uso de la librería Boost.Python es recomendable leer el manual desarrollado por Boost: http://www.boost.org/doc/libs/1_46_1/more/getting_started/index.html Escuela Técnica Superior de Ingeniería (ICAI) Página 27 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 4. Arquitectura Escuela Técnica Superior de Ingeniería (ICAI) Página 28 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 4.1 Arquitectura del Sistema En este apartado se describirá la arquitectura interna del sistema desarrollado y se describirá el alcance del proyecto dentro del ámbito de los módulos funcionales desarrollados para su ejecución. Como se puede observar en la siguiente figura, en un primer estudio se decidió definir el sistema con dos grandes módulos: Figura 1 – Arquitectura del Sistema inicial El grado de alcance de cada módulo es el siguiente: Información y reglas del juego: Engloba toda la información relativa al juego y necesaria para poder jugar. Kernel: Es el módulo encargado de procesar la información del juego, interpretar las reglas y gestionar el flujo de la partida. En un primer momento se decidió definir las reglas del juego utilizando el lenguaje XML. Para ello se estudió la posibilidad de utilizar una pila para almacenar las distintas variables que se utilizasen y, mediante las funciones definidas en el módulo Kernel y las operaciones de push y poppropias de una pila, ejecutar las reglas del juego según el estado del juego en el que se encontrase el jugador. Escuela Técnica Superior de Ingeniería (ICAI) Página 29 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador La principal ventaja que aportaba este modelo era poder definir tanto las reglas como la información del juego con un lenguaje sencillo y sin necesidad de compilación en caso de modificación del algún parámetro del juego. Se desarrolló una primera versión conceptual del Risk utilizando este esquema pero, pese a ser factible y tratarse de un lenguaje muy sencillo de utilizar, se llegó a la conclusión de que no cumplía los objetivos marcados. Con juegos sencillos o de poca complejidad, este mecanismo era sencillo de utilizar pero con juegos con unas reglas de mayor complejidad se hacía bastante difícil desarrollarlas utilizando XML. Ante esta situación se decidió utilizar otra técnica para la definición de las reglas del juego. Como se puede observar en la siguiente figura, se llegó a la conclusión de que era necesario separar las reglas del juego de la información de éste creando un nuevo módulo: Figura 2 – Arquitectura del Sistema El grado de alcance de cada módulo es el siguiente: Reglas del juego: Engloba todas las acciones que pueden realizarse en el juego. Información del juego: Engloba toda la información del juego así como los diferentes estados por los que puede transcurrir una partida. Kernel: Es el módulo encargado de leer la información del juego y las reglas de éste y controlar el flujo de una partida. Escuela Técnica Superior de Ingeniería (ICAI) Página 30 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Utilizando este nuevo diseño las reglas del juego ya no tendrán que desarrollarse el lenguaje XML sino que se utilizará el lenguaje Python, mucho más potente aunque de más complejidad, para desarrollarlas. Las principales ventajas que aporta este nuevo modelo son las siguientes: Separación entre reglas del juego e información:Las reglas del juego estarían desarrolladas con el lenguaje Python y la información del juego se plasmaría mediante el lenguaje XML estando los dos grandes bloques totalmente separados. Modificación de las reglas del juego: Debido a que las reglas del juego serán desarrolladas mediante el lenguaje interpretado Python, no es necesario recompilar su código para el correcto funcionamiento de la aplicación permitiendo su modificación por terceros y creando nuevas versiones del juego. Diseño de Scripts: En un futuro sería posible desarrollar un IDE que permita la generación de los scripts en Python de una forma sencilla e intuitiva sin necesidad de programarlos. Una desventaja de tener que utilizar este lenguaje para el desarrollo de las reglas del juego es la necesidad de tener instalado en el equipo que vaya a ejecutar el juego un intérprete de Python. Sin dicho intérprete no se podrían procesar las reglas del juego y, por consiguiente, no se podría utilizar la aplicación. Escuela Técnica Superior de Ingeniería (ICAI) Página 31 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 4.2 Módulo: Información del juego A continuación se describirá la arquitectura interna del módulo Información del Juego. Puesto que cada juego de mesa consta de diferentes elementos que le diferencian del resto de juegos, se estudiaron los elementos comunes en diferentes juegos de mesa por turnos que pueden observarse en la siguiente figura: Figura 3 – Arquitectura del módulo “Información del juego” Como se puede observar, este módulo consta de seis unidades funcionales cuyo grado de alcance es el siguiente: Estados: Engloba los diferentes estados por los que puede transcurrir una partida del juego. Constará de un estado inicial y un estado final que definan el principio y fin del turno del jugador. Los estados funcionan como una máquina de estados existiendo eventos de salida y entrada. Propiedades del juego: Define las variables generales del juego como pueden ser el número de jugadores, nombre del juego, etc. Propiedades del jugador: Define las variables comunes de los jugadores de una partida como nombre del jugador, elementos del juego de los que dispone, etc. Escuela Técnica Superior de Ingeniería (ICAI) Página 32 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Unidades: Son los diferentes elementos del juego que pueden pertenecer o no a un jugador y que participan en la partida. Recursos: Son los diferentes elementos del juego que pertenecen a un jugador pero que no participan activamente en el juego. Estructuras: Son los diferentes elementos del juego que pueden pertenecer o no a un jugador y que participan en la partida pero que se mantienen en una posición fija durante toda la partida. Todas estas unidades funcionales se desarrollarán en XML ya que se trata de un lenguaje sencillo de utilizar y que no requiere recompilar el código si alguna de estas unidades funcionales necesita modificarse. Escuela Técnica Superior de Ingeniería (ICAI) Página 33 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 4.3 Módulo: Reglas del juego Este módulo será el encargado de definir las reglas o acciones que podrán realizarse a lo largo de la partida. La arquitectura interna se define en la siguiente figura: Figura 4 – Arquitectura del módulo “Reglas del juego” Las reglas del juego consisten esencialmente en funciones desarrolladas en Python que realizan los siguientes cometidos: Operaciones: En función a los datos que reciban tendrán que obtener uno o varios datos de salida mediante operaciones tanto lógicas como matemáticas. Modificación de la Información del juego: En base a las acciones realizadas por el jugador, las reglas del juego podrán alterar la información del juego. Modificación de los estados de la máquina de estados: En función a una serie de eventos señalados en las reglas del juego podrán afectar a los estados de la máquina de estados del juego. Como puede observarse, este módulo consta de tres unidades funcionales fundamentales cuyo grado de alcance es el siguiente: Escuela Técnica Superior de Ingeniería (ICAI) Página 34 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Inicio del juego: Define la primera regla o acción a realizar nada más comenzar el juego. Esta consistirá en el reparto de recursos, unidades y estructuras iniciales a cada jugador, posicionamiento de éstos, etc. Fin del juego: Define la última regla o acción que se realizará al finalizar el juego. Reglas del juego: Engloba el resto de reglas que se irán ejecutando conforme el juego avance según el estado en el que se encuentre cada jugador. Al contrario que las dos unidades funcionales anteriores, estas reglas no tendrán que ejecutarse obligatoriamente en todas las partidas. Estas unidades funcionales se desarrollarán utilizando el lenguaje Python por los motivos explicados en el apartado 3.3. Escuela Técnica Superior de Ingeniería (ICAI) Página 35 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 4.4 Módulo: Kernel Este módulo será el encargado de leer la información proporcionado por los otros dos módulos principales y controlar el flujo de la partida. En la siguiente figura se pueden ver las principales unidades funcionales que forman parte de él: Figura 5 – Arquitectura del módulo “Kernel” Es considerado el módulo principal invariable para los juegos que se desarrollen en un futuro ya que estará implementado en C++ y debe de ser común para todos los juegos. Como puede observarse, el módulo principal consta de cuatro unidades funcionales principales que se definen de la siguiente manera: Lector de Información del Juego Se encarga de procesar todos los ficheros XML con la información relativa al juego y almacenarla en variables declaradas en el Kernel en C++. Su invocación se realiza desde el Kernel nada más arrancar la aplicación y leerá los 6 ficheros XML definidos: recursos.xml, juego.xml, unidades.xml, estructuras.xml, estados.xml y jugador.xml. Interactúa estrechamente con el resto de unidades funcionales ya que proporciona información importante para todos ellos. La unidad funcional Jugadores necesita la información que se refiere tanto al jugador en sí como los elementos que forman parte del juego.Gestor de Estados necesita toda la información referente a los estados por los que pasa el juego y los saltos que pueden producirse de uno a otro. Por Escuela Técnica Superior de Ingeniería (ICAI) Página 36 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador último, la unidad funcional Gestor de Acciones necesita conocer qué acción o función debe de lanzar en cada momento. Jugadores Guarda toda la información de los jugadores que participan en una partida. Es una unidad funcional que se actualiza continuamente ya que, con cada acción que se realiza durante el juego y que se vean afectados los jugadores, se verá afectada la información que almacena. La información la obtiene en primer lugar gracias al Lector de Información del Juego que le proporciona los elementos iniciales con los que comienza cada jugador. Durante el resto de la partida su contenido se verá alterado por las acciones que son disparadas a través del Gestor de Acciones. Gestor de Estados El Gestor de Estados es el encargado de guardar toda la información de los diferentes estados por los que puede discurrir una partida y gestionar los saltos entre ellos. Obtiene dicha información a partir del fichero “estados.xml” que es leído por la unidad funcional Lector de Información del Juego. Durante la partida es posible que alguna acción modifique uno de dichos estados alterando el curso de acción de un turno de un jugador. Gestor de Acciones El Gestor de Acciones es el encargado de gestionar las acciones que se producen durante el turno de un jugador. Cada estado tendrá asociadas una o varias acciones que deben de ejecutarse mientras el jugador permanezca en ese estado. Dichas acciones pueden ser de dos tipos: Internas: Son aquellas acciones incluidas en el módulo Kernel comunes a cualquier juego de mesa por turnos desarrolladas en C++. Estas Escuela Técnica Superior de Ingeniería (ICAI) Página 37 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador funciones se han desarrollado previamente y el usuario podrá acceder a ellas sin necesidad de reprogramarlas para cada nuevo juego. Externas: son aquellas acciones implementadas en el módulo “Reglas del Juego”. Para poder ejecutarlas tendrá que invocar al fichero Python donde está definida dicha regla. Esta llamada se realizará automáticamente cuando el jugador acceda al estado que la activa. Estas funciones serán desarrolladas por el usuario de la aplicación. Escuela Técnica Superior de Ingeniería (ICAI) Página 38 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 39 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 5. Diseño del Sistema Escuela Técnica Superior de Ingeniería (ICAI) Página 40 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 5.1 Introducción El Diseño de Sistemas se considera el arte de definir la arquitectura de un sistema, tanto hardware como software para poder satisfacer una serie de requerimientos. Esta etapa está considerada una de las más cruciales en el desarrollo de software ya que en función de la calidad de este diseño el sistema tendrá un comportamiento acorde con los requerimientos especificados o bien tendrá anomalías en su funcionamiento teniendo que redefinir el diseño y, por lo tanto, incrementado los costes del producto. En el caso de este proyecto solo será necesario un diseño a nivel software ya que será una aplicación capaz de funcionar en cualquier computadora que cumpla los requisitos especificados y no será necesaria una máquina específica para el hardware. Escuela Técnica Superior de Ingeniería (ICAI) Página 41 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 5.2 Diagrama de Secuencia A continuación se muestra un diagrama de secuencia de cómo se resolvería dentro de la aplicación el turno de un jugador. Figura 2 – Diagrama de Secuencia Escuela Técnica Superior de Ingeniería (ICAI) Página 42 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador En primer lugar la aplicación solicita a la clase Inf_Jugador el estado en que se encuentra el jugador actual, es decir, el jugador que va a jugar en ese momento el turno y evalúa el valor devuelto. En caso de que el estado del jugador sea -1 el jugador ha sido eliminado en algún momento de la partida. La aplicación entonces cambiará el jugador actual por el siguiente jugador disponible y finalizará el turno de ese jugador. Si el estado del jugador es distinto de -1 la aplicación solicitará al ManagerFunciones, que es el encargado de gestionar todas las funciones, la función específica para mostrar la Información del Jugador y la ejecutará. Esta acción mostrará por pantalla toda la información del jugador. A continuación la aplicación solicitará a la clase FuncionPython que ejecute la regla “finjuego.py”. Esta regla lo que hará será comprobar si el usuario ha llegado al final del juego o no, es decir, si ha perdido o ganado la partida o si puede continuar jugando. La aplicación volverá a comprobar el estado del jugador y en el caso de que su estado sea -1 finalizará su turno. Por el contrario, si su estado sigue siendo distinto de -1 la aplicación pedirá al ManagerEstados que seleccione el estado en el que está el jugador. El ManagerEstados lo que hará será ejecutar la regla correspondiente a dicho salto y devolverá el control a la aplicación. Esto se repetirá hasta que el jugador alcance el salto final. Escuela Técnica Superior de Ingeniería (ICAI) Página 43 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 5.3 Diagrama de Flujo A continuación se muestra un diagrama de flujo del turno de un jugador de un juego de mesa por turnos genérico indicando los diferentes estados por los que podría pasar durante una partida. Figura 3 – Diagrama de Flujo Durante el turno de un jugador existen dos estados obligatorios que aparecen en todos los juegos de mesa por turnos. Inicio turno:Este estado será el encargado de inicializar el turno del jugador realizando las comprobaciones necesarias y desde él se accederán a las primeras acciones del Juego que puede tomar un jugador durante un turno. Fin turno: Este estado será al que lleguen todos aquellos estados que puedan ser de finalización del turno del jugador. En este turno se podrá comprobar si el jugador cumple las condiciones necesarias para finalizar la partida, comprobación de las unidades que se poseen al terminar el turno, etc. Al terminar este estado se pasará el turno al siguiente jugador. En el bloque que se representa en el diagrama de flujo como “Estados del Juego” estarán todos aquellos estados que forman parte de la lógica de cada uno de los juegos que se desarrollen. Podrán definirse todos los estados que se deseen teniendo especial atención al identificador que se les asigne. Todos estos estados, incluidos los de Inicio turno y Fin turno tendrán que estar definidos en el fichero XML estados.xml. Escuela Técnica Superior de Ingeniería (ICAI) Página 44 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 5.4 Diagrama de Clases A continuación se muestra el diagrama de clases del módulo Kernel y la descripción de cada una de las clases. Figura 4 – Diagrama de Clases Objeto Contiene la información básica de cualquier clase que herede de Objeto. Estas clases son las que se corresponden con cualquier elemento del juego. Recurso Contiene toda la información y funcionalidad relativa a los recursos del juego. Cada uno de estos recursos podrá tener un conjunto de unidades y un conjunto de atributos declarados por el usuario. Escuela Técnica Superior de Ingeniería (ICAI) Página 45 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Elemento Engloba a todas aquellas clases que puede asignársele un valor y una posición en el tablero del juego. Unidad Almacena la información de una unidad del juego. Podrá tener una posición en el tablero, un valor de movimiento, un atributo „tipo‟ que indica de qué tipo es la unidad y un valor. Estructura Guarda la información de una estructura del juego. Dicha estructura podrá tener una posición en el tablero y un atributo de tipo de estructura indicado por el desarrollador del juego. Evento Almacena la información de un evento del juego. Tendrá una descripción y un identificador del evento en cuestión. Estado Incluye la información de un estado del juego. Tendrá almacenada las operaciones automáticas que se ejecutarán nada más alcanzar dicho estado y las operaciones de salto. OpSalto Guarda la información de un salto entre estados. Tiene almacenado el identificador del estado al que se va a saltar pudiendo ser modificable. LectorXML Es la clase encargada de procesar todos los archivos XML que guardan la información del juego. Los archivos XML deben de estar implementados de forma correcta tal y como se indica en el Anexo 2: Manual de Usuario. Escuela Técnica Superior de Ingeniería (ICAI) Página 46 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador ManagerFunciones Es la clase encargada de almacenar todas las funciones o acciones que se producirán en los diferentes estados del juego. A partir del identificador de la función devolverá la función que tiene que ejecutar el Kernel. ManagerEstados Es la clase encargada de almacenar todos los estados por los que pasará un turno de jugador. Será la encargada de seleccionar el salto de un estado a otro cuando el jugador decida qué acción tomar. CPosicion Guarda toda la información necesaria para posicionar un elemento en el tablero de juego. Podrá ser de n dimensiones en función del tipo de juego que se trate. FCrearUnidades Será la clase encargada de crear las unidades para un jugador. Se le podrán pasar todos los parámetros que el jugador haya indicado para esa unidad. Restricciones: Primer parámetro: Número de unidades a crear. Segundo parámetro: Jugador al que se le asignarán las unidades. Tercer parámetro: Tipo de unidad. FEliminarUnidades Esta clase permitirá desde Python eliminar una serie de unidades de un jugador. OpAutomatica Clase encargada de gestionar las funciones automáticas de un estado. Funcion Esta clase almacenará la información necesaria de una acción de un estado. También contiene el método ejecutar() que será el encargado de lanzar la acción. Escuela Técnica Superior de Ingeniería (ICAI) Página 47 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador FEliminarRecursos Esta clase permitirá desde Python eliminar una serie de recursos de un jugador. FCrearRecursos Esta clase permitirá desde Python asignar una serie de recursos a un jugador de la partida. Restricciones: Primer parámetro: Número de recursos a crear. Segundo parámetro: Jugador al que se le asignarán los recursos. Tercer parámetro: Tipo de recurso. FTirarDados Esta clase simulará la tirada de dados durante la partida indicándole el menor y el mayor valor posibles. Esta clase podrá ser invocada desde Python. FuncionPython En esta clase se almacenará toda la información de una función Python y tendrá el método que permitirá su ejecución. FuncionKernel En esta clase se almacenará toda la información de una función Kernel y tendrá el método que permitirá su ejecución. FInfoJugador Esta clase podrá ser invocada desde Python para obtener toda la información de un jugador, desde las unidades, recursos y estructuras que posee hasta el nombre del jugador, su id, etc. Escuela Técnica Superior de Ingeniería (ICAI) Página 48 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 49 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 6. Risk Escuela Técnica Superior de Ingeniería (ICAI) Página 50 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 6.1 Introducción El Risk es un juego de mesa de carácter estratégico creado por Albert Lamorisse en 1950. Fue puesto a la venta por primera vez en Francia en el año 1957 bajo el nombre de La Conquête Du Monde. Posteriormente, se comenzó a comercializar en Estados Unidos bajo su actual nombre, Risk (en inglés Riesgo) en 1959. Las siguientes modificaciones del juego se hicieron poniendo énfasis en la presentación y en nuevas ediciones de éste. El juego está basado en turnos y pertenece a la categoría de juegos de guerra evocando las guerras Napoleónicas y su principal característica es su simplicidad y su abstracción abarcando toda la geografía del mundo. Fue creado para un número de jugadores de dos a seis de más de doce años y la duración de las partidas puede ser de una a ocho horas en función del número de jugadores. Figura 1 – Portada del juego Risk Escuela Técnica Superior de Ingeniería (ICAI) Página 51 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 6.2 Elementos del juego Tablero El tablero está formado de cuarenta y dos territorios agrupados en seis continentes. Cada uno de estos continentes es de un color distinto y contiene de cuatro a doce territorios. Figura 2 – Tablero del juego Risk América del Norte África 1. Alaska 1. Congo 2. Alberta 2. África Oriental 3. América Central 3. Egipto 4. Estados Unidos del Este, compuesta 4. Madagascar por el Noreste y el Sudeste de 5. África del Norte Estados Unidos 6. Sudáfrica 5. Groenlandia 6. Territorios del Noroeste 7. Ontario 8. Quebec 9. Estados Unidos del Oeste América del Sur 1. Argentina Escuela Técnica Superior de Ingeniería (ICAI) Asia 1. Afganistán Página 52 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 2. Brasil 2. China 3. Perú 3. India 4. Venezuela 4. Irkutsk 5. Japón 6. Kamchatka 7. Oriente Medio 8. Mongolia 9. Siam 10. Siberia 11. Ural 12. Yakutsk Europa 1. Gran Bretaña Oceanía 1. Australia Oriental, compuesta 2. Islandia por Queensland y por la Nueva Gales 3. Europa del Norte del Sur 4. Escandinavia 2. Indonesia 5. Europa del Sur 3. Nueva Guinea 6. Ucrania 4. Australia Occidental 7. Europa Occidental En el juego desarrollado para la aplicación cada territorio consistirá en un tipo de recurso asignable a un jugador. Todos los territorios tendrán que pertenecer a un jugador sin que exista la posibilidad de que haya un territorio neutral o no jugable. Cada continente, a su vez, será también un recurso. Cuando un jugador haya conquistado todos los países que lo conforman pasará a pertenecer a dicho jugador consiguiendo las ventajas que le correspondan Ejército Escuela Técnica Superior de Ingeniería (ICAI) Página 53 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador En el juego de mesa físico existen 6 grupos de ejércitos completos diferenciados por un color, cada uno con 3 tipos de unidades: Infantería (Valor de un ejército), Caballería (valor de cinco ejércitos) y Artillería (valor de diez ejércitos. En cualquier momento del juego, un jugador puede intercambiar cinco ejércitos de Infantería por uno de Caballería; diez ejércitos de Infantería por dos de Caballería o uno de Artillería; y cinco ejércitos de Infantería y uno de Caballería por uno de Artillería, o viceversa. En el juego desarrollado para la aplicación no se realizará ninguna distinción entre estas unidades ya que dicho aspecto es meramente visual y, al carecer de interfaz gráfica, no será necesario. Cada uno de los jugadores dispondrá de un número limitado de ejércitos o Infantería con valor 1 de ejército. Figura 3 – Figuras del juego Risk Escuela Técnica Superior de Ingeniería (ICAI) Página 54 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Las cincuenta y cuatro cartas de Risk Cuarenta y dos marcadas con un territorio, y un dibujo de un soldado de infantería, caballería o artillería ydoce cartas para usar en Risk: Misión Secreta, una expansión del juego. En el juego desarrollado para la aplicación cada una de las cartas marcadas con un territorio se considera un recurso con su correspondiente país y la figura que tiene representada.Las cartas de misión u objetivo se considerarán un tipo de recurso. Cada uno de los jugadores recibirá una carta de misión cuyo funcionamiento se explicará más adelante. Objetivo del Juego El principal objetivo del juego es conquistar el mundo, ocupando los 42 territorios del tablero y, por lo tanto, eliminando a todos los oponentes. Organización A diferencia de la mayoría de los juegos, el RISK requiere planear la estrategia que se va a utilizar durante la partida antes de comenzarla. La ubicación inicial de los ejércitosserá crucial para conseguir uno de los objetivos del juego. Se Selecciona un color y dependiendo del número de jugadores, toma los ejércitos que se requieren para comenzar el juego. Si son 3 jugadores: 35 ejércitos cada uno Si son 4 jugadores: 30 ejércitos cada uno Si son 5 jugadores: 25 ejércitos cada uno Si son 6 jugadores: 20 ejércitos cada uno En el juego desarrollado los jugadores no se diferenciarán por un color sino que se les asignará un identificador distinto. Escuela Técnica Superior de Ingeniería (ICAI) Página 55 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Empezando por la izquierda del primer jugador, todos, en turnos, colocan un ejército en un territorio desocupado, se continúa hasta que los 42 territorios hayan sido ocupados. Puesto que esta elección no afecta al juego en sí, el juego colocará automáticamente en los territorios ocupados por cada jugador una unidad hasta completar los cuarenta y dos territorios. Después de que los 42 territorios fueron ocupados, cada jugador en su turno coloca un ejército adicional hasta que todos hayan quedado sin armadas de las seleccionadas inicialmente. No hay límite del número de ejércitos que puede haber en cada territorio. Turno del jugador Cada uno de los turnos de un jugador consiste en los siguientes pasos: Refuerzo y ubicación de nuevos ejércitos Al principio de cada turno, la aplicación calcula cuantos nuevos ejércitos le corresponden al jugador en función del número de territorios y los continentes que controla. El número de territorios que ocupa: Al principio de cada turno la aplicación contabiliza el número de territorios que ocupa el jugador, lo dividirá entre tres descartando la fracción y el resultado es el número de ejércitos que recibe. El jugador podrá colocar las unidades en cualquier territorio que posea. El valor de los continentes que controla: El control de un continente es la ocupación de todos los territorios que componen al mismo (ver la descripción de cada continente junto a sus territorios en el apartado Tablero). Al inicio del turno se recibirán ejércitos por cada continente bajo control de un jugador.Éste podrá colocar las unidades en cualquier territorio que posea. El valor de los tríos de Tarjetas RISK que cambies: Al final de cualquier turno en el que se haya conquistado uno o varios territorios nuevos, se ganara Escuela Técnica Superior de Ingeniería (ICAI) Página 56 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador una carta RISK. Si se tiene un conjunto de 3 Tarjetas Risk con la misma división militar (Infantería, Caballería, Artillería) se puede cambiar por ejércitos al inicio del siguiente turno, o se puede esperar. Conforme se canjeen más tríos de tarjetas RISK, más ejércitos recibirá un participante de acuerdo al número de canjes que se han hecho durante la partida por cualquiera de los jugadores del tablero. La tabla de cambios es la siguiente: o 4 ejércitos con el primer cambio realizado por cualquier jugador. o 6 ejércitos con el segundo cambio realizado por cualquier jugador. o 8 ejércitos con el tercer cambio realizado por cualquier jugador. o 10 ejércitos con el cuarto cambio realizado por cualquier jugador. o 12 ejércitos con el quinto cambio realizado por cualquier jugador. o 15 ejércitos con el sexto cambio realizado por cualquier jugador. o Después del sexto cambio, el número de ejércitos aumentara en múltiplos de 5. Para llevar esta cuenta la aplicación llevará un contador por cada jugador que irá aumentando conforme se vayan realizando los cambios de cartas por unidades. El territorio específico mostrado en una carta canjeada: si una de las tres tarjetas RISK que se cambia muestra la imagen de un territorio que ocupas, se recibirá dos ejércitos extras. Ataque Después de colocar los ejércitos al principio del turno, se decide si se desea atacar. El objeto del ataque es capturar un territorio al eliminar a los ejércitos del enemigo en ese territorio. Las batallas se dan por medio de los dados. Si se decide no atacar se pueden fortificar territorios, si así se desea. Si se decide atacar, se deben seguir estas reglas: Solo se puede atacar a un territorio que esta adyacente a un territorio propio. Ejemplos: Groenlandia puede atacar a los Territorios del Noroeste, Ontario, Quebec e Islandia. África del Norte puede atacar a Egipto, Europa del Oeste y Brasil. Escuela Técnica Superior de Ingeniería (ICAI) Página 57 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Se debe tener al menos 2 ejércitos en el territorio desde el cual se atacara. Se puede continuar atacando un territorio hasta que hayan sido eliminados todas las armadas enemigas en él, o se puede cambiar el territorio al que se ataca por otro. Se pueden realizar todos los ataques que se deseen durante el turno. Para atacar, primero se indica con qué territorio ataca, y cual es atacado, después los jugadores tiran los dados, avisando previamente cuantos dados van a tirar y lanzándolos al mismo tiempo. El atacante podrá tirar 1, 2 ó 3 dados, teniendo en cuenta que debe tener al menos un ejército más que el número de dados que desea tirar. Por otro lado, el defensor tirará 1 ó 2 dados, aunque para poder tirar dos dados deberá tener al menos 2 ejércitos en su territorio. En ambos casos, mientras más dados lancen, más posibilidades tienen de ganar pero, a la vez, más armadas pueden perder. Para decidir el resultado de una batalla, se compara el dado más grande de cada jugador, si el número del dado del atacante es mayor, el defensor pierde una armada del territorio atacado. Pero si el dado del defensor es más grande, el atacante pierde una armada. Si ambos tiraron más de un dado, comparen ahora el segundo dado de cada uno, y repitan el proceso. En caso de empate, el defensor se ve favorecido y, por último, ningún jugador puede perder más de dos armadas por cada tirada de dados. Tan pronto como se elimina a la última armada enemiga en un territorio, se considera capturado ese territorio y será ocupado inmediatamente. Para hacer esto el atacante podrá mover tantas tropas como desee al territorio ocupado, como mínimo una unidad. En la mayoría de los casos mover tantas armadas como se pueda es lo más ventajoso, porque las armadas dejadas atrás no pueden ayudar en un nuevo ataque. Finalmente, durante el juego todos los territorios deben estar ocupados al menos por una armada. Se puede terminar el ataque de un jugador en cualquier momento, si así lo desea. Si se capturó al menos un territorio, el jugador tomará una carta Risk de la baraja. Fortificar Antes de terminar su turno, un jugador puede fortificar sus posiciones sobre el campo de batalla, moviendo tantas armadas como desee desde un territorio de origen Escuela Técnica Superior de Ingeniería (ICAI) Página 58 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador hacia un territorio adyacente (colindante). Una vez hecho esto el turno del jugador habrá finalizando pasando al siguiente jugador. Escuela Técnica Superior de Ingeniería (ICAI) Página 59 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 6.3 Diseño del Risk Para la adaptación del juego de mesa Risk al motor desarrollado se han tenido que tomar unas consideraciones previas y un estudio detallado del diseño a utilizar. A continuación se detallarán las consideraciones previas tomadas: Puesto que el motor carece de apartado gráfico cualquier acción que necesite de visualización del mapa por parte del jugador tendrá que ser detallada literalmente a través de la consola. Por ejemplo, a la hora de atacar un país el jugador debe de conocer los países que son colindantes a los suyos, a qué jugador pertenecen y el número de unidades enemigas que poseen. El Risk tiene numerosas versiones que alteran o añaden nuevas reglas al juego. Para el juego que se ha desarrollado se han utilizado las reglas del juego de acuerdo a la última edición estadounidense de 2004. Se aplicarán al juego todas las reglas descritas en dicha edición adaptándolas cuando sea necesario y teniendo en cuenta las ausencia de gráficos del motor intentando que la interacción del jugador con el juego sea lo más intuitiva y sencilla posible. Después de estas consideraciones se procedió al diseño del juego para su adaptación al motor desarrollado. En primer lugar se procedió a definir los distintos elementos del juego en función a las reglas especificadas en el punto 6.2. A continuación se puede observar una tabla donde se indican los diferentes elementos identificados y clasificados. Escuela Técnica Superior de Ingeniería (ICAI) Página 60 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Después de tener identificados los diferentes elementos se desarrolló un diagrama de flujo del turno de un jugador indicando los diferentes estados por los que podría pasar durante una partida. Figura 4 – Diagrama de Flujo Risk Al comienzo del turno el primer estado al que puede acceder un jugador es el de “Refuerzo”. En este estado se calcularán las unidades que le corresponden al jugador en función del número de territorios conquistados y de los continentes que abarque. El jugador podrá colocar dichas unidades en sus territorios para reforzar sus ejércitos. A continuación, el jugador podrá optar por tres opciones: “Atacar país”, “Cambiar cartas”, “Mover tropas” o bien “Finalizar el turno”. Si la opción elegida es “Atacar país” el jugador podrá atacar un país de otro jugador que sea adyacente a uno de los suyos siempre y cuando disponga de más de dos unidades. En caso de querer continuar atacando más países del mismo jugador o de otro podrá hacerlo hasta que decida saltar a otro estado. Desde este estado podrá ir al estado de “Mover tropas” o bien “Finalizar el turno”. Escuela Técnica Superior de Ingeniería (ICAI) Página 61 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador En el estado “Cambiar cartas” el jugador podrá intercambiar las cartas que tenga en la mano por nuevas unidades para asignar a sus territorios. A continuación podrá saltar a los estados de “Atacar país”, “Mover tropas” o “Finalizar el turno”. En el estado de “Mover tropas” el jugador podrá desplazar sus tropas a un territorio adyacente de su propiedad para reforzar sus defensas estratégicas. Esta acción podrá realizarla cuantas veces quiera hasta que dé por finalizado el desplazamiento. Desde este estado podrá desplazarse al estado de “Fin de turno”. Por último, en el estado de “Fin de turno” el juego comprobará las condiciones de victoria y derrota. En el caso del Risk comprobará si cumple con los objetivos de la carta Misión Secreta o si ha eliminado a todos los jugadores. En caso de cumplirse alguno de los puntos se considerará ganador de la partida. Teniendo identificados tantos los elementos del juego como los estados por los que puede pasar un jugador se desarrollaron las diferentes reglas o acciones del juego. A continuación se puede observar una tabla con las diferentes acciones que se identificaron y una pequeña descripción de cuál es su función. Acción Refuerzo de batallón Descripción Esta acción consistirá en asignarle al jugador las unidades que le correspondan en función de los territorios y continentes ocupados. Movimiento de tropas Permitirá el movimiento de tropas de un territorio a otro colindante del mismo jugador. Información de Jugador Puesto que el jugador no dispondrá de una opción gráfica para observar sus unidades, estructuras, etc. Esta clase permitirá mostrar por consola toda la información del jugador. Cambio de cartas Esta acción permitirá el intercambio de cartas por parte de un jugador por unidades que podrá colocar en sus territorios. Atacar un país Esta acción consiste en poder atacar un territorio enemigo colindante Escuela Técnica Superior de Ingeniería (ICAI) Página 62 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 63 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 7. Planificación Escuela Técnica Superior de Ingeniería (ICAI) Página 64 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Para el desarrollo de este proyecto se ha seguido una metodología SCRUM. Se han realizado entregas periódicas cada semana o dos semanas en función de la carga de trabajo y disponibilidad del proyectante de los diferentes módulos desarrollados permitiendo obtener logros medibles para la evaluación de la evolución del proyecto y permitiendo adaptar cambios que surgían durante el desarrollo del trabajo de una forma más sencilla. A continuación se muestran las personas que han formado parte de este proyecto y sus respectivos roles. Figura 1 – Organigrama componentes del proyecto En la primera etapa del proyecto se han identificado las necesidades y oportunidades de desarrollar este proyecto y se han observado los beneficios de desarrollarlo frente a otros programas existentes. Durante esta etapa también se ha Escuela Técnica Superior de Ingeniería (ICAI) Página 65 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador realizado un estudio del estado del arte estudiando otros proyectos similares y estudiando las posibles ventajas que podría aportar nuestro proyecto. Durante la etapa del análisis de requisitos se han estudiado los requisitos que debe cumplir la aplicación y los objetivos que debía de conseguir. A continuación, en la fase de diseño,se han estudiado los diferentes lenguajes que se van a utilizar en el desarrollo de la aplicación así como las aplicaciones que se utilizarían para su programación. Tras una primera fase de diseño lógica de la aplicación se han desarrollado las reglas y estados por los que transcurre el juego de mesa Risk en formato XML.Utilizando la herramienta Rational Software Architect se ha desarrollado el diagrama de clases de la aplicación en UML y se ha convertido a código C++. En la etapa de programación se han desarrollado y plasmado todos los requisitos y diseños realizados anteriormente utilizando las diferentes herramientas mencionadas anteriormente. Esta etapa se ha separado en diferentes subtareas. Programación del kernel: En esta subtarea se ha desarrollado el núcleo de la aplicación que será el encargado de toda la lógica de ésta. Esta subtarea se ha realizado utilizando el lenguaje de programación C++. Para su desarrollo de han utilizado los diagramas creados en el apartado 5. Programación del modelo de juego: Se han desarrollado todos los ficheros necesarios con la información del juego sin aún centrarse en el juego Risk. Se han creado los esqueletos de los ficheros para que puedan ser utilizados por cualquier desarrollador de juegos para este motor. Integración con Python: En esta etapa se han integrado las reglas desarrolladas en Python con la aplicación desarrollada en C++. Para ello se ha utilizado la librería boost de C++ y Python (3.3.1). Programación del juego real Risk: Se han desarrollado las reglas del juego Risk mediante el lenguaje Python para validar la aplicación. A continuación se definieron los diferentes estados por los que puede pasar el turno de un jugador y que serán los encargador de invocar las diferentes reglas del juego en función del estado en que se encuentre el jugador. Escuela Técnica Superior de Ingeniería (ICAI) Página 66 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Se han realizado pruebas al final de la etapa de programación de las diferentes subtareas mencionadas anteriormente para validar su funcionamiento. Por último, se ha creado la documentación oficial del Proyecto a partir de todos los documentos que se desarrollaron de diseño, arquitectura, etc. A continuación se muestra un Diagrama de Gantt que muestra la planificación que se ha ido siguiendo durante todo el desarrollo del proyecto. Figura 2 – Diagrama de Gantt Escuela Técnica Superior de Ingeniería (ICAI) Página 67 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 8. Estudio Económico Escuela Técnica Superior de Ingeniería (ICAI) Página 68 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 8.1 Introducción En este capítulo se muestra la estimación económica para el correcto desarrollo del proyecto. Existen dos separaciones para el cálculo del coste del desarrollo en función al personal necesario para el desarrollo del sistema y el equipo hardware y software utilizado. Escuela Técnica Superior de Ingeniería (ICAI) Página 69 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 8.2 Coste de Personal A continuación se muestra el coste imputable a cada rol que ha participado en el proyecto. Rol Horas trabajadas Coste por hora Coste Total Coordinador 35 35 € 1.225 € Director 140 28 € 3.920 € Jefe de Proyecto 170 20 € 3.400 € Programador y 220 15 € 3.300 € desarrollador del juego 11.845 € Tabla1 – Coste de Personal Escuela Técnica Superior de Ingeniería (ICAI) Página 70 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 8.3 Coste de Hardware/Software En cuanto a los costes por hardware se ha imputado el coste de un ordenador portátil utilizado por el programador para el desarrollo de la aplicación. Todo el software utilizado ha sido bajo licencia de estudiante o bien de licencia gratuita. Concepto Unidades Coste Unitario Total Ordenador Portatil 1 900 € 900 € ASUS 17’’ Windows 7 900 € Escuela Técnica Superior de Ingeniería (ICAI) Página 71 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 8.4 Conclusión El coste total del proyecto asciende a 12.745 €. Este coste corresponde casi en su mayoría al coste del personal que se ha empleado para el desarrollo del trabajo. El único software propietario que se ha utilizado es el Microsoft Windows 7 que venía incluido en el coste del portátil utilizado. Gracias a que se ha utilizado software con licencia gratuita o bien con licencia de estudiante los costes del producto se han visto significativamente reducidos con respecto al coste en caso de haber utilizado productos propietarios o bien con licencia de pago. Escuela Técnica Superior de Ingeniería (ICAI) Página 72 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 73 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 9. Conclusiones y trabajos futuros Escuela Técnica Superior de Ingeniería (ICAI) Página 74 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 9.1 Conclusiones A continuación se enumeran a modo de resumen las conclusiones a las que se han llegado con la elaboración de este proyecto. Menor complejidad a la hora de desarrollar juegos gracias al uso de Python y XML. o El uso del lenguaje Python para la definición de las reglas del juego reduce considerablemente la complejidad del desarrollo del juego permitiendo a los creadores de juegos el desarrollo de estos sin tener unos conocimientos muy elevados de programación. o Gracias al lenguaje etiquetado de XML es posible definir tanto los recursos, estructuras, unidades, información del juego y el conjunto de estados que conforman el turno de un jugador de una forma sencilla e intuitiva pudiendo ser modificados en poco tiempo. La comunicación entre los diferentes lenguajes es rápida y fluida sin afectar al rendimiento del juego. o La lectura de archivos XML por parte del Kernel de la aplicación es llevada a cabo rápidamente sin notar al comienzo del juego el tiempo empleado para obtener la información sobre el juego. o A la hora de invocar cada una de las reglas del juego codificadas en Python desde el módulo Kernel hecho en C++ se produce con una total transparencia para el usuario final sin llegar a notar que el juego está cambiando de un lenguaje a otro durante su ejecución. La abstracción de objetos permite el desarrollo de juegos de mayor o menos complejidad. o Gracias a la abstracción de clases que se ha realizado en el desarrollo del Kernel de la aplicación su funcionamiento no está condicionado a la complejidad del juego ya que la información está correctamente distribuida. o Puesto que la gestión de las diferentes fases por las que pasa un turno de un jugador se ha realizado mediante un diagrama de Escuela Técnica Superior de Ingeniería (ICAI) Página 75 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador estados la complejidad de un juego no afectará al transcurso de este ya que se podrá dividir un turno de un jugador en tantos estados como el desarrollador desee. Al ser juegos interpretados, únicamente es necesario modificar el programa intérprete para que el mismo juego funcione en diferentes plataformas. Escuela Técnica Superior de Ingeniería (ICAI) Página 76 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 9.2 Trabajos Futuros En cuanto a trabajos futuros, en el campo de juegos para ordenador existen muchas posibilidades de mejora para esta aplicación. Desarrollo de una Inteligencia Artificial: Esta mejora permitiría jugar partidas contra una Inteligencia Artificial que se pudiese adaptar a los diferentes juegos que se desarrollasen para la aplicación. En función del diagrama de estados de los turnos del jugador se podrían realizar partidas de uno o varios jugadores contra una o varias inteligencias artificiales. Desarrollo de la Interfaz Visual: Para realizar unos juegos más amigables para los usuarios finales sería deseable desarrollar un módulo Visual para la aplicación. Este módulo podría ser en un principio en dos dimensiones utilizando la librería SDL o bien en tres dimensiones utilizando motores gráficos ya desarrollados como por ejemplo el Ogre3D. Desarrollo de las Comunicaciones: Por último, se podría desarrollar un módulo de comunicaciones que permitiese partidas entre varios jugadores que no compartiesen el mismo ordenador. Dichas partidas podrían ser o bien en una red LAN o partidas por Internet mediante la compartición de la IP de los diferentes jugadores. Escuela Técnica Superior de Ingeniería (ICAI) Página 77 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 10 Bibliografía Escuela Técnica Superior de Ingeniería (ICAI) Página 78 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador 10.1 Bibliografía [PELL92] Barney Pell. University of Cambridge. METAGAME: A new challenge for Games and Learning. [GUIJ10] Victor Guijarro. La quimera del autómata matemático: del calculador medieval a la máquina analíticade Babbage. [TINY12] http://www.grinninglizard.com/tinyxml/ [BOOS12] http://www.boost.org/ [UNRE12] http://www.unrealengine.com/ [CTUT12] http://www.cplusplus.com/doc/tutorial/ [DEIT98] H. M. Deithel – P. J. Deithel. Como programar en C/C++ (Prentice Hall) [PYTH12] Escuela Técnica Superior de Ingeniería (ICAI) http://www.python.org/ Página 79 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Anexo 1 Manual de Instalación Escuela Técnica Superior de Ingeniería (ICAI) Página 80 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Instalación Python Para el correcto funcionamiento de la aplicación es necesario instalar el intérprete del lenguaje de programación Python para poder leer correctamente las reglas de los juegos. A continuación se puede ver una pequeña guía de instalación de Python bajo el sistema operativo Windows. Existen dos versiones estables de Python disponibles: Python 2 y Python 3. Se aconseja instalar la versión 2 ya que la aplicación ha sido desarrollada utilizando la versión Python 2 aunque con la versión 3 no debería de existir ningún problema. El primer paso será comprobar que no existe una versión de Python instalada anteriormente. Para ello se debe de abrir una ventana de consola y escribir “python”. Si se recibe una respuesta de un intérprete de Python ésta incluirá el número de versión. Como ya se ha comentado anteriormente, por regla general las versiones más recientes de Python mantienen compatibilidad con las versiones antiguas. En caso de no recibir respuesta no existe ningún intérprete instalado en la máquina. Figura 1 – Consola de Comandos Windows Para la instalación de Python es necesario descargarse de la página oficial una versión estable. Dicho instalador consiste en un Wizard amigable en el cual se deberá de indicar la ruta donde se instalará Python y los paquetes que se instalarán. Se recomienda descargar la versión estable más reciente e instalar como mínimo los paquetes Escuela Técnica Superior de Ingeniería (ICAI) Página 81 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador recomendados. Para el desarrollo de la aplicación se ha utilizado la versión Python 2.9 aunque cualquier versión posterior funcionará. El instalador puede descargarse desde la página oficial: http://www.python.org/download/ Instalación Boost Library Es recomendable utilizar el instalador que proporciona la página oficial de Boost (http://www.boost.org) en caso de utilizar Microsoft Visual Studio para su uso ya que el instalador descarga e instala los binarios precompilados sin necesidad de tener que construirlos. La única librería necesaria para el correcto manejo de boost es la librería “BoostPython” tal y como puede verse en la imagen. Figura 2 – BoostPython Escuela Técnica Superior de Ingeniería (ICAI) Página 82 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Tras concluir la instalación se tendrá en la carpeta donde se haya decidido instalarlo la siguiente estructura de directorios: boost_1_49_0\ .................el directorio raiz de Boost index.htm .........una copia de la página www.boost.org boost\ .........................Todas las cabeceras de Boost lib\ .....................Binarios de las libreríasprecompilados libs\ ............Tests, .cpps, docs, etc., ordenador por librería index.html ........documentación de las librerías algorithm\ any\ array\ …más librerías… status\ .........................Boost-wide unidad de test tools\ ...........Herramientas, ejemplo. Boost.Build, quickbook. more\ ..........................Ficheros de licencia, etc. doc\ ...............Toda la documentación necesaria para boost. Escuela Técnica Superior de Ingeniería (ICAI) Página 83 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Localización ficheros XML y .py Tanto los ficheros XML con la información del juego como los ficheros Python con las reglas de éste deben de estar correctamente situados para que la aplicación pueda encontrarlos. Existe una carpeta llamada “recursos” dentro de la aplicación que es donde deben de situarse todos estos ficheros, en especial los archivos XML, inijuego.py y finjuego.py. Figura 2 – Carpeta recursos El resto de archivos .py pueden ir en cualquier otra ruta aunque deberá de ser correctamente indicada en el fichero estados.xml para que la aplicación pueda encontrarlos correctamente Escuela Técnica Superior de Ingeniería (ICAI) Página 84 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 85 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Anexo 2 Manual de Usuario Escuela Técnica Superior de Ingeniería (ICAI) Página 86 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Estructura de Ficheros XML Para el correcto funcionamiento de la aplicación, los ficheros XML utilizados para la Información del Juego deben de seguir una estructura prefijada. Dicha estructura cumple los estándares de la versión 1.0 del lenguaje XML. Dicha versión es una recomendación del W3C (World Wide Web Consortium) desde Febrero de 1998 y que se sigue utilizando actualmente. La nomenclatura tanto del propio fichero XML como de las etiquetas que lo conforman debe de respetarse excepto aquellas etiquetas en las que se indique lo contrario. Estados.xml estados.xml <?xmlversion=”1.0” ?> <estados> <elem> <id>id_estado</id> <name>nombre_estado</name> <acciones> <auto> <nombre>nombre_accion</nombre> <funciones> <funciones_ext>fichero_python</funciones_ext> </funciones> </auto> <salto> <salto_estado>id_estado_salto</salto_estado> <nombre>nombre_estado_salto</nombre> </salto> </acciones> </elem> </estados> El fichero estados.xmles el encargado de indicar a la aplicación los diferentes estados por los que podrá discurrir el turno de un jugador y los posibles saltos de uno a otro. En primer lugar, como en cualquier fichero XML, está la etiqueta <?xmlversión=”1.0” ?>. Esta etiqueta sirve para que la aplicación sepa que el fichero que va a procesar se trata de un fichero XML de la versión 1.0. Escuela Técnica Superior de Ingeniería (ICAI) Página 87 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Cada uno de los diferentes estados que conforman el turno de un jugador se indicará dentro de la etiqueta <elem></elem>. Dichas etiquetas se representarán dentro de la etiqueta global <estados></estados>. Por lo tanto, existirán tanta etiquetas <elem> como estados tenga el turno de un jugador. Cada estado tendrá diferentes atributos obligatorios. Estos atributos se pueden dividir en dos bloques. En primer lugar, los atributos referentes a la identificación del estado. El primer identificador tiene que ser numérico y único y se plasmará con la etiqueta <id></id>. El primer estado que la aplicación tratará de ejecutar será el estado con id 0. El segundo identificador del estado es el nombre que se mostrará durante la partida. Este nombre no tiene que ser necesariamente único aunque es recomendable para evitar confusiones entre estados, aunque es posible que en algún tipo de juego sea necesario sobrecargar estados que tengan el mismo nombre pero que su comportamiento tenga alguna variación. El nombre del estado irá en la etiqueta <name></name>. En segundo lugar es necesario indicar a la aplicación qué acciones deben de realizarse durante este estado y los posibles saltos permitidos. Esta información irá encapsulada en la etiqueta <acciones></acciones>. Dentro de la etiqueta <auto></auto> se indicarán las acciones automáticas que se dispararán nada más entrar el jugador en este estado del juego. Se indicará el nombre de la acción entre la etiqueta <nombre></nombre> y el fichero Python que se tendrá que ejecutar entre las etiquetas <funciones><func_ext></func_ext></funciones>. El fichero Python tendrá que estar en el mismo directorio que el fichero XML y será de la forma nombre_fichero.py. Por último es necesario indicar los posibles saltos que se pueden producir desde ese estado a otros. Estos saltos se indicarán mediante la etiqueta <salto></salto>. Existirán tantas etiquetas <salto> como saltos puedan realizarse desde ese estado. Esta etiqueta tendrá dos atributos: En primer lugar el identificador del estado al que puede saltarse con la etiqueta <salto_estado></salto_estado> y en segundo lugar el nombre del estado al que se salta con la etiqueta <nombre></nombre>. Este nombre será el que se muestre durante el juego para que el jugador elija la opción de salto. El estado final es considerado aquel que no tiene información alguna asignada por lo que es recomendable que en el último estado del jugador exista un salto final a otro estado, “Fin de turno”, con un identificador aún no asignado. Escuela Técnica Superior de Ingeniería (ICAI) Página 88 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador juego.xml juego.xml <?xmlversion=”1.0” ?> <propiedades> <nombre>nombre del juego</nombre> <numJugadores>número de jugadores</numJugadores> <atributo>otros atributos</atributo> </propiedades> El fichero juego.xmles el encargado de indicar a la aplicación las características del juego. En primer lugar, como se ha comentado en los anteriores ficheros XML, está la etiqueta <?xml versión=”1.0” ?>. Esta etiqueta sirve para que la aplicación sepa que el fichero que va a procesar se trata de un fichero XML de la versión 1.0. A continuación existen dos atributos que son obligatorios para todo juego que quiera ejecutarse en la aplicación. Todos los atributos irán incluidos dentro de la etiqueta <propiedades></propiedades>. El primer atributo obligatorio es el nombre del juego. Este nombre se utilizará para mostrarlo durante la partida. Irá dentro de la etiqueta <nombre></nombre>. El segundo atributo obligatorio es el número máximo de jugadores. Este número se utilizará para que la aplicación pueda saber el rango de jugadores permitidos en la partida. Irá dentro de la etiqueta <numJugadores></numJugadores>. A continuación se indicarán el resto de atributos del juego que son particulares e innatos a él. El nombre de la etiqueta puede ser cualquiera y su contenido puede ser tanto numérico como una cadena de texto. Escuela Técnica Superior de Ingeniería (ICAI) Página 89 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Recursos.xml recursos.xml <?xmlversion=”1.0” ?> <recursos> <elem> <id>id_recurso</id> <nombre>nombre_recurso</nombre> <definicion>definicion_recurso</definicion> <atributo>valor_atributo</atributo> </elem> </recursos> El fichero recursos.xmles el encargado de indicar a la aplicación los diferentes recursos de que dispone el juego y que podrán ser utilizados de forma directa o indirecta por el jugador durante la partida. En primer lugar, como se ha comentado en el fichero estados.xml, está la etiqueta <?xml versión=”1.0” ?>. Esta etiqueta sirve para que la aplicación sepa que el fichero que va a procesar se trata de un fichero XML de la versión 1.0. Cada uno de los diferentes recursos que forman parte del juego se indicará dentro de la etiqueta <elem></elem>. Dichas etiquetas se representarán dentro de la etiqueta global <recursos></recursos>. Por lo tanto, existirán tanta etiquetas <elem> como recursos tenga el juego. Para la descripción de un recurso se utilizarán tres atributos fundamentales. El primero de ellos será el identificador, el cual tendrá que ser numérico y único y se plasmará con la etiqueta <id></id>. El segundo identificador del recurso es el nombre que se mostrará durante el juego. Este nombre no tiene que ser necesariamente único aunque es recomendable para evitar confusiones entre recursos. El nombre del recurso irá en la etiqueta <nombre></nombre>. El último atributo fundamental es la descripción o definición del recurso. Esta definición es una pequeña explicación sobre el recurso e irá en la etiqueta <definicion></definicion>. A continuación se indicarán el resto de atributos del recurso que son particulares e innatos a él. El nombre de la etiqueta puede ser cualquiera y su contenido puede ser tanto numérico como una cadena de texto. Por ejemplo en el caso del Risk, a la hora de plasmar en el fichero el recurso “Continente”, podemos indicar los países que lo forman mediante una etiqueta <países>. Escuela Técnica Superior de Ingeniería (ICAI) Página 90 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 91 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador estructuras.xml estructuras.xml <?xmlversion=”1.0” ?> <estructuras> <elem> <id>id_estructura</id> <nombre>nombre_estructura</nombre> <definicion>definicion_estructura</definicion> <atributo>valor_atributo</atributo> </elem> </ estructuras> El fichero estructuras.xmles el encargado de indicar a la aplicación las diferentes estructuras de las que dispone el juego y que podrán ser utilizadas de forma directa o indirecta por el jugador durante la partida. En primer lugar, como se ha comentado en los anteriores ficheros XML, está la etiqueta <?xml versión=”1.0” ?>. Esta etiqueta sirve para que la aplicación sepa que el fichero que va a procesar se trata de un fichero XML de la versión 1.0. Cada una de las diferentes estructuras que forman parte del juego se indicará dentro de la etiqueta <elem></elem>. Dichas etiquetas se representarán dentro de la etiqueta global <estructuras></estructuras>. Por lo tanto, existirán tanta etiquetas <elem> como estructuras tenga el juego. Para la descripción de una estructura se utilizarán tres atributos fundamentales. El primero de ellos será el identificador, el cual tendrá que ser numérico y único y se plasmará con la etiqueta <id></id>. El segundo identificador de la estructura es el nombre que se mostrará durante el juego. Este nombre no tiene que ser necesariamente único aunque es recomendable para evitar confusiones entre estructuras. El nombre de la estructura irá en la etiqueta <nombre></nombre>. El último atributo fundamental es la descripción o definición de la estructura. Esta definición es una pequeña explicación sobre la estructura e irá en la etiqueta <definicion></definicion>. A continuación se indicarán el resto de atributos de la estructura que son particulares e innatos a ella. El nombre de la etiqueta puede ser cualquiera y su contenido puede ser tanto numérico como una cadena de texto. Escuela Técnica Superior de Ingeniería (ICAI) Página 92 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador unidades.xml unidades.xml <?xmlversion=”1.0” ?> <unidades> <elem> <id>id_unidad</id> <nombre>nombre_ unidad</nombre> <definicion>definicion_ unidad</definicion> <atributo>valor_atributo</atributo> </elem> </ unidades> El fichero unidades.xml es el encargado de indicar a la aplicación las diferentes unidades de las que dispone el juego y que podrán ser utilizadas de forma directa o indirecta por el jugador durante la partida. Cada una de las diferentes unidades que forman parte del juego se indicará dentro de la etiqueta <elem></elem>. Dichas etiquetas se representarán dentro de la etiqueta global <unidades></unidades>. Por lo tanto, existirán tanta etiquetas <elem> como unidades tenga el juego. Para la descripción de una unidad se utilizarán tres atributos fundamentales. El primero de ellos será el identificador, el cual tendrá que ser numérico y único y se plasmará con la etiqueta <id></id>. El segundo identificador de la unidad es el nombre que se mostrará durante el juego. Este nombre no tiene que ser necesariamente único aunque es recomendable para evitar confusiones entre unidades. El nombre de la unidad irá en la etiqueta <nombre></nombre>. El último atributo fundamental es la descripción o definición de la unidad. Esta definición es una pequeña explicación sobre la unidad e irá en la etiqueta <definicion></definicion>. A continuación se indicarán el resto de atributos de la unidad que son particulares e innatos a ella. El nombre de la etiqueta puede ser cualquiera y su contenido puede ser tanto numérico como una cadena de texto. Escuela Técnica Superior de Ingeniería (ICAI) Página 93 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Estructura de Ficheros Python Para el correcto funcionamiento de la aplicación, es necesario seguir una serie de indicaciones para que el conjunto de reglas declaradas para el juego tengan validez y se desarrolle correctamente la partida. Existirán tantos ficheros Python como reglas se vayan a declarar en el juego. Cada estado del juego dispondrá de al menos un fichero Python al que poder invocar para ejecutar las acciones correspondientes al estado donde se encuentra. Estos ficheros pueden repetirse por los diferentes estados pudiendo ser invocados desde dos estados completamente diferentes aunque su comportamiento será el mismo por lo que esta opción habrá veces que carezca de sentido. Como ya se ha comentado anteriormente en el apartado de “Estructura de Ficheros XML”, los ficheros Python tienen una extensión *.py la cual deberá de ser indicada obligatoriamente a la hora de referenciarlos en el fichero estados.xml. La nomenclatura del fichero es indiferente aunque se recomienda que sea descriptiva para evitar confusiones. Existen dos ficheros Python muy particulares que deben de existir obligatoriamente aunque su contenido sea vacío. Escuela Técnica Superior de Ingeniería (ICAI) Página 94 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Reglas generales para un fichero Python Cualquier fichero Python que quiera hacer uso tanto de la información del juego como de las funcionalidades que aporta el Kernel de la aplicación deberá de incluir la siguiente línea al principio. import jugador Gracias a este import se podrán utilizar dentro del fichero Python todas las clases definidas en la aplicación (jugadores, recursos, unidades, etc) y, por lo tanto, la mayoría de los métodos inherentes a ellas. A continuación se indican los métodos que pueden utilizarse dentro del fichero Python referentes a los objetos creados en C++. Objetos globales: jugadoractual: Identificador del jugador actual jugadores: Vector con todos los jugadores de la partida recursos: Vector con todos los recursos declarados en el fichero recursos.xml. unidades: Vector con todas las unidades declaradas en el fichero unidades.xml. estructuras: Vector con todas las estructuras declaradas en el fichero estructuras.xml. Métodos: Jugador: o setunidad(unidad): añade una unidad al jugador. o setrecurso(recurso): añade un recurso al jugador. o eliminarrecurso(posición): elimina un recurso del jugador. o getunidad(posición): devuelve una unidad del jugador. o getrecurso(posición: devuelve un recurso del jugador. o addunidadrecurso(recurso, unidad): añade una unidad a un recurso del jugador. o elimunidadrecurso(recurso, unidad): elimina una unidad de un recurso del jugador. o totalunidades(): devuelve el total de unidades del jugador. o totalrecursos(): devuelve el total de recursos del jugador. o setestado(estado): modifica el estado del jugador. Escuela Técnica Superior de Ingeniería (ICAI) Página 95 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador o getestado(): devuelve el estado del jugador. Recurso: o setdefinicion(definicion): añade una definición al recurso. o getdefinicion(): devuelve la definición del recurso. o gettipo(): devuelve el tipo de recurso. o getposicion(): devuelve la posición del recurso. o getnombre(): devuelve el nombre del recurso. o getatributo(atributo): devuelve el valor del atributo indicado. o addunidad(unidad): añade una unidad al recurso. o getunidad(posición): devuelve una unidad del recurso. o eliminarunidad(posición): elimina una unidad del recurso. o totalunidades(): devuelve el total de unidades que tiene el recurso. Estructura: o setdefinicion(definicion): añade una definición a la estructura. o getdefinicion(): devuelve la definición de la estructura. o gettipo(): devuelve el tipo de estructura. o getposicion(): devuelve la posición de la estructura. o getnombre(): devuelve el nombre de la estructura. o getatributo(atributo): devuelve el valor del atributo indicado. Unidad: o setdefinicion(definicion): añade una definición a la unidad. o getdefinicion(): devuelve la definición de la unidad. o gettipo(): devuelve el tipo de unidad. o getposicion(): devuelve la posición de la unidad. o getnombre(): devuelve el nombre de la unidad. o getatributo(atributo): devuelve el valor del atributo indicado. Vector Recursos: o size(): tamaño del vector. o Push_back(): introduce un recurso en el vector. Vector Unidades: o size(): tamaño del vector. o Push_back(): introduce una unidad en el vector. Vector Estructuras: o size(): tamaño del vector. o Push_back(): introduce una estructura en el vector. Escuela Técnica Superior de Ingeniería (ICAI) Página 96 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Vector Jugadores: o size(): tamaño del vector. Otros módulos de Python A continuación se listarán un conjunto de módulos optativos que pueden ser de ayuda a la hora de programar las reglas del juego en Python. Para poder incluir estas librerías se deberá de añadir en la cabecera del fichero: importlibreria Librería Descripción string Operaciones con Strings datetime Tipos básicos de fechas y tiempo collections Tipos de datos de colecciones math Funciones matemáticas random Generar números pseudo-aleatorios cmath Funciones matemáticas para números complejos. hashlib Algoritmo hash para encriptación xml.dom API de DOM (DocumentObjectModel) webbrowser Controlador para navegador web smtpd Librería para gestionar servidor SMTP audioop Librería para la gestión de audio imageop Librería para la gestión de imágenes pdb PythonDebugger zipimport Importar módulos de archivos ZIP Escuela Técnica Superior de Ingeniería (ICAI) Página 97 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Ficheros Python propios de la aplicación Como se ha comentado previamente en la introducción del punto “Estructura de Ficheros Python”, existen dos ficheros que son obligatorios para el correcto funcionamiento de la aplicación. Estos ficheros pueden estar vacíos sin necesidad de tener que ejecutar código alguno aunque es recomendable utilizarlos para el fin que se explica a continuación. inijuego.py Este fichero es leído por el Kernel de la aplicación para inicializar todos los objetos necesarios para el correcto funcionamiento del juego. En este módulo se asignarán los recursos, estructuras y unidades iniciales a los jugadores, se describirán las reglas del juego a los jugadores, etc. Inijuego.py se ejecutará después de leer los ficheros XML con la información del juego y antes de comenzar la partida por lo que su presencia es obligatoria. Se puede utilizar este archivo dentro de los estados del juego para, por ejemplo, la entrada de un nuevo jugador durante la partida ya comenzada. finjuego.py Este fichero es leído y procesado por el Kernel de la aplicación al terminar el turno de un jugador. Su misión es la de proporcionar al juego las reglas de victoria o de fin de juego. Este archivo es obligatorio que exista aunque no es necesario que tenga contenido alguno dentro ya que es posible que exista algún tipo de juego sin final preestablecido. Para indicar que un jugador ha terminado la partida sólo será necesario poner su estado a -1. Escuela Técnica Superior de Ingeniería (ICAI) Página 98 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Escuela Técnica Superior de Ingeniería (ICAI) Página 99 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Anexo 3 Manual de Desarrollador Escuela Técnica Superior de Ingeniería (ICAI) Página 100 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Instalación Microsoft Visual Studio 2008 A continuación se explicarán los pasos necesarios para instalar el entorno de desarrollo Microsoft Visual Studio 2008. En primer lugar aparecerá la siguiente ventana para iniciar la instalación. Figura 1 – Ventana de instalación Después de hacer clic en “Instalar Visual Studio 2008, el instalador nos mostrará la siguiente ventana: Escuela Técnica Superior de Ingeniería (ICAI) Página 101 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Figura 2 – Asistente de instalación Se puede marcar la opción de “Enviar a Microsoft Corporation información sobre la instalación”. Esta opción sirve para mejorar el producto para que en caso de producirse algún error durante la instalación o durante la ejecución del producto enviar un mensaje a Microsoft Corporation. A continuación, nos aparecerá la ventana en la que debemos de introducir el código de licencia y nuestro nombre. Figura 3 – Código de licencia Escuela Técnica Superior de Ingeniería (ICAI) Página 102 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Después el programa de instalación nos pregunta qué se desea instalar. Figura 4 – Opciones de instalación Una vez completados estos pasos nos llevará a la ventana de progreso de instalación. Figura 5 – Ventana de progreso Escuela Técnica Superior de Ingeniería (ICAI) Página 103 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador La instalación tardará varios minutos dependiendo de la máquina en la que se instale y dependiendo de la opción que se haya marcado a la hora de instalar. Una vez instalado nos aparecerá la siguiente ventana. Figura 6 – Ventana de instalación completada Escuela Técnica Superior de Ingeniería (ICAI) Página 104 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Configuración Boost y tinyXml A continuación se explicarían los pasos necesarios para configurar las librerías boost y tinyXml para su correcto funcionamiento en el entorno de desarrollo Microsoft Visual Studio 2008. En primer lugar hay que acceder a las Propiedades del proyecto pinchando en Project ->Properties. Figura 1 – Propiedades de un proyecto Se abrirá una nueva ventana con todas las variables de configuración para nuestro proyecto tanto para el modo Debug como el modo Release. Dependiendo del modo que nos interese modificaremos una configuración u otra. Escuela Técnica Superior de Ingeniería (ICAI) Página 105 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador En ConfigurationProperties->C/C++->General- >AdditionalIncludeDirectories habrá que añadir tanto la librería boost como la de Python tal y como se muestra en la imagen. Figura 2 – AdditionalIncludeDirectories Escuela Técnica Superior de Ingeniería (ICAI) Página 106 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador A continuación hay que desplegar el apartado de Linker y entrar en ConfigurationProperties->Linker->General->AdditionalLibraryDirectories. En este apartado hay que añadir tanto la librería boost como la de Python y tinyXml tal y como se muestra en la imagen. Figura 3 – Additional Library Directories Escuela Técnica Superior de Ingeniería (ICAI) Página 107 Antonio Jesús Berbel Rodríguez-Campra Inteligencia de plataforma para el desarrollo de juegos por computador Por último, para añadir la librería tinyXml hay que desplegar el apartado de Linker y entrar en ConfigurationProperties->Linker->Input- >AdditionalDependencies. En este apartado hay que añadir la librería tinyxmld.lib. Figura 4 – AdditionalDependencies Escuela Técnica Superior de Ingeniería (ICAI) Página 108