Web Analytics

Aleatoriedad determinista

Si, aleatoriedad determinista, si se me permiten los palabros.

Intentando hacer un simulacro de juego por turnos, tipo Colonization o un RPG cualquiera en el que los combates tienen de matemático y de aleatorio, sale un problema.

La parte matemática es una fórmula que diga a partir de cuánta fuerza de ataque se traspasa un escudo y cuánto daño hacer al que se defiende. La parte aleatoria siempre es un dado, de todas las caras que se quiera, pero un dado.

Si se tiene un servidor centralizado donde se ejecuten todas las reglas, no hay problema. Uno dice al servidor a quién ataca y el servidor responderá con todo el cálculo ya hecho. El problema planteado es que la computación sea de par a par.

Todos los clientes son iguales y todos reciben las instrucciones de un jugador para ejecutar sus turnos. Si se calculase en la aplicación cliente el palo que se le va a pegar al otro y se le enviasen los resultados tampoco habría problema, pero tenemos otro añadido que es el presentar la información al usuario. Ocurre que, si se le envía el resultado de los combates, habría que programar un comportamiento aparte para que el otro cliente muestre esos resultados al usuario... ¿Por qué no enviar sólo las acciones del usuario y que se pinten como si el que mueve es el dueño del dispositivo cliente cuando eso ya lo tendríamos programado para la edición del siguiente turno?

Pues qué carajo, eso. Acumularíamos comandos o acciones de usuario y al finalizar su turno se envían al resto de clientes para que se ejecuten como si hubiese un robot pulsando teclas. Al final son datos y los algoritmos de los que dependan ya residen en la otra máquina porque, si no, no estarían jugando.

Pero, claro, el usuario provoca que la aplicación tire un dado para los sorteos de sus ataques y el adversario tiene que ver el mismo resultado porque si no, perderíamos la sincronía entre clientes.

Mi solución pasa por hacer una tabla de números aleatorios e ir usando. Al principio de cada turno se podría sortear una tabla de números dispersos y que se vayan consumiendo en cada operación cuantas tiradas de dados se necesiten. Al final del turno, además de la información de las acciones a realizar, añadimos la lista de números para que quien reciba el turno completo, tenga las mismas tiradas de dados que nosotros.

Esto es un futurible, por ahora, con un Conecta 4 hay trabajo de sobra. Todo se andará.