He estado trabajando en una arquitectura P2P para juegos seguros y he dividido el problema en cinco subproblemas:
- Modificación ilegal del estado del juego enviado.
- Deja caer tramposos con precisión
- Acordar un estado de juego
- Evitar trampas "mirar hacia adelante"
- Ocultar información confidencial de los oponentes
Los primeros cuatro los tengo casi todos resueltos, pero es el último con el que tengo problemas.
Antes de entrar en detalles, solo quiero preguntar si hay algo que me haya perdido en mi lista de hacer una red p2p "a prueba de trampas". No estoy interesado en trucos como el uso de aimbots, solo estoy interesado en hacer que la red p2p sea tan segura como un servidor centralizado.
Entonces, en mi esfuerzo hasta ahora por ocultar información sensible, me he centrado en la posición de los jugadores en un juego donde la posición de tu oponente no siempre debe ser conocida. El problema se convierte en cómo determinar si debe enviar su posición a su oponente sin conocer la posición de su oponente.
He descartado métodos como que el oponente envíe múltiples posiciones falsas para que pueda comparar las suyas también, ya que su oponente puede abusar fácilmente de dicho sistema, ya que obtendrá su posición si una de las posiciones falsas resulta "visible" desde su posición.
El método en el que me he centrado es uno en el que recibe un "campo visual" de su oponente y puede determinar si debe enviar su posición o no. Sin embargo, este es un problema en juegos como League of Legends, donde el campo visual de tu oponente también es información altamente sensible. He intentado resolver esto transformando el campo visual usando una matriz singular, lo que significa que no puede pasar de la versión transformada del campo visual a la versión original, pero como es una transformación lineal, aún puede determinar si su posición está dentro El campo visual o no.
Sin embargo, esto no funciona perfectamente, el campo visual exacto no se puede restaurar después de la transformación, pero se puede determinar la información sobre las "pendientes" en el campo visual (el campo visual está construido por varias líneas y se puede determinar la pendiente de cada línea) restaurado y esto se puede utilizar para reconstruir relativamente barato el campo visual original.
En esencia, lo que necesito es una función que pueda determinar si una posición es "visible" o no, y la reconstrucción de esta función / campo visual debe ser tan exigente desde el punto de vista computacional que una vez que haya terminado de reconstruir el campo visual, ya no es relevante para El juego en acción. ¿Hay alguna persona súper inteligente que conozca ese método?
Editar gente parece un poco confundida acerca de todo el "campo de visión", así que pretendo dar una explicación más detallada aquí. El campo de visión consiste en grupos de un conjunto de líneas, puede verificar fácilmente si una posición está dentro de uno de estos grupos simplemente verificando de qué lado de la línea está su posición, si está en el mismo lado para todas las líneas de ese grupo que conoce está dentro de ese grupo y, por lo tanto, dentro del campo de visión.
Sin embargo, la información que se envía no es esta línea, sino una transformación de la línea y la transformación (2 por 2 en singular una matriz), aún puede verificar en qué lado de la línea se encuentra su posición al transformarla primero usando la transformación que recibió y comparar ese valor con la línea transformada. La clave aquí es que la transformación es singular, lo que significa que es imposible encontrar un inverso para volver a la línea original. Sin embargo, es posible determinar la pendiente de la línea que hace que la reconstrucción de la línea simplemente verifique en qué lado de la línea transformada se encuentran muchos puntos hasta que haya identificado el origen de la línea mucho más barato computacionalmente que si no lo supiera La pendiente de la línea.
Lo que estoy buscando es un método para determinar si un punto está dentro de un área, donde reconstruir el área a partir del método es imposible (lo cual dudo que exista ya que siempre se puede forzarlo por fuerza bruta) o muy computacionalmente pesado.