hallo,
ich beschaftige mich gerade mit der erstellung einer karte für unser browsergame.
ich dachte ich mache eine mit x/y Koordinaten. ich wollte es so machen wie hier bei diesem tread:
http://www.galaxy-news.de/forum/viewtopic.php?t=1207&postdays=0&postorder=asc
ich habe da alles verstanden. nun stellt sich mir aber die frage, beim erstellen von neuen accs und den dazugehörigen städten.
ich dachte das in der mitte der karte der 0/0 punkt ist, und es dan nach aussen ins plus un minus geht.
aber ich frage mich gerade, wie stelle ich es an, da die neuen accs(und die dazugehörigen städte) dann von innen nach aussen kreisförmig erstellt werden? ich habe absollut keine idee.
mfg Roland
X/y Koordinaten-Karte und neue accs
gepostet vor 18 Jahre, 8 Monate von planetenkiller
gepostet vor 18 Jahre, 8 Monate von Kallisti
There is more than one way to do it...
Genau DAS ist doch Programmieren, sich selbst fuer so etwas eine Loesung ueberlegen.
Du wirst nicht darum herumkommen dir irgendwie zu merken, welche gebiete bereits belegt sind.
z.B. koenntest du es wie eine Schnecke belegen
fghijklm
e 234 n
d 1 5 o
c 6 p
ba987 q
usw... du musst dir dabei nur an einer Stelle "merken" wo du bist. Entweder nur die Stelle (also ein COUNT(*) auf deine user tabelle) und selbst fix per schleife durchlaufen, das ist wohl das einfachste, aber unperformanteste... oder indem du die x und y pos auf der Karte und die "Drehrichtung" speicherst. Das ist aber ein wenig tricky, da du ja zudem wissen musst wann in welche Richtung gedreht wird...
Wenn du nun die so berechneten x und y Positionen * 50 nimmst und darauf +- rand(0,25) addierst, hast du eine huebsche Verteilung.
PS: Wieso ist das code BB Tag hier im Forum nicht monospace? Das ist doch Mist..
Genau DAS ist doch Programmieren, sich selbst fuer so etwas eine Loesung ueberlegen.
Du wirst nicht darum herumkommen dir irgendwie zu merken, welche gebiete bereits belegt sind.
z.B. koenntest du es wie eine Schnecke belegen
fghijklm
e 234 n
d 1 5 o
c 6 p
ba987 q
usw... du musst dir dabei nur an einer Stelle "merken" wo du bist. Entweder nur die Stelle (also ein COUNT(*) auf deine user tabelle) und selbst fix per schleife durchlaufen, das ist wohl das einfachste, aber unperformanteste... oder indem du die x und y pos auf der Karte und die "Drehrichtung" speicherst. Das ist aber ein wenig tricky, da du ja zudem wissen musst wann in welche Richtung gedreht wird...
Wenn du nun die so berechneten x und y Positionen * 50 nimmst und darauf +- rand(0,25) addierst, hast du eine huebsche Verteilung.
PS: Wieso ist das code BB Tag hier im Forum nicht monospace? Das ist doch Mist..
gepostet vor 18 Jahre, 8 Monate von planetenkiller
hmm, das mit der schnecke ist eine gut idee. aber ich vertehe nicht ganz wie du das meinst?
gepostet vor 18 Jahre, 8 Monate von KEEN
Du könntest auch einfach für jedes Feld den Radius vom Mittelpunkt berechnen und dann dem neuen Spieler das Feld mit dem niedrigsten Radius das noch frei ist geben.
gepostet vor 18 Jahre, 8 Monate von Störti
Diese Lösung würde aber nur funktionieren, wenn es keine "Felder" oder ähnliches gibt, sondern nur Städte. Denn sonst haben sich recht schnell in der Mitte der Karte sehr viele Städte konzentriert und keiner kann mehr expandieren.
Weitere Möglichkeit:
Berechne den zur Zeit grössten Abstand einer Stadt zum Mittelpunkt und addiere dazu einfach eine 1. Dann suchst du aus der DB alle Felder raus, die gerundet den neu errechneten Abstand haben und suchst dir zufällig eins aus.
Einziges Problem, was dann noch ist, ist die Tatsache, dass die Gegend immer ländlicher wird, je weiter du vom Zentrum weg bist, denn der Radius wird immer grösser, aber die Zahl der Städte pro "Umkreis" bleibt gleich. Aber das kann man durch eine "1/x" ähnliche Funktion ausbessern.
Weitere Möglichkeit:
Berechne den zur Zeit grössten Abstand einer Stadt zum Mittelpunkt und addiere dazu einfach eine 1. Dann suchst du aus der DB alle Felder raus, die gerundet den neu errechneten Abstand haben und suchst dir zufällig eins aus.
Einziges Problem, was dann noch ist, ist die Tatsache, dass die Gegend immer ländlicher wird, je weiter du vom Zentrum weg bist, denn der Radius wird immer grösser, aber die Zahl der Städte pro "Umkreis" bleibt gleich. Aber das kann man durch eine "1/x" ähnliche Funktion ausbessern.
gepostet vor 18 Jahre, 8 Monate von planetenkiller
@Störti:
eigenlich wollte ich nur die x/y daten in die db eintragen die schon besetzt sind, denn wenn ich die anzeigen will, und alle drin sind, müsst ich dan je na anzahl felder die ich anzeigen will entsprechende abfragen machen, was den performancelastig wird.
@KEEN
störti hat irgend wie recht.
mal neben bei. du bist ja der entwickler von Travian, und muss sagen das ich vom game begeistert bin, ist echt cool.
wie habt ihr es den bei euch gemacht, ihr habt ja auch felder und es wird immer schön ,nach ausen im kreis, die neuen spieler angeordnet?
mfg Roland
eigenlich wollte ich nur die x/y daten in die db eintragen die schon besetzt sind, denn wenn ich die anzeigen will, und alle drin sind, müsst ich dan je na anzahl felder die ich anzeigen will entsprechende abfragen machen, was den performancelastig wird.
@KEEN
störti hat irgend wie recht.
mal neben bei. du bist ja der entwickler von Travian, und muss sagen das ich vom game begeistert bin, ist echt cool.
wie habt ihr es den bei euch gemacht, ihr habt ja auch felder und es wird immer schön ,nach ausen im kreis, die neuen spieler angeordnet?
mfg Roland
gepostet vor 18 Jahre, 8 Monate von KEEN
Da wirds genau so gemacht wie ich beschrieben habe. Ich habe eine Karte die bereits zum Spielstart mit Daten gefüllt ist. Bei jedem 4. Feld wir beim Setup der Radius vom Nullpunkt aus eingetragen. Bei der Anmeldung wird dann das Feld mit dem niedrigsten Radius wo noch kein Dorf steht ausgesucht.
Diese Lösung würde aber nur funktionieren, wenn es keine "Felder" oder ähnliches gibt, sondern nur Städte. Denn sonst haben sich recht schnell in der Mitte der Karte sehr viele Städte konzentriert und keiner kann mehr expandieren.
Ne funktioniert bei Travian ja auch. Und da gibts zwischen den Dörfern auch immer Freiräume.
Original von Störti
Diese Lösung würde aber nur funktionieren, wenn es keine "Felder" oder ähnliches gibt, sondern nur Städte. Denn sonst haben sich recht schnell in der Mitte der Karte sehr viele Städte konzentriert und keiner kann mehr expandieren.
Ne funktioniert bei Travian ja auch. Und da gibts zwischen den Dörfern auch immer Freiräume.
gepostet vor 18 Jahre, 8 Monate von Sarge
Original von KEEN
Original von Störti
Diese Lösung würde aber nur funktionieren, wenn es keine "Felder" oder ähnliches gibt, sondern nur Städte. Denn sonst haben sich recht schnell in der Mitte der Karte sehr viele Städte konzentriert und keiner kann mehr expandieren.
Ne funktioniert bei Travian ja auch. Und da gibts zwischen den Dörfern auch immer Freiräume.
Das ist aber auch nur weil du eben nicht jedes Feld im vorneherein mit in die Kandidatenmenge genommen hast Ansonsten hätte Störti schon recht gehabt.
Eine kleine und leichte aber nicht gerade irrelevante Nebeninformation
gepostet vor 18 Jahre, 8 Monate von Krisch
Also eine etwas aufwendigere Variante:
Die Idee ist, dass man die Karte in viele Kreise einteilt und erst wenn die inneren Kreise besetzt sind, die äusseren besetzt werden.
- Anzahl der Städte bestimmen (für Radius-Bestimmung)
- Radiusbereich festlegen in dem die neue Stadt liegen soll, d.h. den Mindest- und Maximalabstand bestimmen (wie Störti schon gesagt hat, darauf achten, dass es nicht zu ländlich wird)
- per Zufall ein Feld im Kreisbereich auswählen
- schauen ob das Feld belegt ist
Je nach Umsetzung sind mehrere DB-Abfragen notwendig. Weil die Festlegung aber immer nur einmal pro Spieler gemacht werden muss, braucht man sich nicht so viel Sorgen um die Performance machen.
Falls man ein Spiel hat in alle (auch leere) Felder in der DB gespeichert werden, kann man die letzten beide Schritte und das Einfügen in einer Abfrage unterbringen (Stichwort: Order By Rand()). Falls man Subqueries hat die auch aus der zuveränderten Tabelle abfragen dürfen (also nicht MySQL), kann man sogar alles in einer Abfrage machen.
Außerdem muss man beachten, dass Städte verschwinden können. Daher muss man entweder die Zahl der gelöschten Städte speichern oder für jeden Radiusbereich extra berechnen ob er voll ist. Sonst passiert es irgendwann wenn sich die Spielerzahl eingependelt hat, dass alle im selben Bereich liegen.
Die Idee ist, dass man die Karte in viele Kreise einteilt und erst wenn die inneren Kreise besetzt sind, die äusseren besetzt werden.
- Anzahl der Städte bestimmen (für Radius-Bestimmung)
- Radiusbereich festlegen in dem die neue Stadt liegen soll, d.h. den Mindest- und Maximalabstand bestimmen (wie Störti schon gesagt hat, darauf achten, dass es nicht zu ländlich wird)
- per Zufall ein Feld im Kreisbereich auswählen
- schauen ob das Feld belegt ist
Je nach Umsetzung sind mehrere DB-Abfragen notwendig. Weil die Festlegung aber immer nur einmal pro Spieler gemacht werden muss, braucht man sich nicht so viel Sorgen um die Performance machen.
Falls man ein Spiel hat in alle (auch leere) Felder in der DB gespeichert werden, kann man die letzten beide Schritte und das Einfügen in einer Abfrage unterbringen (Stichwort: Order By Rand()). Falls man Subqueries hat die auch aus der zuveränderten Tabelle abfragen dürfen (also nicht MySQL), kann man sogar alles in einer Abfrage machen.
Außerdem muss man beachten, dass Städte verschwinden können. Daher muss man entweder die Zahl der gelöschten Städte speichern oder für jeden Radiusbereich extra berechnen ob er voll ist. Sonst passiert es irgendwann wenn sich die Spielerzahl eingependelt hat, dass alle im selben Bereich liegen.
gepostet vor 18 Jahre, 8 Monate von RedMax
Ich mache es in ungefähr so :
$x= sin($random);
$y= cos($random);
&x= round($x * pow($number, 0.55));
$y= round($y * pow($number, 0.55));
Wobei $number die Anzahl der bereits gesetzen Dörfer/Burgen/etc ist.
Das ganze in einer Schleife, bis eine Position gefunden wurde, und schon hat man eine kreisförmige Verteilung vom Mittelpunkt 0|0 aus.
$x= sin($random);
$y= cos($random);
&x= round($x * pow($number, 0.55));
$y= round($y * pow($number, 0.55));
Wobei $number die Anzahl der bereits gesetzen Dörfer/Burgen/etc ist.
Das ganze in einer Schleife, bis eine Position gefunden wurde, und schon hat man eine kreisförmige Verteilung vom Mittelpunkt 0|0 aus.