Wednesday, October 13, 2010

Game idea: String Wars

Hey! This is my first entry in English, so please bear with me. It will start a (hopefully long) series about game design and programming. Thanks to some tough decisions and support from friends and family, I'll be dedicating some weekly hours to this activity from now on, and I want to share my experience.

Today, I was returning home (I've got quite a distance to travel), and I was thinking about how to put some newly acquired knowledge into a game. We learned the basics of the Finite Difference Method used, among other things, for estimating solutions to the partial differential equation of waves. Basically, estimating functions that satisfy the following:


This can be used to describe the movement of a guitar string over time, or the propagation of a sound wave in the air. I thought it would be interesting to make an iPhone app where you can disturb a string, initially at rest, and watch how it bounces back and forth, following the above equation. Touchscreen would enable interaction to be with the finger, which is nice. But I rejected the idea almost immediately: boring! Then I thought that could be just an element of the whole idea: a sort of bow shooting game where you actually tense the bow's string and the way you do it influences the shot. I liked that, as a start.

I then thought about how to make the bow shooting game more realistic in interface terms. I imagined it could be possible to determine the angle for the arrow using the accelerometer in some clever way...  I still need to make some experiments to see if it is feasible, but it would be fun to aim a shot with your real arm. 



One last concept I'd want to add to this game is the possibility to create a two player online game where you have to kill the other player firing virtual arrows at him. Using the iPhone's GPS, both players' coordinates could be obtained to create their virtual selves and allow the in-game positions to resemble the players' actual physical ones. I'll leave this for the last stages of development because I think it will be the most technically demanding.

I'll keep you updated on any development!
Thanks for reading

Manuel

Monday, September 6, 2010

Genetic Madness: Hide & Seek

Hace un tiempo vengo desarrollando (de gusto, no es que el mundo lo necesite) un framework de Algoritmos Genéticos (GA, por sus siglas en inglés) en Python. Si mal no recuerdo, lo empecé a armar estando en India, ya que lo necesitaba para el trabajo que estaba haciendo allá.

Para los que no sepan qué corno son los GA (y no fueron lo suficientemente curiosos para abrir el link a wikipedia que puse antes), la idea básica es que es un método de optimización algorítmico basado en la selección natural darwiniana. Uno opera sobre una población de soluciones a un problema, selecciona los más aptos (usando una función de fitness que nos dice qué tan buena es una solución), y los combina para obtener una nueva población, agregando alguna que otra mutación cada tanto para hacerlo más divertido :P. Con el correr de las generaciones simuladas, los individuos tienden a aumentar su aptitud (esto es, son mejores soluciones para nuestro problema!).

Hace aproximadamente un mes leí un gran libro referido al tema, escrito por David Goldberg, lo cual me dio un mejor fundamento teórico para mejorar el framework. Tuve ganas de hacer algo así como un juego, muy simple, que use los conceptos de GA, para poder enseñarle a alguien que no tiene idea de programación cómo opera un algoritmo genético. No se me ocurrieron muchas aplicaciones divertidas de GA como para llegar a llamarlas juego, pero uno de los experimentos que hice me pareció interesante como para compartirlo en el blog. La idea básica del programa es la siguiente:

Usando pygame, crea mini ventanitas de distintos colores (sin bordes ni "header", solo cuadraditos de colores). Al clickearlas, se cierran, y es como si el usuario "matara" esa ventanita. Un algoritmo genetico evoluciona la posicion y el color de las ventanitas, donde una ventanita se considera más apta que otra si  perduró más tiempo en el desktop sin ser clickeada. Cada generación dura hasta que no quedan más ventanitas vivas, tras lo cual se reinicia el ciclo (la nueva población de ventanitas se obtiene usando los métodos de selección, mutación y crossover típicos en los algoritmos genéticos).

El resultado: el comportamiento emergente es que las ventanitas se esconden en los iconos del escritorio y se mimetizan con tu desktop (tienden a tener los colores de tu background). Esto quiere decir que mientras más jugás los colores más tienden a ser los de tu background, por evolución artificial... no sé si me expliqué bien pero en este screenshot se ve: (acá está la versión grande)
Probé con varios tipos de fondos de pantalla, pero usando un color simple se ve más claramente. Fue divertido ver como, partiendo de una población inicial de ventanas ubicadas al azar y con colores totalmente aleatorios, de a poco se tendía a que las ventanas imiten el color wallpaper (haciéndolas más difíciles de ver) y se ubiquen en los bordes (llamando menos la atención).

El experimento es muy simple y podría ser refinado de infinitas maneras, pero me pareció una linda forma de mostrar cómo actúa la selección "natural" en cualquier ambiente en el que haya variación y presión sobre los individuos.


Por si a alguno le interesa, acá está el proyecto open-source del framework, actualmente en un muy temprano estado de desarrollo. Pueden bajarse el código de ahí y correrlo en sus máquinas... Y si alguno quiere colaborar con el proyecto no dude en contactarme!

Saludos,
Manuel

Saturday, August 7, 2010

Resultados mini-comptencia: "Feudalismo"


Bueno, terminó la primera mini-competencia de programación!

Hubieron 11 estrategias inscriptas, pertenecientes a 3 concursantes.

Acá está la tabla de posiciones luego de los 80 años de simulación:

  1. RunnerUpFeudalSimulation, con 10013.33 piezas de oro, de Santi
  2. FFBCPN1, con 7734.44 piezas de oro, de Esteban, empate con 3.
  3. ReallyPreventiveFeudalSimulation, con 7734.44 piezas de oro, de Santi
  4. FFBCPN3, con 7609.16 piezas de oro, de Esteban
  5. PreventiveFeudalSimulation con 7416.11 piezas de oro, de Santi
  6. FFBCPN4 con 7303.61 piezas de oro, de Esteban
  7. FFBCPN2 con 6943.88 piezas de oro, de Esteban
  8. Modadicto Aleatorio con 6743.33 piezas de oro, de Marcos
  9. FeudalSimulation, con 6526.11 piezas de oro, de Santi
  10. BaseFeudalSimulation, con 5987.77 piezas de oro, de Santi
  11. Modadicto, con 5987.77 piezas de oro, de Marcos
Y también les dejo el detalle de cuántas familias eligieron qué castillo en cada año. Felicitaciones y gracias a todos los participantes, y un fuerte aplauso para Santi, el indiscutido* ganador!


A mi me divirtió mucho hacer esto, espero que haya sido divertido para ustedes participar. Me hubiera gustado que hayan más participantes, pero bueno, esperemos que en el próximo haya mejor convocatoria. Además, sé de varias personas que llegaron a implementar una solución pero no la presentaron en el concurso. A ellos les digo: Anímense a presentarla! Ni que fuera algo importante este concurso!

* digo indiscutido porque de curiosidad corrí el torneo alrededor de 10 veces más, y en todas las corridas la estrategia ganadora fue RunnerUpFeudalSimulation. Una verdadera estrategia campeona!

Otro dato curioso: corrí varias simulaciones extra agregando una estrategia que elegía siempre una ciudad al azar, y salió siempre más o menos en el 5to o 6to puesto. Estos dos últimos análisis me sacaron la duda de que el problema sea demasiado librado al azar, y que dependiendo de la corrida los resultados pueden ser muy diferentes. Lo que queda a determinar es qué tanto depende el resultado de la cantidad de participantes, o de qué estrategias forman parte. Digamos, ¿qué tan caótico es el juego? Si se agrega UNA estrategia al sistema, los resultados cambian mucho?


Los que tengan ganas (especialmente los participantes) comenten dejando qué análisis hicieron del problema y todo lo que hayan descubierto que les parezca interesante. Gracias de nuevo a todos!

Saludos,
Manu