ZZZnake - Dynamisch geht nix

01/22/2013 14:56 Mostey#1
Moin. Bin seit etwa einer Woche am Lernen von Java und bin es bisher relativ langsam und entspannt angegangen. Heute wollte ich mal nach den ersten 2 Kapiteln des "Java ist auch eine Insel" Buches mal das kleine "ZZZnake" Programm umschreiben - es "dynamisch" machen.

Das heißt das ich die Positionen der Figuren durch eine Zufallszahl festsetzen möchte, die nach jedem generieren anders ist. Die Positionen werden durch die 2 Random Methoden "randomX" und "randomY" generiert. Mein bisheriger Code prüft, ob es bei den Positionen irgendwo eine Kollision gibt und soll die Positionen dann mal testweise ausgeben damit ich sehe ob da alles passt.

Das tut er aber leider nicht, das Programm bricht irgendwo ab.

Hier mal der Ansatz:

mfg
01/22/2013 15:03 Der Anbieter#2
Gibt es beim Kompilieren keine Fehlermeldung?
01/22/2013 15:05 Mostey#3
Quote:
Originally Posted by Der Anbieter View Post
Gibt es beim Kompilieren keine Fehlermeldung?
Nein, wüsste auch nicht wo es da eine geben sollte.

Er bricht halt bei der Positionsgenerierung irgendwo ab und das Programm schließt sich.
01/22/2013 15:33 Sedrika#4
Ich hab das ganze mal etwas umgeschrieben. Getestet habe ich es nicht, da ich keinen Java Compiler zurzeit habe.

Code:
import java.text.SimpleDateFormat;
import java.util.Date;
/*
 *  Spiel: Ein Spieler (S) muss 3 Geldstuecke ($) einsammeln ohne von der Schlange (!) gebissen zu werden
 */
public class ZZZZnake {

	public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		var nDate = sdf.format(new Date());
		JOptionPane.showMessageDialog(null, "ZZZZZZnake!");
		int confirm = JOptionPane.showConfirmDialog(null, "Spiel starten? | Systemzeit: " + nDate);
		// Confirmrequest
		if (confirm == 0) // Ja = Spielablauf
		{
			positions();
		} 
		else // 1 oder 2 = Nein = Abbruch
		{
			System.exit( 0 );
		}
	}

	public static void positions() {
		Point playerpos = new Point();
		Point schlangenpos = new Point();
		Point geldpos1 = new Point();
		Point geldpos2 = new Point();
		Point geldpos3 = new Point();
		int minXY = 0;
		int maxX = 40;
		int maxY = 10;

		playerpos.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
		schlangenpos.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
		geldpos1.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
		geldpos2.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
		geldpos3.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
				
		while( geldpos1.getLocation() == playerpos.getLocation() ||
			   geldpos2.getLocation() == playerpos.getLocation() ||
			   geldpos3.getLocation() == playerpos.getLocation() ||
			   playerpos.getLocation() == schlangenpos.getLocation() )
		{
			geldpos1.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
			geldpos2.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
			geldpos3.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
			playerpos.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
			System.out.println( "X: " + playerpos.getX() + " Y:" + palyerpos.getY() );
			System.out.println( "X: " + schlangenpos.getX() + " Y:" + schlangenpos.getY() );
			System.out.println( "X: " + geldpos1.getX() + " Y:" + geldpos1.getY() );
			System.out.println( "X: " + geldpos2.getX() + " Y:" + geldpos2.getY() );
			System.out.println( "X: " + geldpos3.getX() + " Y:" + geldpos3.getY() );
		}

	}

	public static int GetRandomPos(int low, int high) {
		return (int) (Math.random() * (high - low) + low);
	}
}
01/22/2013 15:40 Mostey#5
Selbes Ergebnis, die Dialoge funktionieren, alles danach allerdings nicht mehr. Finde aber auch dass das genau das selbe ist was ich ja schon geschrieben hatte, halt nur mit anderen Lösungsansätzen.
01/22/2013 15:44 Sedrika#6
Ich sehe gerade das hier xD
Code:
if (confirm == 0) // Ja = Spielablauf
änder es mal in
Code:
if (confirm) // Ja = Spielablauf
0 steht für false.

Abbruch ist immer 0.
01/22/2013 15:54 Mostey#7
Wir verwenden hier keinen Boolean, daher geht das ohne den Wert in der if Abfrage sowieso nicht. 0 ist in Java nicht immer false. Zumindest nicht bei der Funktion "JOptionPane".

Stimmt schon, habs eben auch nochmal getestet. Der zählt von rechts nach links: Abbruch - Nein - Ja

€: Manchmal könnt ich mir so dermaßen eine reinhauen... echt ey.
Code:
while (geldpos1.equals(playerpos) || geldpos2.equals(playerpos)
				|| geldpos3.equals(playerpos) || playerpos.equals(schlangenpos)) {
			geldpos1.setLocation(randomX(), randomY());
			geldpos2.setLocation(randomX(), randomY());
			geldpos3.setLocation(randomX(), randomY());
			playerpos.setLocation(randomX(), randomY());
			System.out.println(playerpos);
			System.out.println(schlangenpos);
			System.out.println(geldpos1);
			System.out.println(geldpos2);
			System.out.println(geldpos3);

		}
Ich hab ne while Schleife die überprüft ob die Koordinaten alle verschieden sind und nicht aufliegen. Die Ausgabe kommt ja nur wenn sie mindestens einmal irgendwo aufeinander gelegen haben.

Sorry.
01/22/2013 16:00 Sedrika#8
Dann nimm doch mal die Abfrage raus und teste mal so, um zu sehen, ob es an der Abfrage liegt.

Ich verstehe auch nicht, wieso du nicht so abfragst:
Code:
int confirm = JOptionPane.showConfirmDialog(null, "Spiel starten? | Systemzeit: " + nDate, "TITEL", JOptionPane.YES_NO_CANCEL_OPTION);
und dann mit
Code:
if (confirm == JOptionPane.YES_OPTION)
		{
			positions();
		}
		else // if (result == JOptionPane.NO_OPTION)
		{
			System.exit(0);
		}
den Rückgabewert ermittelst.
01/23/2013 14:40 Mostey#9
So, nach diesem dummen Fehler meinerseits hab ich mich nochmal an das Minigame gemacht und nun Spielfeld, Figuren und Steuerung hinzugefügt.

Allerdings hab ich so das Gefühl dass das sehr unübersichtlich für andere wird, daher poste ich mal den Source von der Klasse mit den ganzen Methoden und ihr könnt ja mal drüberschauen. Übrigens hab ich sehr viele Probleme mit dem Rückgabewert. Ich würde gern für jede Aufgabe eine seperate Methode machen und das alles in der Main Methode zusammenfassen, allerdings geht das oftmals nicht, da ich bei einigen Funktionen eine Eingabe benötige um die Methode auszuführen, da ich das selbst so festgelegt habe. Naja, seht ihr ja dann schon selbst.

Zur Verständlichkeit ist einiges kommentiert.