tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
376
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von cameeel
    cameeel cameeel ist offline Mitglied Platin
    Registriert seit
    Dec 2004
    Beiträge
    677
    Bin gerade dabei ein Online-Browser-Spiel zu programmieren (keine Sorge, nicht sowas wie Galaxy Wars ) und stehe nun vor einem Problem.

    Jedes mal, wenn der User eine Figur (bzw. Blase) auf dem Spielfeld anklickt, muss das Spielfeld neu berechnet werden. Dazu hab ich mir die Funktion "gen_gamefield()" geschrieben. Dort wird das Array, das in einer Session gespeichert wurde, eingelesen und die Daten werden überprüft.
    Um das neue Spielfeld zu errechnen, müssen nun einige Blasen entfernt werden. Da es sich hierbei um eine rekurisve Funktion handeln wird, hab ich mir gedacht, dass ich diese Rechenschritte wiederrum in eine extra Funktion packe.
    Die Daten werden also der Funktion "delete_bubbles()" übergeben. Das funktioniert auch noch, aber die Daten, die dort berechnet werden, werden nicht mehr an "gen_gamefield()" zurückgeben. Das heißt, das Spielfeld wird nicht aktualisiert!

    Nun noch ein bisschen vom Code. Ich hoffe, damit könnt ihr mir sagen, woran das liegt.
    Hinweis: bei "$gamefield" handelt es sich um ein zweidimensionales, nummerisches Array, das die Farbwerte der Blasen des Spielfeldes enthält.
    Ihr könnt euch das Spiel gerne schonmal anschauen.
    Wie ihr seht, wird immer nur die Blase entfernt, die angeklickt wird (weil der Befehl nicht in der delete_bubbles()-Funktion steht sondern in der gen_gamefield()-Funktion).
    PHP-Code:
    <?php
        
    function gen_gamefield() {
              
    // Lade Array Daten
              
    $gamefield $_SESSION['Spieledaten'];
                   
    // Daten der angeklickten Blaße
                  
    $row strip_tags($_GET['row']);
                  
    $col strip_tags($_GET['col']);
                  
    $colour strip_tags($_GET['colour']);
                  
    // ... es folgen weitere Befehle...
      
                 // Die Funktion die die umliegenen Blasen entfernen soll wird aufgerufen:
                  
    delete_bubbles($gamefield$colour$row$col);
      
                  
    // ... es folgen weitere Befehle...
        
    }

        function 
    delete_bubbles($gamefield$colour$row$col) {
                 
    // ... es folgen Befehle um die umliegenen Blasen zu entfernen...
                 // Neu berechneten Daten (Spielfeld) werden zurückgegeben...
                  
    return $gamefield;
        }
    ?>
    So und in "return $gamefield;" liegt, glaub ich, der Fehler, weil die Daten eben nicht zurückgegeben werden ...

    Was ich bereits getestet habe:
    1. Die Daten kommen korrekt bei der Funktion "delete_bubbles()" an.
    2. Die Funktion "delete_bubbles()", die das neue Spielfeld berechnen soll, funktioniert an sich ohne Fehler.
    Ich hoffe mal, ihr könnt mir helfen.
    Sorry, dass das jetzt so lang wurde, aber ich glaub, die Erklärung war notwendig.

    Danke,
    cAm3eel.
     
    Nein, ich bin nicht die Signatur, ich putz hier nur.

    URL's kürzen | Code's speichern

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Wie sieht denn der rekursive Aufruf von delete_bubbles aus? Vielleicht liegt der Fehler ja an der Stelle.

    Außerdem wäre es vielleicht speicherschonender, das Spielfeld per Referenz zu übergeben.
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  3. #3
    Avatar von cameeel
    cameeel cameeel ist offline Mitglied Platin
    Registriert seit
    Dec 2004
    Beiträge
    677
    Zitat Zitat von Matthias Reitinger
    Wie sieht denn der rekursive Aufruf von delete_bubbles aus? Vielleicht liegt der Fehler ja an der Stelle.

    Außerdem wäre es vielleicht speicherschonender, das Spielfeld per Referenz zu übergeben.
    Bei der rekursiven Funktion bin ich noch gar net... erst mal muss die Funktion an sich laufen. (Wenn ich den Code der in "delete_bubbles()" steht ganz normal in die "gen_gamefield()" baue funktoniert alles, deshalb weis ich ja das in der Funktion an sich kein Fehler ist sondern einfach nur die Daten nicht zurückgegeben werden...

    Was genau meinst du mit "per Referenz zu übergeben"?

    Danke,
    cAm3eel.
     
    Nein, ich bin nicht die Signatur, ich putz hier nur.

    URL's kürzen | Code's speichern

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Ein Beispiel zur Übergabe per Referenz:
    PHP-Code:
    <?php

    function ohneReferenz($arg)
    {
        
    $arg 42;
    }

    function 
    mitReferenz(&$arg)
    {
        
    $arg 42;
    }

    $var 0;

    ohneReferenz($var);
    echo 
    $var// Ausgabe: 0

    mitReferenz($var);
    echo 
    $var// Ausgabe: 42

    ?>
    Besonders sinnvoll bei der Übergabe größerer Datenstrukturen, da nicht bei jedem Aufruf eine Kopie angelegt werden muss, sondern nur eine Referenz übergeben wird.

    Zum eigentlichen Problem: Sollte der Rückgabewert des Aufrufs delete_bubbles($gamefield, $colour, $row, $col); nicht in $gamefield gespeichert werden?
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  5. #5
    Avatar von cameeel
    cameeel cameeel ist offline Mitglied Platin
    Registriert seit
    Dec 2004
    Beiträge
    677
    Zitat Zitat von Matthias Reitinger
    Zum eigentlichen Problem: Sollte der Rückgabewert des Aufrufs delete_bubbles($gamefield, $colour, $row, $col); nicht in $gamefield gespeichert werden?
    Naja das ganze soll so funktionieren:
    Die Funktion delete_bubbles() wird in gen_gamefield() aufgerufen und der delete_bubbles() Funktion werden die Daten des Array $gamefield übergeben.
    In delete_bubbles() wird das Array verändert (Datensätze gelöscht, verschoben usw.). Dann soll das Array zurück an die Funktion gen_gamefield() gesendet werden die dann das neue Spielfeld erstellt.

    Danke übrigens für dein Beispiel. Um die Übergabe per Referenz werd ich mich kümmern sobald das eigentliche Problem gelöst ist.

    cAm3eel.
     
    Nein, ich bin nicht die Signatur, ich putz hier nur.

    URL's kürzen | Code's speichern

  6. #6
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Zitat Zitat von cAm3eel
    Dann soll das Array zurück an die Funktion gen_gamefield() gesendet werden die dann das neue Spielfeld erstellt.
    Und genau das meinte ich mit meinem Hinweis. Meiner Meinung nach sollte es eher so aussehen:

    PHP-Code:
    // Die Funktion die die umliegenen Blasen entfernen soll wird aufgerufen:
    $gamefield delete_bubbles($gamefield$colour$row$col); 
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  7. #7
    Avatar von cameeel
    cameeel cameeel ist offline Mitglied Platin
    Registriert seit
    Dec 2004
    Beiträge
    677
    Da ham wers wieder: Kleiner Fehler große Wirkung
    Es funktioniert, danke, super!

    cAm3eel.
     
    Nein, ich bin nicht die Signatur, ich putz hier nur.

    URL's kürzen | Code's speichern

Ähnliche Themen

  1. Länge des Response wird nicht richtig zurückgegeben
    Von Johannes7146 im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 13.10.09, 09:33
  2. Antworten: 4
    Letzter Beitrag: 04.05.08, 14:20
  3. String wird nicht zurückgegeben
    Von maxn im Forum PHP
    Antworten: 6
    Letzter Beitrag: 25.04.08, 09:31
  4. [MySQL4] falls Zeile nicht gefunden wird, soll 0 zurückgegeben werden
    Von Paula im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 01.12.06, 16:31
  5. Antworten: 1
    Letzter Beitrag: 12.04.06, 22:36