Variablen keine Arrayübergabe für getter im Interface

bouster

Mitglied
Hallo Leute,
ich habe ein Programm geschrieben bei dem es um eine Spielfigur geht die sich innerhalb eines Kreises
bewegt und wobei der Spieler den Winkel und/oder den Radius ändern kann bis sich die Figur auf dem Zielfeld befindet

So jetzt zum Problem
die Methode getPosition ist als übergabe von getPositionen zur Methoode laufen gedacht wobei sie die den Array NaechstePositionen nimmt und den Spieler einen Zug machen lässt und einen Array mit nur einem wert (dem ausgewählten Spielzug) an laufen weiter gibt sodass diese der neuen Position(abhängig von r und alpha) die Spielfigur zuordnen kann

Jedoch titt das leider nicht ein ich hab es schon mit eclipse im debugmodus probiert aber da finde ich den Fehler leider nicht.

hab noch den text angefügt hoffe mir kann jemand helfen.
danke schon mal.

MAIN PROGRAMM
Java:
public abstract class Kreiseln implements ImRaumBewegen {

	public static void main(String...args)
	{
		
		ImRaumBewegen a = new ImRundenRaumBewegen();
		a.darstellen();
		while (a.getPositionFigur()!=a.getPositionZiel())
		{	
			a.getNaechstePositionen();
			a.laufen( a.getNaechstePosition()[0]);
			a.darstellen();
		}
	}
}

INTERFACE
Java:
public interface ImRaumBewegen  {
	//Gibt die Position der Figur zurück
	public Position getPositionFigur();
	
	//Gibt die Position des Ziels zurück
	public Position getPositionZiel();
	
	//Gibt die nächsten möglichen Positionen zurück
	public Position[] getNaechstePositionen();
	
	//Gibt die gewählte Position zurück
	public Position[] getNaechstePosition();
	
	//Zieht die Figur auf die neue Position
	public void laufen(Position neu);
	
	//Stellt den Raum dar
	public void darstellen();
}

METHODEN IMPLEMENTIERUNG
Java:
import java.util.Scanner;

public class ImRundenRaumBewegen implements ImRaumBewegen {
	
	private static Position PositionFigur; 								//Position der Figur
	private static Position[] NaechstePositionen;		//Mögliche Nächste Schritte	
	private static Position[] NaechstePosition	= new Position[1];		//Nächster gewählter Schritt
	
	//Start	
	private static int rStart=0;
	private static int alphaStart=0;
	private static Position Start = new Position(rStart, alphaStart);	
	
	//Ziel
	private static int rZiel;
	private static int alphaZiel;
	private static Position Ziel = new Position(rZiel, alphaZiel);	
	
	private static int rMax = 20;		//Kreis
	private static int alphaMax = 359;
	private static double[][] Kreis; 		// Array als Liste des aufgerollten Kreises mit: Kreis[Radius][Winkel]

	private static Scanner sc = new Scanner(System.in);   // Spielzug variablen
	private static int Zugwunsch;
	private static int Runden=0;
	
	private static double EntfernungM;
	private static double EntfernungAlpha;
	
	//Startbedingungen
	//================
	//================	
	ImRundenRaumBewegen ()
	{	//Raumerzeugung
		Kreis = new double[2*rMax][2*alphaMax+1];
		
		//Startposition
		rStart = (int) Math.floor( Math.random() * rMax );
		alphaStart =(int) Math.floor(Math.random()* alphaMax);
		Start.r = rStart;
		Start.alpha = alphaStart;
		PositionFigur = Start;

		//Zielposition
		rZiel = (int) Math.floor( Math.random() * rMax );
		alphaZiel =(int)Math.floor(Math.random()* alphaMax);
		Ziel.r = rZiel;
		Ziel.alpha =alphaZiel;
	}
	
	
	
	
	//aktuelle Position der Figur
	//===========================
	//===========================	
	public Position getPositionFigur()
	{
		return PositionFigur;
	}
	
	
	
	
	//Zielrückgabe
	//============
	//============
	public Position getPositionZiel()
	{	
		return Ziel;
	}	
	

	
	
	//Mögliche neue Positionen
	//========================
	//========================
	public Position[] getNaechstePositionen()
	{	
		Position rPlus			 = PositionFigur;;
		Position rMinus			 = PositionFigur;;
		Position alphaPlus		 = PositionFigur;
		Position alphaMinus		 = PositionFigur;;
		Position rAlphaPlus		 = PositionFigur;;
		Position rPlusAlphaMinus = PositionFigur;;
		Position rAlphaMinus	 = PositionFigur;;
		Position rMinusAlphaPlus = PositionFigur;;
		
	// Radius vergrößern
		if (PositionFigur.r != 2*rMax )
		rPlus.r =PositionFigur.r +1;
		
	// Radius verkleinern
		if (PositionFigur.r != 0)
		rMinus.r = PositionFigur.r -1;
		
	// Alpha vergrößern
		if (PositionFigur.alpha !=2*alphaMax+1 )
		alphaPlus.alpha = PositionFigur.alpha +1;
		else
		alphaPlus.alpha = 0;		
		
	// Alpha verkleinern
		if (PositionFigur.alpha != 0)
		alphaMinus.alpha = PositionFigur.alpha -1;
		else
		alphaMinus.alpha = 2*alphaMax+1;
		
	// Radius und Alpha vergrößern
		if (PositionFigur.r != 2*rMax && PositionFigur.alpha !=2*alphaMax+1 )
		{ // Nicht bei 364.5°
		rAlphaPlus.r = PositionFigur.r +1;
		rAlphaPlus.alpha = PositionFigur.alpha +1;
		}else{
			if (PositionFigur.r != 2*rMax && PositionFigur.alpha ==2*alphaMax+1)
			{// überschreitung Alphamax zu 0°
				rAlphaPlus.r = PositionFigur.r +1;
				rAlphaPlus.alpha = 0;
			}
		}
	// Radius vergrößern Alpha verkleinern
		if (PositionFigur.r != 2*rMax &&PositionFigur.alpha != 0)
		{ // Nicht bei 0°
		rPlusAlphaMinus.r = PositionFigur.r +1;
		rPlusAlphaMinus.alpha = PositionFigur.alpha -1;
		}else{
			if (PositionFigur.r != 2*rMax &&PositionFigur.alpha == 0)
			{// bei 0° zu 364.5
				rPlusAlphaMinus.r = PositionFigur.r +1;
				rPlusAlphaMinus.alpha = 2*alphaMax+1;
			}
		}		
	//Radius und Alpha verkleinern
		if (PositionFigur.r != 0 &&PositionFigur.alpha != 0)
		{// Nicht bei 0°
		rAlphaMinus.r = PositionFigur.r -1;
		rAlphaMinus.alpha = PositionFigur.alpha -1;
		}else{
			if (PositionFigur.r != 0 &&PositionFigur.alpha == 0)
			{// bei 0° zu 364.5
				rAlphaMinus.r = PositionFigur.r -1;
				rAlphaMinus.alpha = 2*alphaMax+1;
			}	
		}		
	//Radius verkleinern Alpha vergrößern
		if (PositionFigur.r != 0 && PositionFigur.alpha !=2*alphaMax+1)
		{// Nicht bei 364.5°
		rMinusAlphaPlus.r = PositionFigur.r -1;
		rMinusAlphaPlus.alpha = PositionFigur.alpha +1;
		}else{
			if (PositionFigur.r != 0 && PositionFigur.alpha ==2*alphaMax+1)
			{//überschreitung Alphamax zu 0°
				rMinusAlphaPlus.r = PositionFigur.r -1;
				rMinusAlphaPlus.alpha = 0;
			}
		}
		NaechstePositionen = new Position[] {rPlus,rMinus,alphaPlus,alphaMinus,rAlphaPlus,rPlusAlphaMinus,rAlphaMinus,rMinusAlphaPlus};
		return (NaechstePositionen);		
	}
	
	
	
	
	//Nächste Position ermitteln
	//==========================
	//==========================
	public Position[] getNaechstePosition()
	{
		System.out.println("");
		System.out.println("Bitte beachten, dass beim nich möglichen Ausführen eines Zuges der Zug auf der Stelle durchgeführt wird,");
		System.out.println("Welchen Weg wollen Sie gehen:");
		System.out.println("1(Radius vergrößern)");
		System.out.println("2(Radius verkleinern)");
		System.out.println("3(Winkel vergrößern)");
		System.out.println("4(Winkel verkleinern)");
		System.out.println("5(Radius und Winkel vergrößern)");
		System.out.println("6(Radius vergrößern Winkel verkleinern)");
		System.out.println("7(Radius und Winkel verkleinern)");
		System.out.println("8(Radius verkleinern Winkel vergrößern)");
		
		Zugwunsch = sc.nextInt();
		switch (Zugwunsch)
		{
		case(1):{NaechstePosition[0]=NaechstePositionen[0];} break;
		case(2):{NaechstePosition[0]=NaechstePositionen[1];} break;
		case(3):{NaechstePosition[0]=NaechstePositionen[2];} break;
		case(4):{NaechstePosition[0]=NaechstePositionen[3];} break;
		case(5):{NaechstePosition[0]=NaechstePositionen[4];} break;
		case(6):{NaechstePosition[0]=NaechstePositionen[5];} break;
		case(7):{NaechstePosition[0]=NaechstePositionen[6];} break;
		case(8):{NaechstePosition[0]=NaechstePositionen[7];} break;
		}
		return NaechstePosition;
	}
	
	public void laufen(Position neu)
	{
		neu = PositionFigur;	
		PositionFigur = neu;
		Runden++;
	}
	
	
	
	
	//Darstellung
	//===========
	//===========
	public void darstellen()
	{
		if (PositionFigur!=Ziel)
		{
			EntfernungM = Math.abs(Ziel.r-PositionFigur.r);
			if (Math.abs(Ziel.alpha-PositionFigur.alpha) < (alphaMax+1)/2)
			EntfernungAlpha = Math.abs(Ziel.alpha-PositionFigur.alpha);
			else
			EntfernungAlpha = (alphaMax+1)-Math.abs(Ziel.alpha-PositionFigur.alpha);
			
			System.out.print("Sie befinden sich bei:");
			System.out.print("(");System.out.print(PositionFigur.r);System.out.print(",");System.out.print(PositionFigur.alpha);System.out.print(")");
			System.out.println("");
			System.out.print("Das Ziel liegt bei:");
			System.out.print("(");System.out.print(Ziel.r);System.out.print(",");System.out.print(Ziel.alpha);System.out.print(")");
			System.out.println("");
			System.out.print("Sie sind noch ");System.out.print(EntfernungM);System.out.print(" Meter vom ziel entfernt");
			System.out.println("");
			System.out.print("Sie sind noch ");System.out.print(EntfernungAlpha);System.out.print(" Grad vom ziel entfernt");
		}
		else
		{ //Ende
		  //====
		  //====
			System.out.println("");
			System.out.println("Sie haben das Ziel erreicht!");
			System.out.printf("Sie haben ");System.out.print(Runden);System.out.print(" Rudnen gebraucht"); 
		}
	}
	
}


POSITIONSMETHODE
Java:
public class Position {
	int r;
	int alpha;
	
	public Position(int r, int alpha) {
		this.r = r;
		this.alpha = alpha;
	}
	
	public int getr() {
		return r;
	}
	
	public int getalpha() {
		return alpha;
	}
}


Sorry hab das mit dem Anhang nich hingekriegt
 
So jetzt zum Problem
die Methode getPosition ist als übergabe von getPositionen zur Methoode laufen gedacht wobei sie die den Array NaechstePositionen nimmt und den Spieler einen Zug machen lässt und einen Array mit nur einem wert (dem ausgewählten Spielzug) an laufen weiter gibt sodass diese der neuen Position(abhängig von r und alpha) die Spielfigur zuordnen kann
Gibt's das ganze auch auf Deutsch? Abgesehen davon, tu ich mir schwer - und da bin ich vermutlich nicht der einzige - Deinen Code zu lesen. Allgemein scheint der mir recht aufgebläht zu sein.

Warum ist im Interface der Rückgabewert von getNaechstePosition als Position- Array definiert? Dem Namen nach würde ich nur einen einzelen Position erwarten. (So wird es in der konkreten Implementierung gemacht)

Dann könnte man folgenden Code
Java:
public Position[] getNaechstePosition()
	{
		System.out.println("");
		System.out.println("Bitte beachten, dass beim nich möglichen Ausführen eines Zuges der Zug auf der Stelle durchgeführt wird,");
		System.out.println("Welchen Weg wollen Sie gehen:");
		System.out.println("1(Radius vergrößern)");
		System.out.println("2(Radius verkleinern)");
		System.out.println("3(Winkel vergrößern)");
		System.out.println("4(Winkel verkleinern)");
		System.out.println("5(Radius und Winkel vergrößern)");
		System.out.println("6(Radius vergrößern Winkel verkleinern)");
		System.out.println("7(Radius und Winkel verkleinern)");
		System.out.println("8(Radius verkleinern Winkel vergrößern)");
		
		Zugwunsch = sc.nextInt();
		switch (Zugwunsch)
		{
		case(1):{NaechstePosition[0]=NaechstePositionen[0];} break;
		case(2):{NaechstePosition[0]=NaechstePositionen[1];} break;
		case(3):{NaechstePosition[0]=NaechstePositionen[2];} break;
		case(4):{NaechstePosition[0]=NaechstePositionen[3];} break;
		case(5):{NaechstePosition[0]=NaechstePositionen[4];} break;
		case(6):{NaechstePosition[0]=NaechstePositionen[5];} break;
		case(7):{NaechstePosition[0]=NaechstePositionen[6];} break;
		case(8):{NaechstePosition[0]=NaechstePositionen[7];} break;
		}
		return NaechstePosition;
	}
kürzen:
Java:
	public Position getNaechstePosition()  {
		System.out.println("");
		System.out.println("Bitte beachten, dass beim nich möglichen Ausführen eines Zuges der Zug auf der Stelle durchgeführt wird,");
...
		System.out.println("8(Radius verkleinern Winkel vergrößern)");
		
		Zugwunsch = sc.nextInt();
		return NaechstePositionen[Zugwunsch-1];
}
Ausserdem werden Falscheingaben nicht abgefangen.

Und dann sind da noch solche Sachen:
Java:
public void laufen(Position neu)
	{
		neu = PositionFigur;	
		PositionFigur = neu;
		Runden++;
	}
Falls Du hier ein Call by Reference versucht: Gibt es in Java nicht. Java kennt nur Call by Value.
Daher könnte man sich den Übergabeparameter neu sparen. Genauso wie Zeile 3. Zeile 4 macht überhaupt keinen Sinn. Zeile 5 ist letztendlich die einzige Codezeile die was bewirkt.
 
danke schon mal
also ich hab das jetz mal geändert zu
Java:
public Position getNaechstePosition()
	{
		System.out.println("");
		System.out.println("Bitte beachten, dass beim nich möglichen Ausführen eines Zuges der Zug auf der Stelle durchgeführt wird,");
		System.out.println("Welchen Weg wollen Sie gehen:");
		System.out.println("1(Radius vergrößern)");
		System.out.println("2(Radius verkleinern)");
		System.out.println("3(Winkel vergrößern)");
		System.out.println("4(Winkel verkleinern)");
		System.out.println("5(Radius und Winkel vergrößern)");
		System.out.println("6(Radius vergrößern Winkel verkleinern)");
		System.out.println("7(Radius und Winkel verkleinern)");
		System.out.println("8(Radius verkleinern Winkel vergrößern)");
		
		Zugwunsch = sc.nextInt();

		return NaechstePositionen[Zugwunsch-1];
	}
	
	public void laufen(Position neu)
	{
		neu = NaechstePositionen[Zugwunsch-1];	
		PositionFigur = neu;
		Runden++;
	}

aber die PositionFigur wird immer noch nicht versetzt
habe ich vllt beim aufrufen der Methoden in Kreiseln was falsch gemacht??
Java:
public abstract class Kreiseln implements ImRaumBewegen {

	public static void main(String...args)
	{
		
		ImRaumBewegen a = new ImRundenRaumBewegen();
		a.darstellen();
		while (a.getPositionFigur()!=a.getPositionZiel())
		{	
			a.getNaechstePositionen();
			a.laufen(a.getNaechstePosition());
			a.darstellen();
		}
	}
}
 
Moin,

mal ganz davon abgesehen, dass ich nicht sehe, WO Du die Klasse "Kreiseln" aufrufst ...

'ne abstrakte Klasse mit 'ner Main-Methode ???:L😱

==> Du musst von Deiner abstrakten Klassen ableiten und dann mit der Ableitung arbeiten !! 😉

Gruß
Klaus
 
Nochmal der Hinweis hierzu:
Java:
public void laufen(Position neu) {
	neu = NaechstePositionen[Zugwunsch-1];	
	PositionFigur = neu;
	Runden++;
}

Hab mir jetzt nicht angeschaut, was Du damit vorhast. Aber der Code hat die gleiche Auswirkung wie:
Java:
public void laufen() {
	PositionFigur = NaechstePositionen[Zugwunsch-1];	
	Runden++;
}
Die Übergabe des Parameters neu ist hier völlig nutzlos, da es - wie erwähnt - in Java keinen Methodenaufruf Call by Reference gibt.
 
hey danke allen hab mein problem gefunden ... bei der übergabe der Werte an getNaechstePositionen bzw rPlus .... etc hatte ich keine copyMethode benutzt ....
 

Neue Themen


Zurück
Oben