Betrachten Sie ein 2 x 2-Gitter von Quadraten. Ein Spieler kann ein Feld betreten, wenn:
- Kein anderer Spieler möchte in der nächsten Runde auf das Feld ziehen
- Kein anderer Spieler hat gewartet und belegt in diesem Zug noch das Feld
Ich habe das Bild oben eingefügt, um mein Problem zu beschreiben.
Spieler bewegen sich gleichzeitig.
Wenn zwei (oder mehr) Spieler versuchen, sich auf dasselbe Feld zu bewegen, bewegt sich keiner.
turn-based
t123
quelle
quelle
Antworten:
Ich denke das sollte funktionieren. Es funktioniert auf jeden Fall für den Fall, den Sie gepostet haben, und für einige andere triviale Fälle, an denen ich es getestet habe.
quelle
Kollisionsauflösung statt Kollisionsverhütung.
Verschieben Sie einfach die Objekte und prüfen Sie, ob Kollisionen aufgetreten sind. Wenn eine Kollision mit einem anderen Block aufgetreten ist, gehen Sie zurück zum vorherigen Feld oder, abhängig vom Spieltyp, zu einem anderen Feld.
quelle
Dies setzt voraus, dass sich jeder Spieler merkt, wo er gerade hingezogen ist, damit er zurückkehren kann, und dass er sich auch daran erinnert, ob er in diesem Zug umgezogen ist. Diese zweite Überprüfung bedeutet, dass jedes Stück nur einmal zurückgegeben werden muss und sicherstellen muss, dass der Algorithmus ordnungsgemäß beendet wird. Es wird auch sichergestellt, dass nur Spieler zurückgegeben werden, die sich bewegt haben - der ursprüngliche Insasse bleibt erhalten, da sie nicht zum Entfernen in Betracht gezogen werden.
quelle
Eine andere Lösung besteht darin, eine Karte zu verwenden, die 2x größer ist als das, was Sie anzeigen. Jedes Mal, wenn Sie Spieler verschieben möchten, verschieben Sie diese zweimal, damit die Spieler immer auf Feldern mit gleichem Wert für X und Y landen. Auch hier gibt es einige seltene Fälle, die mehr Aufmerksamkeit erfordern, aber die meisten möglichen Fälle sind gelöst (wie der von Ihnen) beschrieben) ohne nachzudenken.
quelle
Registrieren Sie alle angeforderten Züge mithilfe eines Arrays oder einer Karte.
Wenn ein Konflikt vorliegt, setzen Sie die betreffende Verschiebungsanforderung zurück. Wenn das Objekt auf ein Feld zurückgesetzt wird, das ein anderes Objekt zu besetzen versucht, setzen Sie die Anforderung des anfordernden Objekts zurück.
Pseudocode:
quelle
Aufbauend auf der Antwort von SimonW folgt ein expliziter Algorithmus:
Sei
squares
ein Array, das von den Player-Standorten indiziert wird und für jeden möglichen Standort entweder den Index eines anderen Standorts oder den speziellen Wert enthältNULL
. (Möglicherweise möchten Sie dies als spärliches Array speichern.) Die möglichen Werte der Einträge in diesem Array können wie folgt interpretiert werden:squares[S]
jaNULL
, kann das QuadratS
frei betreten werden.squares[S] == S
sich entweder der Spieler vonS
nicht bewegen kann oder will oder zwei (oder mehr) Spieler gleichzeitig zu bewegen versuchtenS
und beide abgelehnt wurden.squares[S]
wird der Index des Quadrats enthalten, von dem ein Spieler zum Quadrat wechseln möchteS
.Initialisieren Sie in jeder Runde alle Einträge von
squares
toNULL
und führen Sie dann den folgenden Algorithmus aus:Danach durchlaufen Sie die Liste der Spieler noch einmal und verschieben Sie diejenigen, die dazu in der Lage sind:
Da jeder Zug nur einmal geplant und höchstens einmal abgebrochen werden kann, wird dieser Algorithmus auch im schlimmsten Fall in O ( n ) Zeit für n Spieler ausgeführt.
( Leider hindert dieser Algorithmus die Spieler nicht daran, Plätze zu wechseln oder Pfade diagonal zu kreuzen. Es ist möglicherweise möglich, Gajets Zweistufentrick darauf abzustimmen , aber die völlig naive Art, dies zu tun, funktioniert nicht und ich bin zu müde um einen besseren Weg zu finden.)
quelle