-
Hallo zusammen,
Bei unserem Browsergame benutzen wir ein Koordinatensystem (höhö, wer hätte das gedacht..).
Beispiel:
SQL-Tabelle Häuser:
ID, X, Y, GX, GY
1, 1, 1, 2, 2
2, 1, 3, 1, 1
X/Y ist klar, sind die Koordinaten. GX und GY sind die großen. Also das erste Haus ist 2x2 Felder groß. Klickt der User also auf das Feld 2/2 oder 1/2 kann ich ja nicht aus der DB auslesen WHERE x = $x AND y=$y.
Ich habe es schon so versucht:Also gx-1, da x plus gx ja 3 ist, aber es nur um 1 erhöht werden muss.PHP-Code:WHERE
(($x BETWEEN x+gx-1 AND x) OR ($x+gx-1 BETWEEN x-gx+1 AND x))
AND
(($y BETWEEN y+gy-1 AND y) OR ($y+gy-1 BETWEEN y+gy-1 AND y))
Aber das will irgendwie überhaupt nicht funktionieren... Da fehlt mir wiedermals die Logik und ich hoffe mir kann da jemand weiter helfen
paD
-
28.12.11 10:21 #2
Wie sieht es mit einer einfachen Differenzrechnung aus?
dient nur als hingekliertes Beispiel und kann logisch falsch sein (nachdenken ist erforderlichCode :1
WHERE ($x-x-gx)>gx AND ($y-y-gy)>gy
), sieht aber besser aus als diese Between/AND/OR-Arie..
mfg chmeeGeändert von chmee (28.12.11 um 19:29 Uhr)
Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
Also ich habe jetzt hin und her getestet..Aber ich komme zu keinem Ergebnis. Google ich nach Differenzrechnung und Koordinatensystem scheint es einen Weg zu geben. Aber das in mein Beispiel zu integrieren schaff ich nicht

Bei klick auf 2/2
$x-x-gx bedeutet:
2-1-2 > 2
-1 > 2, also negativ, auch wenn das was steht.
Irgendwie fehlt mir leider immer noch so der zündende Funken
paD
-
28.12.11 13:50 #4
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Google mal nach Dijkstra
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
Kurz gesagt, den Weg des Klicks zum nächsten Haus ausrechnen?
Hilft mir aber doch nur in soweit, dass ich ausrechnet, welches Haus der nächste sein könnte.
Da aber nicht alle Koordinaten gespeichert werden, hilft mir das doch nicht, oder?
Ein Haus, welches auf 2/2 gebaut wurde und 3x3 groß ist belegt die Koordinaten:
2/2, 2/3, 2/4 - 3/2, 3/3, 3/4 - 4/2, 4/3, 4/4
Gespeichert werden aber nur die 2/2 und die Größe, also 3/3.
Klicke ich nun auf 4/2 könnte auch ein Haus auf 4/1 gemeint sein (laut Dijkstra)..?
paD
-
28.12.11 14:09 #6
Differenzrechnung heisst ja nur, dass Du nicht die Positionen an sich vergleichst, sondern die Differenzen - das Ergebnis einer Subtraktion..
Ich sagte ja schon, da ist mit Sicherheit einn logischer Fehler drin, ich habs nur hingekritzelt. Wir nehmen nochmals ein Beispiel. Deine Position (1)
Haus an Position 1,1 mit Größe 2,2
Somit sollte man ein Signal bekommen, wenn man im Bereich 1,1 bis 2,2 anklickt. Das Signal kann entweder heissen, rufe Eigenschaften von Objekt (id) 1 auf oder Nein, Hier kannst Du nicht bauen. Mit der Differenz holen wir uns den gültigen Wertebereich. Wir nehmen nur eine Dimension, denn die zweite wird gleichermaßen sein.
Bei Xjetzt=1 und 2 soll es ein true sein, bei Werten darunter und darüber nicht.
Xjetzt - Xhaus < Xgröße
Xjetzt =0 -> 0-1 < 2 -> -1<2 true
Xjetzt =1 -> 1-1 < 2 -> 0<2 true
Xjetzt =2 -> 2-1 < 2 -> 1<2 true
Xjetzt =3 -> 3-1 < 2 -> 2<2 false
So, da sehen wir nun zwei Fehler
(A) Das "größer als" musste ein "kleiner als" werden. (schon beachtet)
(B) wenn Xjetzt "kleiner als" Xpos ist, ist es auch true.
Die simple Lösung für (B) wäre, eigentlich, wie Du es auch hattest, zwei Bedingungen zu setzen, nämlich zusätzlich zur oberen ein AND (Xjetzt-Xhaus)>-1, dann wäre also die Bedingung (für eine Dimension)
vice versa für die Y-Dimension und deren Variablen. Tatsächlich werden wir auch 4 Bedingungen setzen, alle mit AND, denn ALLE müssen erfüllt sein, um das Signal zu geben.Code :1
WHERE (Xjetzt-Xhaus)<Xgröße AND (Xjetzt-Xhaus)>-1
mfg chmee
(Und ich bin mir sicher, es gibt noch eine Lösung mit nur einer Bedingung pro Dimension, bin aber grad nach dem Mittagessen und denkschwach
)
Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
Hey, dass muss die gleiche Sekunde gewesen sein

Okay, gut. Ich hab mal ein bisschen hin und her gespinnt mit deinem Script.
Also selbst bei eigenen Häusern auf der Karte funktioniert deine Vorgehensweise auch.
Die Abfrage wird, ohne es groß zu testen, mit Sicherheit auch schneller sein als mein BETWEEN Mist.
Wäre es jetzt noch möglich, dass ohne AND für eine Dimension zu lösen wäre es absolut genial
paD
-
Hab das jetzt mal so eingebaut.
Funktioniert super und ist bei 1000 Durchläufen auch sage und schreibe 1,534 Sek schneller
Ich setz mal auf erledigt, aber 100% zufrieden bin ich noch nicht, wenn man mir sagt, es geht wahrscheinlich noch einfacher
paD
-
29.12.11 14:15 #9
Eine Idee wäre (wenns geht) die Subtraktion mittels eines Alias nur einmal durchzuführen. Ausprobieren.
Code :1
(Xjetzt-Xhaus) as Xdiff
(interessant wäre es, wie lange das 1000xfache Durchgehen denn grundsätzlich braucht, dann hat die Aussage 1,5Sek auch einen definierbaren Wert
)
mfg chmeeGeändert von chmee (29.12.11 um 14:22 Uhr)
Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
Das mit dem Alias habe ich schon versucht, funktioniert leider nicht.
Das Script mit dem Between lieft im Schnitt ca. 6,5 Sekunden (mit 1000 Abfragen)
Und das errechnete knappe 4. Hab es 10 mal pro Script laufen lassen und die Mittelwerte genommen.
paD
-
29.12.11 16:00 #11
Probier mal noch folgende Ideen:
anstatt Subtraktion eine Addition mit negativem Wert:
Code :1
(Xjetzt+(-Xhaus))<Xgröße
php-Wert am Anfang statisch als int oder decimal(10,2) deklarieren und dann benutzen.
Code :1 2 3
DECLARE @Xjetzt decimal(10,2) SET @Xjetzt = $phpwert SELECT .. WHERE(@Xjetzt+(-Xhaus))<Xgröße ..
gefunden Hier - http://www.mssqltips.com/sqlserverti...in-sql-server/
mfg chmeeMein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
Fällt dann die zweite Abfrage wirklich weg?
Kann ich mir kaum vorstellen..aber wenn ich es manuell durchrechne, scheint es echt zu funktionieren..
EDIT scheint leider doch nicht zu funktionieren.. sobald ich das ins Script einbaue, findet er alles, aber nicht das Objekt, was er finden soll..
AAABBBERR jetzt hab ich noch ein Problem:
Ich baue ein Haus mit 3x3 Größe.. Wie teste ich jetzt, ob das in eines der belegten Felder reicht..?
paDGeändert von String (30.12.11 um 09:14 Uhr)
-
01.01.12 18:00 #13
So, wie es scheint, zäumst Du die Sache falsch auf.
(Mein letzter Eintrag war auch eher darauf ausgerichtet, die Abfrage mit Tricks schneller zu machen)
Wenn es ein Browsergame ist, dann macht es vielleicht Sinn, die SQL-Abfragen soweit zu minimieren, indem Du den Sichtbereich komplett abfragst und in ein mehrdimensionales Array speicherst. Somit hast Du die Infos, ob bauen oder nicht, ohne SQL-Abfrage. Jedesmal abfragen wird sicherlich nicht nötig sein.. oder?
mfg chmee (frohes neues..)Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
Soweit habe ich auch schon gedacht.
Quasi eine Array-Map anzulegen und prüfen ob gebaut werden darf oder nicht.
Mein Problem:
Beim bauen muss später so oder so geprüft werden, ob wirklich gebaut werden darf.
Weil POST oder GET Variablen zu fälschen ist ja kein Problem. Also ich meinte ca. so:
MAP:
<? php array, mit erlaubt oder nicht erzeugen und an JS übergeben ?>
<JS beim verschieben der Häuser aus dem Array auslesen ob bauen darf oder nicht />
<WENN Bauplatz frei, dann öffne bauen.php?x=1&y=2&hausid=123 >
-> Ich könnte nun aber einfach hingehen und die 1/2 fälschen. Also muss das Script bauen.php so oder so prüfen ob 1/2 belegt ist. Und nur noch da bin ich am scheitern mit dem Problem:
-> Wie überprüfe ich, ob ein Haus das auf 1/1 steht und 3/3 groß ist die Koordinaten 1/3 bedeckt. Oder wenn ein Haus auf 3/3 steht und ich auf 2/2 ein Haus mit der Größe 2x2 bauen will, wirklich gebaut / nicht gebaut werden darf..?
Also die Rechnung von oben in sofern umzuwandeln habe ich leider noch nicht geschafft
Das Optimieren, wenn es wirklich zu langsam wird, geht wohl am besten mit dem Array, was wir später wohl auch einsetzen werden
Du kannst dir das Spiel gerne anschauen. Steht in meiner Signatur. Dort wirst du feststellen, dass es sich um Automaten anstatt um Häuser handelt
paD
-
02.01.12 10:25 #15
Ja, natürlich. Wenn man davon ausgeht, dass primär geguckt und Eigenschaften der Spielgeräte geändert werden, wird die Spielfeldbelegung aus der SQL-DB lediglich beim Bauen ausgelesen. Ich hab noch nicht reingeschaut, aber es scheint, jeder user hat sein eigenes Casino, somit fällt glücklicherweise auch die Echtzeitüberprüfung mit anderen Online-Usern weg. Man kann sich also auf voll auf einen Userzugriff konzentrieren, und dahingehend optimieren - was kann man beim Client abspeichern und was wird aus der DB benötigt.
mfg chmeeMein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
Ähnliche Themen
-
Werte einer Textur auslesen und auf Koordinatensystem übertragen
Von nux95 im Forum Cinema 4DAntworten: 2Letzter Beitrag: 25.10.10, 17:25 -
Probleme mit dem auslesen einer MySQL-DB aus mehreren Formularfeldern
Von h4nnes im Forum PHPAntworten: 16Letzter Beitrag: 10.10.07, 14:02 -
MySQL 5.0.16 & MySQL-Administrator 1.1.5 Probleme mit Stored Procedures
Von DealeyLama im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 28.11.05, 02:11 -
probleme beim auslesen von einer mysql tabelle
Von Bl4dE im Forum PHPAntworten: 5Letzter Beitrag: 28.02.05, 18:11 -
Koordinatensystem
Von jessy_musik im Forum Visual Basic 6.0Antworten: 8Letzter Beitrag: 16.11.04, 11:36



1Danke

Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren