Como se crean juegos como CM?

Aqui un sitio reservado para los mensajes que no tienen porque ser de estrategia. Siempre respetando las normas generales de conducta y la buena educación, ante todo.
Nihil
Crack - Oberst
Crack - Oberst
Mensajes: 7405
Registrado: 24 Ago 2004, 12:10
STEAM: Jugador

Mensaje por Nihil »

Molinator escribió:
Nihil escribió:Por ejemplo yo en mis años locos de carrera una de las prácticas fue hacer un juego de billar, que si no recuerdo mal programé en turbo pascal sin más (gratis). Quieres darle un tiento a programar una IA? prueba con un juego de tablero simple, opr ejemplo también en la carrera me tocó hacer un juego de Othello.
Casualmente este año he hecho yo el Othello mediante Visual C++, sin IA, todo sea dicho. Aunque el problema en este caso, y en juegos similares, de la IA no seria donde colocar la ficha (tecnicamente se podria mirar la jugada optima, la que mas fichas del contrario gire, sin muchos problemas), el problema serio que yo veo es el ir "mas alla", el evaluar si te puede interesar en un momento dado plantar una ficha en cierta posicion, aunque gire menos fichas, pensando en movimientos futuros.
La solución que yo le di en su día fue que la posición de las fichas también diera ciertos puntos, por ejemplo ocupar una esquina daba muchos puntos y asegurarse puestos en los bordes del tablero también. Amén, por supuesto, del número de fichas en posesión de cada jugador.

Con esos datos y algún otro montas la heurística y después con un proceso de búsqueda en árbol (si yo hago esto el otro podría hacer tal y entonces yo pascual....) puedes profundizar para ver que camino maximiza la heurística, proceso Min/Max de búsqueda en árbol creo recordar que se llamaba...
Imagen
Imagen
Avatar de Usuario
BLAST2003
Veteran - Leutnant
Veteran - Leutnant
Mensajes: 852
Registrado: 07 Oct 2003, 07:56
STEAM: No Jugador
Ubicación: Apuntando a tu torreta
Contactar:

Mensaje por BLAST2003 »

Se tarda años entre varios, que no sólo sabn programar y tienen experiencia sino que conocen y dominan montañas de librerías (dlls).

Saludos
"¿No tienes enemigos? ¿Es que jamás dijiste la verdad o jamás amaste la justicia?" Santiago Ramon y Cajal 1852-1934.
Nihil
Crack - Oberst
Crack - Oberst
Mensajes: 7405
Registrado: 24 Ago 2004, 12:10
STEAM: Jugador

Mensaje por Nihil »

En cuanto a la programación (esto seguro que le suena mucho a los que hayan progrmado) voy a poner dos ejemplos que me sucedieron en la carrera y que ponen de manifiesto que lo de menos es el proceso de programación.

Tema IA (básica)

Teníamos que hacer un programa que jugara a un juego, el juego consistía en lo siguiente, quizás las reglas no sean exactamente así pero han pasado ya más de 10 años y mi memoria flaquea :mrgreen:. Se colocan unas cerillas sobre la mesa, el primer jugador coge una o dos, de ahí en adelante los jugadores cogen como mínimo una cerilla y como máximo el doble de las que ha cogido el otro jugador en el turno anterior, pierde quien se ve obligado a llevarse la última cerilla.

La práctica consistía en que el programa fuera haciendo una búsqueda en árbol (si yo hago esto el otro hara esto otro... y así sucesivamente) y antes de empezar la partida decir si iba a ganarla con seguridad o no, y depues jugarla para demostrarlo claro :-)

El problema es que para que se pudiera decir si ganaba o no al principio sabiendo el número de cerillas iniciales había que explorar todo el arbol y eso provocaba un desbordamiento de pila por falta de recursos cuando el número de cerillas empezaba a crecer, así que la función de busqueda tenía que ser lo suficientemente buena para poder jugar con más cerillas sin que hubiera desbordamiento y en caso de empate entre varios programas el que lo resolviera en menos tiempo.

Pues bien el día que fuimos a entregar la práctica y ver quien había ganado de paso el "concurso" llegamos con mucha expectación (y yo con muchas risas) los números se movían entorno a las 24 cerillas y el cuarto de hora para resolverlo (recordar que eran ordenadores de hace mil años)

Nos metimos en el aula y el que llevaba la práctica empezó a preguntar y la gente empezó a dar sus resultados "18 cerillas" "21" .... uno dijo "32 y tarda más de una hora en resolverlo" los murmullos de admiración se oía por la sala de prácticas.

Cuando me llegó el turno dije "99.999 cerillas porque le había puesto ese límite y tarda menos de un segundo pero no soy capaz de medirlo" os podéis imaginar las risas de la gente y el cabreo del profesor que creo que se iba a hacer el listo el y le había chafado el plan.

De dónde coño salía esa diferencia abismal? la práctica en si era una gilipollez del 15 y yo invertí mis esfuerzos en mejorar los resultados de otra manera.

Pensé que ese juego debía tener algún tipo de truco como que el que empieza siempre gana o alguna cosa de esas, descubrí que para determinado número de cerillas el que empezaba siempre ganaba (o perdía no lo recuerdo pero supongamos que ganaba), además descubrí que ese número de cerillas ganadoras seguía una sucesión (o progresión no recuerdo) así que el resto estaba chupado, el programa caculaba si el número de cerillas de inicio estaba en la sucesión y para jugar lo único que hacía era coger el número de cerillas suficientes para acabar de nuevo en otro número de la sucesión.

Moraleja, saber programar es lo de menos :mrgreen:
Imagen
Imagen
Nihil
Crack - Oberst
Crack - Oberst
Mensajes: 7405
Registrado: 24 Ago 2004, 12:10
STEAM: Jugador

Mensaje por Nihil »

2º Ejemplo los gráficos es lo de menos.

Esto me ocurrió haciendo el billar que os comentaba, yo todo lo que habái programado antes no tenía interfaz gráfica estaba muy emocionado y la verdad es que me costó un mundo intentar acoplarme a ver las cosas de otra manera.

Me curré un tapete muy majo, con sus bolas de colores, el movimiento simultáneo de todas las bolas, los refrescos de pantalla cada pixel, como se metían las bolas por las troneras......

Fue un curro de la ostia, a pocos días de tener que entregar la práctica ya lo tenía todo terminado y me dispuse a comprbar el resultado final, empiezo la partida, pongo el máximo de fuerza a la bola y ZAS empieza a rodar..... pero que cojones pasa!!!! que coño de choque ha sido ese! cuando la bola blanca impacto con la formación de las de colores cada una salió en una dirección totalmente aleatoria, yo había usado unas fórmulas que recordaba de física en cuanto a choque de objetos y calculos de vectores y tal, pero vaya que cada bola tenía vida propia, encima, cada vez que una bola chocaba con otra la energía de ambas se incrementaba y proseguían su camino a más velocidad!!!

Un puto desastre. No os podéis ni imaginar la de horas en los siguientes días que tuve que echar para ver que coño pasaba con mis fórmulas de choque para que aquello pareciera un rodeo en vez de un tapete de billar. Muchísimas más que lo que me costó hacer el resto del programa.

Y no lo conseguí, no me preguntéis que hacía mal porque no lo sé, la pérdida de energía por los choques si que quedó resuelta pero las fórmulas para gestionar el movimiento las hice a partir de lo que me sonaba que era más alguna cosilla que fue metiendo para corregir lo que hacían con el programa en marcha, al final el resultado fue satisfatorio aunque si te fijabas bien en el movimiento de las bolas había algo que no acababa de cuadrar....

Moraleja, los gráficos es lo de menos si las putas bolas no se mueven como debieran :mrgreen:
Imagen
Imagen
sefirot
Veteran - Oberleutnant
Veteran - Oberleutnant
Mensajes: 1108
Registrado: 24 Ene 2007, 20:34
STEAM: No Jugador
Ubicación: Madrid

Mensaje por sefirot »

Menudo tema habeis sacado. Además, la conversación esta adquiriendo cierto tono freaky. Como me gusta :P

En primer lugar puntualizar que no soy informático aunque trabajo con ellos y lo poco que sé de como funciona un juego, lo he leído en algún lado o me lo han contado.Por lo que sé un juego básicamente suele constar de:

Un motor gráfico que se encarga básicamente de renderizar (pintar) las imagenes por pantalla o hacer cosas sencillas como detectar colisiones

Un motor físico que se dedica a calcular todos los parámetros físicos del juego. Dependiendo del juego, la importancia de este puede ser nulo (Wargame con hexágonos) a super importante (un Shooter en 3D). Puede parecer un tema menor, pero conseguir que cuando un vehículo se desplaza por un terreno ondulado, el movimiento parezca real o que las explosiones no sean un mero flash que aparece en la pantalla, se las trae y se usan modelos físicos y matemáticos bastante complejos. Si se trata de un juego de carrera de coches o un simulador de un avión, ya ni hablamos.

Un motor lógico que define como interactuan todos los elementos entre si, como por ejemplo como calcular los puntos de vida, como abrir una puerta, que pasa si disparo a través de una ventana, ... Normalmente en este caso, lo que se suele hacer, es desarrollar el enorme conjunto de funciones en un lenguaje de alto nivel orientado a objetos (p.ej. C++) y organizarlo en forma de una librería jerarquizada. Para facilitar la vida a los desarrolladores de escenarios, normalmente se desarrolla una capa intermedia (i.e un interprete) para que se pueda interactuar con el motor lógico mediante algún lenguaje de scriptting de más alto nivel (p.ej. Python o un lenguaje propio). Además, el motro lógico suele incorporar un motor de eventos para simplificar la creación de escenarios. En shooters más antiguos (Medal of Honor, Call of Duty) cantaba un montón ya que nada más cruzar una puerta automáticamente surgian de la nada un par de enemigos o al cruzar una esquina aparecía el dichoso tanque.

Una IA. Yo creo que como bien se ha dicho, esta es la madre de todos los corderos y es donde radica que un juego sea bueno o no. Por lo que intuyo y se deduce de los manuales/editores, al ser un tema extremadamente complejo los juegos la suelen dividir en varias capas.

Una primera capa a la que podríamos llamar IA táctica en la que se calculan/determinan como se comportan las unidades individualmente: en el caso de un shooter, alguien me dispara por lo que respondo al fuego, me escondo detrás de un barril .... o en el caso de un Wargame, dadas las fuerzas que tengo en un punto cual es la combinación óptima de ordenes para conquistar un hexágono dado o como desplazarme de A a B (pathfinding). Normalmente esta parte es de bajo nivel y está hardcodeada y no es modificable.

Una segunda capa que suele usarse para establecer el comportamiento "local", por ejemplo en un shoter una unidad me dispara mientras otra intenta rodearme o en un wargame como organizar las fichas para establecer una posición defensiva en unas colinas.

Finalmente una I.A. de más alto nivel (llamemosla estratégica) que define un poco el plan de la I.A. para un escenario dado. Por ejemplo, si tomo la ciudad A ponte en situación defensiva, si destruyo un 10 % de sus fuerzas lanza un contrataque. Esta parte puede ser "escriptable" (p.e.j en el TOAW en el que el comportamiento de la I.A. a alto nivel es determinado por el desarrollador del escenario) o la determina el programa automáticamente a pertir de una serie de reglas (un ETR en un mapa aleatorio). Aunque, obviamente, cada programa es un un mundo y se pueden definir cuantos niveles se quieran.

Sin tener ni idea, hacer un motor gráfico para un juego que no pretenda competir en el campo de las 3D con los efectos que me permite generar la ultima tarjeta gráfica de 600 €, debe ser bastante trabajo pero existe bastante documentacion y a malas se puede comprar una licencia de motor gráfico sencillo (o algo desfasado).

Para la parte física, más de lo mismo. O bien te pillas una licencia si quieres hacer pijadas (p.ej. Havoc) o bien te lo curras, tu mismo. En este caso, debe existir bastante literatura y por ejemplo, calcular el efecto de una explosión sobre el terreno en un juego como el Combat Mission no debe ser extremadamente complejo.

La parte del motor lógico no deja de ser programación "clásica" y lo único que se necesita es echarle horas y más horas.

Finalmente, el caso de la I.A. me parece el más difícil ya que en mi opinión es más un arte que una ciencia. Por ejemplo pongamos el juego del ajedrez que es un juego con unas reglas relativamente sencillas (nada que ver con los tochos de más de 200 páginas que llevan algunos Wargames) y sin embargo, es realmente difícil definir en una hoja de papel que reglas tiene uno que seguir para ser un buen jugador o un completo inutil. Hace un tiempo y por simple curiosidad estuve mirando por la Web y salvo para problemas puntuales como el algoritmo A* que ha citado Molinator o los sistemas "expertos" (por experiencia en otros campos, no creo demasiado en ellos...) , es casi imposible encontrar nada. Entre que la gente del mundo Universitario parece no darles demasiada importancia y las compañias guardan como oro en paño este tipo de conocimiento, es como un conocimiento oculto en el que alguien te tiene que iniciar.
sefirot
Veteran - Oberleutnant
Veteran - Oberleutnant
Mensajes: 1108
Registrado: 24 Ene 2007, 20:34
STEAM: No Jugador
Ubicación: Madrid

Mensaje por sefirot »

Por cierto después del rollo que he metido :sleep: , se me ha olvidado comentar que los motores de los primeros Quake o Unreal son libres y su código fuente es decargable. Yo hará un par o tres de años me descargué el del Quake por simple curiosidad y si no recuerdo mal estaba escrito en C puro y duro :shock: Además, eran miles y miles de líneas y había que echarle un montón de horas para intentar sacar algo en claro y ni lo intenté.

En la Wikipedia (como no) hay una lista de todos los motores gratuitos, así que si os sobra tiempo este verano ... (http://en.wikipedia.org/wiki/List_of_game_engines)
Responder