Considere una cuadrícula de cuadrados de 2 x 2. Un jugador puede moverse a una casilla si:
- ningún otro jugador quiere pasar a la casilla el próximo turno
- ningún otro jugador ha esperado y todavía está ocupando la casilla este turno
He incluido la imagen de arriba para describir mi problema.
Los jugadores se mueven simultáneamente.
Si 2 (o más) jugadores intentan moverse a la misma casilla, ninguno se mueve.
turn-based
t123
fuente
fuente
Respuestas:
Creo que eso debería funcionar. Ciertamente funciona para el caso que publicó, y en un par de otros casos triviales en los que lo probé.
fuente
Resolución de colisión, en lugar de prevención de colisión.
Simplemente mueva los objetos, luego verifique si ha habido alguna colisión. Si ha habido una colisión con otro bloque, retrocede a la casilla anterior o, según el tipo de juego, una casilla diferente.
fuente
Esto requiere que cada jugador recuerde de dónde se acaba de mover, para que puedan ser devueltos, y también recuerde si se movieron este turno. Esta segunda verificación significa que cada pieza solo tendrá que devolverse una vez y debe garantizar que el algoritmo termine correctamente. También garantiza que solo se devuelvan los jugadores que se mudaron: el ocupante original puede permanecer ya que no se considera su remoción.
fuente
Otra solución es usar un mapa 2 veces más grande de lo que está mostrando. cada vez que quieras mover jugadores, los mueves dos veces para que los jugadores siempre caigan en fichas con un valor par para X e Y. De nuevo, habrá algunos casos raros que necesitarán más atención, pero la mayoría de los casos posibles se resuelven (como el que descrito) sin pensarlo dos veces.
fuente
Registre todos los movimientos solicitados utilizando una matriz o mapa.
Si hay un conflicto, revierta la solicitud de movimiento en cuestión. Si eso devuelve el objeto a un cuadrado que otro objeto está tratando de ocupar, revierta la solicitud del objeto solicitante.
Pseudocódigo:
fuente
Sobre la base de la respuesta de SimonW , aquí hay un algoritmo explícito:
Sea
squares
una matriz indexada por las ubicaciones del jugador y que contenga, para cada posible ubicación, el índice de otra ubicación o el valor especialNULL
. (Es posible que desee almacenar esto como una matriz dispersa). Los posibles valores de las entradas en esta matriz pueden interpretarse de la siguiente manera:squares[S]
es asíNULL
, el cuadradoS
puede moverse libremente.squares[S] == S
, o el jugadorS
no puede o no se moverá, o dos (o más) jugadores intentaron moverse alS
mismo tiempo y ambos fueron denegados.squares[S]
contendrá el índice del cuadrado desde el cual un jugador quiere moverse al cuadradoS
.En cada turno, inicializar todas las entradas de
squares
aNULL
y ejecute el siguiente algoritmo:Después de eso, recorra la lista de jugadores nuevamente y mueva los que puedan hacerlo:
Dado que cada movimiento solo se puede planificar una vez y cancelar como máximo una vez, este algoritmo se ejecutará en tiempo O ( n ) para n jugadores, incluso en el peor de los casos.
(Por desgracia, este algoritmo no impedirá que los jugadores cambien de lugar o se crucen en diagonal. Podría ser posible adaptar el truco de dos pasos de Gajet , pero la forma completamente ingenua de hacerlo no funcionará y estoy demasiado cansado para encontrar una mejor manera ahora).
fuente