Considérons une grille de carrés 2 x 2. Un joueur peut se déplacer sur une case si:
- aucun autre joueur ne veut entrer dans la case au prochain tour
- aucun autre joueur n'a attendu et occupe toujours la place ce tour-ci
J'ai inclus l'image ci-dessus pour décrire mon problème.
Les joueurs se déplacent simultanément.
Si 2 joueurs (ou plus) tentent de se déplacer sur la même case, aucun ne bouge.
turn-based
t123
la source
la source
Réponses:
Je pense que cela devrait fonctionner. Cela fonctionne certainement pour le cas que vous avez publié, et quelques autres cas triviaux sur lesquels je l'ai testé.
la source
Résolution des collisions, au lieu de la prévention des collisions.
Déplacez simplement les objets, puis vérifiez s'il y a eu des collisions. S'il y a eu une collision avec un autre bloc, revenez à la case précédente, ou selon le type de jeu, une case différente.
la source
Cela nécessite que chaque joueur se souvienne d'où il vient de se déplacer, afin qu'ils puissent être renvoyés, et aussi qu'ils se souviennent s'ils ont bougé ce tour-ci. Cette deuxième vérification signifie que chaque pièce n'aura besoin d'être retournée qu'une seule fois et devrait garantir que l'algorithme se termine correctement. Cela garantit également que seuls les joueurs qui ont bougé sont renvoyés - l'occupant d'origine peut rester car ils ne sont pas pris en compte pour le retrait.
la source
Une autre solution consiste à utiliser une carte 2x plus grande que ce que vous montrez. chaque fois que vous voulez déplacer des joueurs, vous les déplacez deux fois pour que les joueurs atterrissent toujours sur des tuiles de valeur égale pour X et Y. là encore, il y aura de rares cas qui nécessiteront plus d'attention mais la plupart des cas possibles sont résolus (comme celui que vous décrit) sans réfléchir à deux fois.
la source
Enregistrez tous les mouvements demandés à l'aide d'un tableau ou d'une carte.
En cas de conflit, annulez la demande de déplacement en question. Si cela renvoie l'objet à un carré qu'un autre objet tente d'occuper, annulez la demande de l'objet demandeur.
Pseudo code:
la source
En s'appuyant sur la réponse de SimonW , voici un algorithme explicite:
Soit
squares
un tableau indexé par les emplacements des joueurs et contenant, pour chaque emplacement possible, soit l'index d'un autre emplacement, soit la valeur spécialeNULL
. (Vous souhaiterez peut-être le stocker en tant que tableau fragmenté.) Les valeurs possibles des entrées de ce tableau peuvent être interprétées comme suit:squares[S]
c'est leNULL
, le carréS
est libre de se déplacer.squares[S] == S
, soit le joueurS
ne peut pas ou ne veut pas bouger, soit deux joueurs (ou plus) ont essayé de se déplacer enS
même temps et ont tous deux été refusés.squares[S]
contiendra l'index du carré à partir duquel un joueur veut se déplacer vers le carréS
.À chaque tour, initialisez toutes les entrées de
squares
toNULL
puis exécutez l'algorithme suivant:Après cela, parcourez à nouveau la liste des joueurs et déplacez ceux qui sont capables de le faire:
Étant donné que chaque mouvement ne peut être planifié qu'une seule fois et annulé au plus une fois, cet algorithme s'exécutera en temps O ( n ) pour n joueurs, même dans le pire des cas.
(Hélas, cet algorithme n'empêchera pas les joueurs de changer de place ou de se croiser en diagonale. Il pourrait être possible d'adapter l' astuce en deux étapes de Gajet , mais la façon complètement naïve de le faire ne fonctionnera pas et je suis trop fatigué pour trouver un meilleur moyen tout à l'heure.)
la source