tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
511
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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:
    PHP-Code:
    WHERE 
    (($x BETWEEN x+gx-AND x) OR ($x+gx-1 BETWEEN x-gx+AND x))
    AND
    ((
    $y BETWEEN y+gy-AND y) OR ($y+gy-1 BETWEEN y+gy-AND y)) 
    Also gx-1, da x plus gx ja 3 ist, aber es nur um 1 erhöht werden muss.

    Aber das will irgendwie überhaupt nicht funktionieren... Da fehlt mir wiedermals die Logik und ich hoffe mir kann da jemand weiter helfen

    paD
     

  2. #2
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Wie sieht es mit einer einfachen Differenzrechnung aus?

    Code :
    1
    
    WHERE ($x-x-gx)>gx AND ($y-y-gy)>gy
    dient nur als hingekliertes Beispiel und kann logisch falsch sein (nachdenken ist erforderlich ), sieht aber besser aus als diese Between/AND/OR-Arie..

    mfg chmee
    Geä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 <-

  3. #3
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    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 ;-)

  5. #5
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  6. #6
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    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)
    Code :
    1
    
    WHERE (Xjetzt-Xhaus)<Xgröße AND (Xjetzt-Xhaus)>-1
    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.

    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 )
    String bedankt sich. 
    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 <-

  7. #7
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  8. #8
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  9. #9
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    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 chmee
    Geä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 <-

  10. #10
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  11. #11
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    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 chmee
     
    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 <-

  12. #12
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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..?

    paD
    Geändert von String (30.12.11 um 09:14 Uhr)
     

  13. #13
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    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 <-

  14. #14
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  15. #15
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    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 chmee
     
    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 <-

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 25.10.10, 17:25
  2. Antworten: 16
    Letzter Beitrag: 10.10.07, 14:02
  3. MySQL 5.0.16 & MySQL-Administrator 1.1.5 Probleme mit Stored Procedures
    Von DealeyLama im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 28.11.05, 02:11
  4. Antworten: 5
    Letzter Beitrag: 28.02.05, 18:11
  5. Koordinatensystem
    Von jessy_musik im Forum Visual Basic 6.0
    Antworten: 8
    Letzter Beitrag: 16.11.04, 11:36