Maths World Tournament (En desarrollo)

murdokiler

Buenas!

Hace unos días pregunté en el foro sobre el desarrollo de un ranking en tiempo real para un juego, tengo experiencia en desarrollo de apps/juegos/web pero nunca me había metido en el tema online, con la ayuda prestada y con ganas de meterme en faena, he decidido desarrollar un juego rápido, con una mecánica sencilla, que me permita ver los problemas que se pueden crear en este tipo de juegos, para después ya meterme de lleno en un proyecto un poco más grande (sigue siendo un juego sencillo, pero si en tema de diseño y programación tiene bastante más trabajo), con algo de experiencia.

Mecánica del juego

El juego va de resolver tantas operaciones matemáticas como sea posible en un tiempo determinado. Todos los jugadores juegan la misma partida al mismo tiempo, es decir resuelven las mismas operaciones y comienzan y acaban a la vez. Al ir acertando los problemas se van sumando puntos. Cada cierto tiempo en la partida se van actualizando los rankings y puedes ver en que posición vas en ese momento de la partida.

La partida durará 90 seg (por ejemplo), cuando acaba se pasa a una pantalla donde se muestra el ranking de la partida y la posición del jugador, en la pantalla del ranking hay una cuenta atrás que indica cuando va a empezar la siguiente partida (30 seg).

Muy sencillo todo, pero me sirve para ver que problemas me puedo encontrar y como ir resolviéndolos para afrontar un proyecto un poco más grande.

Servidor

Es lo que más miedo me daba. Pero con la ayuda que recibí, me lancé a contratar un VPS al final. Al principio iba perdido, nunca había gestionado un servidor, pero cuando asimilas que es como gestionar tu ordenardor solo que en remoto, es decir todo lo que había hecho antes de instalar todo lo necesario pero en el servidor, todo fue rodado.

El servidor lo estoy haciendo en Node.js, para el tema de registros y login utilizo express para hacer las llamadas GET, POST, etc... Para conectar con la db utilizo mongoose, ya que también he instalado mongoDB.

El tema registro y login ya lo tengo terminado, para este juego, al ser tan sencillo, le he puesto que solo pida nick y password, no se puede recuperar contraseña ya que no quería pedir más datos. El registro más que nada es para guardar los resultados para los rankings y que no se solapen los nombres. Utilizo JWT para generar los tokens que después utilizo para realizar las peticiones necesarias.

Para la parte de comunicación en tiempo real con los clientes utilizo sockets.io, y es en la parte que estoy trabajando.

En seguridad voy perdido, es la verdad, utilizo contraseñas encriptadas, jwt, solo tengo abierto el puerto 3000 que es por donde trabaja Node, no tengo accesos a ninguna carpeta pública, el servidor no tiene contraseña, solo se puede entrar mediante llave ssh. Sí alguien me puede aconsejar en este tema o que tengo que tener en cuenta, estaría muy agradecido.

La app de node la tengo corriendo con pm2 para poder correr otras instancias o se reinicie automáticamente.

Cliente

Lo estoy haciendo en Unity, utilizo el asset Best Http Pro para gestionar todo el tema de peticiones http y sockets, es fácil de configurar y de trabajar con él. Los request y sockets los recibo en json.

La parte del cliente no tiene mucho trabajo, ya tengo terminado todo lo que es el login y registro así como controlados todos los errores que pueden surgir (nick repetido, nick corto, errores del servidor). También ya tengo los sockets funcionando con el servidor, pero sin lógica. Puedo recibir y emitir que es lo importante.

Y nada, ya solo queda lo es la mecánica del juego, recibir operaciones y resolver y enviar puntuaciones al servidor.

Diseño

Como ya comenté en la introducción, es un diseño sencillo, no me quería matar ni perder mucho tiempo, ya que es uno de mis puntos débiles y suelo perder mucho tiempo en ello, mi cabeza piensa más como programador que como diseñador, supongo que muchos saben de que hablo xD.

Como se puede ver muy poca cosa, lo justo para que sea funcional e intentando hacer el menos daño posible a ojos ajenos.

Me faltaría por terminar el área de juego así como los rankings.


Mi objetivo es tenerlo terminado para esta semana, en principio está pensado para IOS y Android, aunque he probado que también funcione en WebGL para poder enseñar más fácilmente. No creo que termine publicándolo en las tiendas.

Y nada más, se aceptan consejos, críticas y cualquier cosa que os apetezca.

Un saludo.

murdokiler

Buenas,

Ya he llegado a un punto donde se puede enseñar. Más o menos es el resultado que quería conseguir.

Esta semana haciendo este juego/prueba me ha venido muy bien para ver que problemas podían surgir al hacer un juego con este tipo de online. Que era lo que pretendía con este proyecto.

Aún tiene bugs que corregir, pero creo que se puede probar. Quería dedicarle solo esta semana, y me han faltado un par de cosas por implementar que tengo a medias, el ranking general donde se guardan las mejores puntuaciones de todas las partidas y un sistema de alertas que notifica al jugador si ha perdido o ganado puestos. Ya va a estar complicado dedicarle más tiempo, mañana es día de familia, y el lunes ya quiero empezar con el nuevo juego, un proyecto que va a utilizar mucho de lo aprendido aquí, pero un poco más ambicioso. Aunque no descarto sacar un tiempecillo para arreglar las cositas que faltan.

Este es el tiempo que le he dedicado al desarrollo tanto de la parte servidor como cliente, las sesiones son pomodoros de 25 minutos. No están contadas las horas que pasé el Domingo noche y el Lunes peleando con el servidor para dejarlo preparado.

El juego se puede probar en navegador web con webgl (creo que no funciona en móvil, al menos los que yo he probado) :

WebGL

También he subido una versión para Android por si alguien se anima o le es más cómodo:

APK Android

Un saludo.

B

Buenas, siento dar malas noticias... pero el servidor se puede "trucar" para poner la puntuación que quieras... además se pueden registrar usuarios de una forma muy sencilla....

Dejo el log de como he trucado mi puntuación a 10000

NSFW
1 2 respuestas
Xustis

Aunque puede que no te muestre gráficas, ese juego ya existe, se llama kahoot

#3 como te aburres men, pero muy buena xD

2 2 respuestas
murdokiler

#3 No hombre, muchas gracias por decirlo. Estoy aprendiendo en todo este mundo, así que está claro que voy a cometer fallos.

He pensado en encriptar en el cliente y desencriptar en servidor para evitar esto. Algún consejo de si voy bien por ahí o que debería hacer? Esto para evitar trucar las puntuaciones. El tema del login, lo tengo preparado para hacerlo con email y que sea necesario activar el email, pero como el juego era de prueba no quería molestar a la gente poniendo datos, etc... Supongo que esto no será suficiente tampoco, así que cualquier ayuda es bien recibida. Gracias de nuevo.

#4 Gracias Xustis, la verdad es que no me puse a mirar si ya existía un juego así, supuse que sí, al ser algo tan sencillo, el brain training de Nintendo DS era muy parecido también. Lo he hecho para aprender, tengo un juego pensado con funciones online parecidas a las que he aplicado en este juego que creo que puede funcionar bien, pero no me quería lanzar a por él sin haber experimentado antes.

2 respuestas
B

#4 Jajajaja en cierto sentido llevas razón, lo que estropea todo es que me lo paso bien con estas mierdas! xDD (soy noob, no me pidas más xD)
Además tengo la misma tesitura... ¿como crear un ranking online seguro? Y quise probar a ver si esta implementación tenía algo que pudiese hacerlo viable.

#5 Usar SSL no te va a solucionar nada, SSL es para que terceras personas no lean el tráfico de la red.... pero si el atancante eres tu mismo de poco vale. Existen técnicas como SSL-Pinning... pero tampoco es algo 100% seguro.

Tienes dos escuelas...

  • Escuela moderna: Todo es vulnerable, centra tu tiempo en mejorar otros aspectos del software.
  • Escuela clásica: Haz un diseño intrincado que sea difícil de trucar aunque el resto de software se vea mermado.
    *** Me lo he inventado un poco... xDD

Yo te aconsejo ser de la "escuela moderna", al menos que el fallo se explote y joda la experiencia de tu juego.... No creo que te vayas a encontrar con otra persona que dedique su tiempo libre a intentar joderte el sistema de puntuaciones..

Un fragmento de un e-mail de Linus Torvals:

De hecho, todos los errores normales son muchos más importantes, ya que son más numerosos. No creo que haya que glorificar un agujero de seguridad espectacular, ni tratarlo como si fuera más ´especial´ que un error espectacular de otras características”, escribe Torvalds.

Agrega que la seguridad es importante, pero no más importante que todo lo demás. [...]

1 respuesta
totespare

Una pregunta, por qué no usas el login de google para los usuarios? Te ahorras el registro de usuarios y la peña se ahorra el tema de registrarse. Y probablemente te sea más fácil. Ahora, si lo quieres para web también, o por cacharrear con tu propio servidor, es otro tema.

#5murdokiler:

He pensado en encriptar en el cliente y desencriptar en servidor para evitar esto. Algún consejo de si voy bien por ahí o que debería hacer?

Podrías aplicar algún algoritmo facilongo para encriptar los datos sin quebrarte mucho la cabeza. Es decir, en el momento que alguien vea que esa info no es "legible", por un jueguecillo chorra no creo que vaya a ponerse a probar algoritmos de desencriptación, así que sería algo más como un método disuasorio antes que uno de protección real. Bájate alguna librería de encriptación de c# y no te compliques la vida. O incluso si me apuras, métele un cifrado César a mano y santas pascuas (aunque esto es un poco más cantoso xD).

1 2 respuestas
B

#7 A veces me olvido de que existe el software privativo.... xDDD a mi esas triquiñuelas no me sirven :(
Yo prefiero no usar a Google. Pero por temas ideológicos xD

1 respuesta
totespare

#8 bueno, pero esa es la opción 1, luego tienes lo segundo que te he escrito xD.

1 respuesta
B

#9 Si si.. creo que entendiste que no quiero usar a google por ser software privativo... lo que quise decir es que no puedo meter cifrados porque en mi caso el juego es de código abierto... cualquiera puede modificar el cliente para enviar lo que quiera aunque le meta 60 capas de cifrado al mensaje xDD
No me mola google en tema de login porque suele usar "captchas" y estos se usan para entrenar a robots a identificar cosas...
https://aibusiness.com/recaptcha-trains-google-robots/

Pero si que uso cosas de Google eh... sin ir mas lejos "liquidFun" está desarrollado por Google y es una librería cojonuda!

Siento haber desvirtuado el foro!

1 respuesta
totespare

#10 por software privativo te refieres a privado? No entiendo xd

Joder, te he confundido con #1 xD. Y mi mensaje en #7 iba para #1 claro, no para tu caso, por eso yo ya no estaba entendiendo nada... jajajaja

murdokiler

#6 La verdad es que para este juego no me importa, pero no cuesta nada ponerlo un poco más difícil jeje. Puedo hacer que si no lleva el mismo encriptado la puntuación, no se pueda actualizar. De está forma ya hay que currarselo un poco más, y es lo que dices, para este tipo de juego nadie se va a molestar, o muy poca gente, que le interese investigar un poco más.

No sabía esto de la escuela moderna y clásica, pero como puedes ver tengo que ser de la moderna ya que siempre he dedicado muy poco tiempo al tema de la seguridad xD. No por nada, simplemente porque no me he visto nunca en la necesidad en los proyectos que he trabajado, y es imposible abarcar todo.

Una pregunta, ¿ cómo pusiste las puntuaciones? Con peticiones http o a traves de los sockets?

#7 El tema del login a través google lo tengo implementado en el servidor, con la key de google ya configurada, y vía web (que ahora mismo no tiene) puedes registrarte/loguearte con este sistema. No soy partidario tampoco de estos sistemas en cuanto a utilizarlos yo, pero si que quiero implementar tanto Facebook como google en el próximo proyecto, porque la verdad es que la gente los utiliza, por una parte son prácticos y ahorran tiempo para registrarse. En este proyecto no lo he puesto, porque era más para probar el tema sockets en unity y lo que es la lógica de servidor.

Y la verdad es que en web no he tenido problema en implementarlo, no sé que tal irá en Unity el tema. En Unity, sí que utilice Firebase con el login de google, y era muy fácil de implementar, ahora mismo no tengo claro si puedo utilizar esto mismo, sin usar Firebase.

1 respuesta
B

.

1 respuesta
murdokiler

#13 Gracias uchar, le pegaré un ojo.

Usuarios habituales