Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Java-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
//wozu n? //public int[][] Floodfill(int x, int y, int n, int[][] Array1, int xZiel, int yZiel) { public int[][] Floodfill(int x, int y, int[][] Array1, int xZiel, int yZiel) { int[][] Array2 = new int[20][20]; //temp map //wurden nirgendwo benutzt...? //String Wert; //String[] WertBereich; Stack<String> stack = new Stack<String>(); //stack.push(x + "," + y + "," + n); stack.push(x + "," + y); //add first entry while(!stack.isEmpty()) { ElementTeile = Element.split(",");//split entry x = Integer.parseInt(ElementTeile[0]); y = Integer.parseInt(ElementTeile[1]); //n = Integer.parseInt(ElementTeile[2]); //? Element = stack.pop(); //del entry Array2[x][y] = Array2[x][y] + 1; //set pathcost //hier notausgang einrichten! if (x == xZiel && y == yZiel) { //exit while??? kenne den Befehl zum verlassen nicht // glaube er heisst break; } if (x > 0) { //links if (Array1[x-1][y] == 0 && Array2[x-1][y] == 0) { //nur pushen wenn 'erreichbar' Array2[x-1][y] = Array2[x][y]; stack.push((x-1) + "," + y); } // end if } // end if if (y > 0) { //oben if (Array1[x][y-1] == 0 && Array2[x][y-1] == 0) { //nur pushen wenn 'erreichbar' Array2[x][y-1] = Array2[x][y]; stack.push(x + "," + (y-1)); } // end if } // end if if (x < 19) { //ich würde hier vorschlagen eine Globale oder Klassenvariable //wie MapWidth oder ähnliches zu benutzen statt fixer Werte... if (Array1[x+1][y] == 0 && Array2[x+1][y] == 0) { //nur pushen wenn 'erreichbar' Array2[x+1][y] = Array2[x][y]; stack.push((x+1) + "," + y); } // end if } // end if if (y < 19) { //ich würde hier vorschlagen eine Globale oder Klassenvariable //wie MapHeight oder ähnliches zu benutzen statt fixer Werte... if (Array1[x][y+1] == 0 && Array2[x][y+1] == 0) { //nur pushen wenn 'erreichbar' Array2[x][y+1] = Array2[x][y]; stack.push(x + "," + (y+1)); } // end if } // end if } // wend //da ich mich nicht auskenne; aber muss stack nicht noch gelöscht werden? //delete[] stack //? return Array2; } // end function |
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »EternalPain« (05.04.2013, 17:55) aus folgendem Grund: kleinere Korrekturen
Quellcode |
|
1 2 3 4 5 6 7 8 9 |
Element = stack.pop(); 'hier gibst Du das Element aus stack frei ElementTeile = Element.split(","); 'hier willst du ein element das nicht mehr existiert auseinandernehmen.... x = Integer.parseInt(ElementTeile[0]); y = Integer.parseInt(ElementTeile[1]); n = Integer.parseInt(ElementTeile[2]); |
n ist bei meinem Beispiel oben unnötig, die Entfernungen ergeben sich von selbst...
hast du es mal ausprobiert? funktioniert es? und wenn, sieh Dir die Ausgabe an...
Warum dein Code gar nicht geht erklärt sich vorallem hier:
Quellcode
1 2 3 4 5 6 Element = stack.pop(); 'hier gibst Du das Element aus stack frei mach stack.pop unter den split, könnte gehen... Ich dachte ein Element aus dem Stack wird der Variable "Element" zugewiesen, das Stack-Element kann dann ruhig nicht mehr gespeichert sein, da es ja die Variable nun enthält, ich glaube [code]Element = Stack.pop();Element.Split(...)
ist das selbe wie
Quellcode
1 ElementTeile[] = Stack.pop().Split(...)
falls das letztere so überhaupt funktioniert.
solltest dir aber trotzdem mal ansehen und durchlesen was hier gepostet wird, sonst wird das hier ein Selbstgespräch...
Ich habe natürlich alles gelesen, ich dachte mein Code ist auch richtig, wie er hier beschrieben worden ist, umgesetzt worden, zumindest Teilweise, aber eine Lösung für den aktuellen Codeausschnitt, oder einen Hinweis, wurde hier noch nicht gepostet.Edit: sorry, mir ist jetzt erst klar wie das stack beispiel funktioniert... mit einer linkedlist wärs für mich einfacher... vergiss den Beistrag hier
Ok, aber würde es denn einen Unterschied machen, ob ich einen Stack benutze, oder eine Linkedlist?
Falls jemandem noch etwas einfällt wäre ich sehr dankbar.
Gruß,
MitgliedXYZ
Genau. Und dein Computer hat den Weg falsch berechnet. ;-)Edit: Die Forensoftware hat die Zitate falsch formatiert
Java-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
package pathfind; //import java.awt.Point; import java.util.Stack; import java.io.*; public class Pathfind { public void Pathfind(){} public int[][] Floodfill(int x, int y, int[][] Array1, int xZiel, int yZiel) { int[][] Array2 = new int[20][20]; //temp map //wurden nirgendwo benutzt...? String Element; String[] ElementTeile; Stack<String> stack = new Stack<String>(); //stack.push(x + "," + y + "," + n); stack.push(x + "," + y); //add first entry while(!stack.isEmpty()) { Element = stack.pop(); //del entry ElementTeile = Element.split(",");//split entry x = Integer.parseInt(ElementTeile[0]); y = Integer.parseInt(ElementTeile[1]); //n = Integer.parseInt(ElementTeile[2]); //? Array2[x][y] = Array2[x][y] + 1; //set pathcost //hier notausgang einrichten! if (x == xZiel && y == yZiel) { //exit while??? kenne den Befehl zum verlassen nicht // glaube er heisst break; } if (x > 0) { //links if (Array1[x-1][y] == 0 && Array2[x-1][y] == 0) { //nur pushen wenn 'erreichbar' Array2[x-1][y] = Array2[x][y]; stack.push((x-1) + "," + y); } // end if } // end if if (y > 0) { //oben if (Array1[x][y-1] == 0 && Array2[x][y-1] == 0) { //nur pushen wenn 'erreichbar' Array2[x][y-1] = Array2[x][y]; stack.push(x + "," + (y-1)); } // end if } // end if if (x < 19) { //ich würde hier vorschlagen eine Globale oder Klassenvariable //wie MapWidth oder ähnliches zu benutzen statt fixer Werte... if (Array1[x+1][y] == 0 && Array2[x+1][y] == 0) { //nur pushen wenn 'erreichbar' Array2[x+1][y] = Array2[x][y]; stack.push((x+1) + "," + y); } // end if } // end if if (y < 19) { //ich würde hier vorschlagen eine Globale oder Klassenvariable //wie MapHeight oder ähnliches zu benutzen statt fixer Werte... if (Array1[x][y+1] == 0 && Array2[x][y+1] == 0) { //nur pushen wenn 'erreichbar' Array2[x][y+1] = Array2[x][y]; stack.push(x + "," + (y+1)); } // end if } // end if } // wend //da ich mich nicht auskenne; aber muss stack nicht noch gelöscht werden? //delete[] stack //? return Array2; } // end function public static void main(String[] args) { // TODO code application logic here Pathfind SPath = new Pathfind(); int[][] Array1 = new int[20][20]; int[][] Array2; int x; int y; Array2 = SPath.Floodfill(1,1,Array1,18,18); for (y = 0; y < 19; y++){ for (x = 0; x < 19; x++){ System.out.println(Array2[x][y]); } } } } |
Zitat
ich dachte mein Code ist auch richtig, wie er hier beschrieben worden ist, umgesetzt worden, zumindest Teilweise, aber eine Lösung für den aktuellen Codeausschnitt, oder einen Hinweis, wurde hier noch nicht gepostet.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »EternalPain« (06.04.2013, 14:10)
Quellcode |
|
1 |
Array2[x-1][y] = Array2[x][y]; |
Genau. Und dein Computer hat den Weg falsch berechnet. ;-)
Zitat
Eigentlich weißt deine Methode doch nur der Nachbarzelle ihren eigenen Wert zu, woher dann die immer größeren Werte?
Quellcode |
|
1 |
stack.push((x-1) + "," + y); |
Quellcode |
|
1 |
Element = stack.pop(); |
Quellcode |
|
1 |
Array2[x][y] = Array2[x][y] + 1; |
Quellcode |
|
1 |
if (Array1[x][y] == 0 && Array2[x][y] > n && x != xZiel && y != yZiel) |
Quellcode |
|
1 |
if (Array1[x][y] == 0 && Array2[x][y] > n && KoordinatenGleich(x, y, xZiel, yZiel) == false) |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (06.04.2013, 16:46)
Oh sorry, da hatte man wohl vergessen dir zu sagen, das Java kein Floodfill unterstuetzt.Liegt also irgendwie an Java.
Werbeanzeige