Algorithmus gesucht. (Die Zweite.)

Asteria

Mitglied
Hallo zusammen ! :)

Zweiter Post. Zweiter Algorithmus gesucht.
Diesmal geht es um einen anderen..
..aber es geht immernoch um das Browsergame an dem ich arbeite.

Jeder Spieler darin bekommt bei der Registrierung Koordinaten
auf der Weltkarte zugewiesen, damit man den Abstand und die Reisezeit bestimmen kann.
Mein bisheriger Algorithmus wählt diese Koordinaten per Zufall aus
und weißt sie dann dem Spieler zu. Problem dabei ist natürlich, dass die
Spieler im (Un-)Glücksfall sehr sehr weit von einander entfernt sind.

Jetzt meine Frage: wie weise ich den Spielern Koordinaten zu,
so dass sie in annehmbarer Nähe zueinander stehen und trotzdem
keine Koordinaten doppelt vergeben werden..


Ich danke schonmal im Voraus für eure Hilfe.
Und wünsche noch ein schönes Wochenende! :)
Beste Grüße
 
Du könntest mit der SQL-MAX-Funktion die höchsten bereits vergebenen Koordinaten besorgen und dann +1 drauf rechnen. Ist mir so pauschal eingefallen.
 
Von der Idee her schonma ganz nett.
Aber ich seh trotzdem zwei Hindernisse..
Erstens ist das ja ein Gitternetz also 2 Koordinaten,
wenn ich beide je um einen erhöhe entspricht das
einer Diagonalen, nur einen erhöhen eine Gerade
alles in allem sieht das in der Kartendarstellung ziemlich...schäbig aus :)

Zweitens soll ja auch etwas Freiraum dazwischen sein.
Immer +1 bedeutet zwei Leute sind immer gaaaanz nah aneinander,
außerdem kann nicht Gebirge oder Flüsse dazwischen setzen.. :-/
 
Auch zu beachten wäre das du in einem z.B. 10x10 Quadrat nicht nur 2 oder 3 Spieler in einer geometrischen Linie hast sondern gute 30 bis 50 *wobei 50 schon jeder 2te wäre* Spieler darin verteilst. Der Ansatz die aktuell höchsten Koordinaten zu bestimmen ist nicht ganz verkehrt ... so könnte man ermitteln wie viel von der bisher erzeugten Karte wirklich belegt ist *Prozentrechnung* und bei über schreiten eines gewissen Wertes einfach ein paar Felder nach unten oder zur Seite ... wodurch sich die gesamte Karte vergrößert und man nur dadurch das man EINEN neuen Spieler z.B. 3 Felder zur Seite rausgezogen hat genug Platz für weitere Spieler gewinnt. Exponentiell zur bereits vorhanden Größe.
Was du also suchst ist eine Kombi aus beidem : einmal die Zuweisung von RANDOM-Koordinaten *natürlich mit Check ob bereits belegt -> falls JA -> neue Koordinaten* und zum anderen das die RANDOM-Werte innerhalb der "Maximalwerte" liegen ... und nur falls dieser Bereich VOLL ist wird versucht eine neue Koordinate etwas außerhalb davon zu erzeugen.

Klingt alles relativ kompliziert ... dürfte aber von der Umsetzung mit wenige Zeilen machbar sein.
 
Da ich die Ausgangslage nicht kenne..

Man könnte jeden "neuen" Spieler im Umkreis zu einem anderen Spieler setzen, random natürlich. Punkt des "alten" Spielers + funktion(RadiusRandom, EntfernungRandom). Diesen Punkt könnte man mit all den anderen Spielern vergleichen, ob er nicht schon existiert.

ODER

Man gibt von Anfang an eine per Rauschen erstellte Punkteliste vor, in der man die Spieler verteilt. Abhängig von der Verteilung und deren Indizierung (kreisförmig, oder linear xy etc) kann man den nächstbesten Punkt verteilen. Somit sind (in einer Gitterverteilung) zu Punkt 5/4 ( mit Koordinate P1/P2) die nächsten Nachbarn 4/3 4/4 4/5 .. 6/4 6/5 und womöglich sind auch die nächstliegenden Punkte noch ok.

(grad keine Lust zum Zeichnen :))

mfg chmee
 
Wenn das über eine Random-Funktion gemacht wird, hast du allerdings das Problem, das die Verteilung quasi fragmentiert wird. Eine Möglichkeit wäre dann:

- Erstelle eine Array mit allen möglichen (frei oder belegt ist hier egal) Koordinaten
- Hole alle bereits vergebenen Koordinaten aus der DB
- Lösche alle bereits vergebenen Koordinaten aus dem Array mit allen möglichen raus
- Jetzt hast du alle noch freien Koordinaten
- Aus diesen kannst du Random wählen

Daraus ergibt sich ein weiteres Problem. Du musst auf die Datenbank-Tabelle ein Lock setzen, während neue freie Koordinaten ausgewählt werden. Sonst hast du eine Race-Condition geschaffen, es wäre möglich, das sich zeitgleich zwei Benutzer neu anmelden, die dann die gleichen Koordinaten bekommen. Mit einem Tabellen-Lock (READ) umgehst du das Problem.
 
Das war schonmal eine sehr große Hilfe. Danke.
Ich denke, ich weiß nun auch, wie ich das angehen werde.

Das mit dem SQL Lock würde mich aber noch interessieren.
Ich hab mir das grad auf php.net angeguckt, und wenn ich das
richtig verstehe, ist dann der gesamte Zugriff gesperrt..
Gibt es auch ne Möglichkeit nur bestimmte Zellen der Tabelle damit zu sperren?
Damit die Spieler im Spiel dadurch nicht "behindert" werden!?
 
Die Tabelle wird für den jeweiligen Vorgang gesperrt, das ist korrekt. Wenn du alles richtig machst, bekommen die Benutzer davon nix mit. Wenn ein Prozess die Tabelle lockt (z.B. Lesen) und ein anderer will darauf zugreifen, so muss der zweite warten, bis der erste Prozess den Lock freigeben hat. Im Regelfall wird der Client das abfangen, wenn er zu lange warten muss, läuft er allerdings in ein Timeout.
 
Zurück