Schiffe versenken - Probleme

Effa

Grünschnabel
Hallo Ihr!

Wie Ihr Euch wahrscheinlich schon denken könnt, geht es auch bei mir um eine Aufgabe für die Uni.

Wir sollen ein "einseitiges" Schiffe versenken programmieren. Soll heißen, der Computer setzt seine Schiffe auf ein 10x10 Spielfeld und ich schieße diese dann mit einer Eingabe a la "F5" ab.
Nun soll nach jedem Zug das Spielfeld eingeblendet werden und der aktuelle Spielstand durch die Symbole (x getroffen, - vorbei, o noch nicht beschossen) angezeigt werden.
Und genau da hänge ich nun.....
Nachdem ich meinen ersten Tipp abgegeben habe, kommt anstatt des Spielfelds nur eine komische Zahlenfolge (ich weiß, dass das daran liegt, dass ich auf diese Weise kein Array ausdrucken kann, aber ich komme einfach nicht auf die richtige Lösung)

Könntet ihr mir bitte helfen****

Hier ist mein bisheriger Code:
Code:
public class SchiffeVersenken {
	
	
	public static void main (String[] args)
	{
		System.out.println("Willkommen zu Schiffe versenken deluxe!");
		
		//Spielfeld-Objekt anlegen
		SpielHelfer meinSpielfeld = new SpielHelfer(10);
		
		//Schiffe erstellen
		Schiff [] computerSchiffe = {new Schlachtschiff(),new Kreuzer(),new  Kreuzer(),new Zerstoerer(),new Zerstoerer(),new Uboot()};
		
		
		int[] koordinaten;
		
		for(int i =0; i< computerSchiffe.length; i++)
		{
			
			boolean platziert = false;
			
			while(!platziert)
			{
				koordinaten = 
                                meinSpielfeld.gibMirSchiff(computerSchiffe[i].getSchiffsLaenge());

				platziert = meinSpielfeld.platziereSchiff(computerSchiffe[i], 
                                koordinaten[0], koordinaten[1], koordinaten[2], koordinaten[3]);
			}
		}
		
		
		System.out.println(meinSpielfeld.zeigeSpielfeld());
		
		System.out.println("Schiffe sind gesetzt.");
		
		
		System.out.println(meinSpielfeld.benutzerEingabe());
		
		Spielstand display = new Spielstand();


Code:
public class Spielstand {
	
	public SpielHelfer eingabe;
	private int treffer = 0;
	public Schiff [] [] feld;
	
	
	
	public boolean zeigeSpielstand(int [] tipp)
	{
		boolean daneben= true;
		for (int i =0; i<=feld[0].length; i++)
		{
			for (int j=0; j<=feld.length; j++)
			{
				if (feld[tipp[0]][tipp[1]]!= null)//  getroffen
				{
					System.out.println("Getroffen");
					daneben = false;
					treffer++;
				}
			}
				
		}	
		if (daneben)
		{
			for (int i =0; i<=feld[0].length; i++)
			{
				for (int j=0; j<=feld.length; j++)
				{
					System.out.println("Vorbei");
				}
	
					
			}
		}
		
		System.out.print(feld [tipp[0]][tipp[1]] == null ? "x " : "- ");
		return daneben;
	}
	
	
	public int getTreffer()
	{
		return treffer;
	}
}

Code:
public class SpielHelfer
{
	public Schiff [][] feld;       
	public Schiff schiffsLaenge;
	private int ausrichtung = (int)Math.random ();
	
	
	
	public SpielHelfer(int groesse)
	{
		feld = new Schiff [groesse][groesse];  
	}
	
	
	
	
	public String zeigeSpielfeld ()
	{
		
		String zeigeFeld = "Ihr Spielfeld:"+ "\n"+ "\n";
		
		for (int spalte=0; spalte<feld[0].length; spalte++)
		{
			for (int zeile=0; zeile<feld.length; zeile++)
			{
				zeigeFeld += feld [zeile][spalte]== null ? "o " : "o ";
				
			}
			zeigeFeld += "\n";
		}
		return zeigeFeld;
		
	}
	
	
	
	
	public int [] gibMirSchiff (int schiffAusmaß)
	{
		int[] koordinaten = new int[4];
		Random random = new Random();
		
		int ebenenGroesse = feld.length;
		int konkreteGroesse = ebenenGroesse - schiffAusmaß;
		
		int xKoordinate = Math.abs(random.nextInt()%konkreteGroesse);
		int yKoordinate = Math.abs(random.nextInt()%konkreteGroesse);
		
		//richtung = true --> waagrecht
		//richtung = false --> senkrecht
		boolean richtung = random.nextBoolean();
		
		koordinaten[0] = xKoordinate;
		koordinaten[2] = yKoordinate;
		
		if(richtung)
		{
			koordinaten[1] = xKoordinate + schiffAusmaß -1;
			koordinaten[3] = yKoordinate;
		}
		else
		{		
			koordinaten[1] = xKoordinate;
			koordinaten[3] = yKoordinate+ schiffAusmaß - 1;		
		}
		
		return koordinaten;
	}
	
	
	public boolean platziereSchiff(Schiff schiff, int startZeile, int endZeile, int startSpalte, 
        int endSpalte)
	{
		boolean frei = true;
		for(int zeile = startZeile; zeile <= endZeile; zeile++)
		{
			for(int spalte = startSpalte; spalte<= endSpalte; spalte++)
			{
				if (feld[zeile][spalte]!=null)
				{
					frei = false;
				}
			}
		}
		
		if(frei)
		{
			for(int zeile = startZeile; zeile <= endZeile; zeile++)
			{
				for(int spalte = startSpalte; spalte<= endSpalte; spalte++)
				{
					feld[zeile][spalte] = schiff;
				}
			}
		}
		
			
		return frei;
		
	}
	
	
	
	public int [] benutzerEingabe()
	{	Spielstand current = new Spielstand();
		
		
		Scanner scan = new Scanner(System.in);
			

			
			String tipp1 = scan.next();
			
			char []tipp2 = tipp1.toCharArray();
			int tippy = ((int)tipp2 [0])-58;
			
			int tippx = (int)tipp2[1];
			
			int [] tipp = new int [2];
			tipp[0]= tippx;
			tipp[1]= tippy;
			
			return tipp;
		}
 
Erst einmal willkommen hier im Forum ^^

Das Problem mit der Ausgabe des Arrays ist keine große Sache. Entweder du klapperst das Array mit einer Schleife ab oder du machst es so:
Java:
System.out.println(Arrays.toString(spielHelfer.benutzerEingabe()));
Dann bekommst du deine Ergebnisse.
 
Danke!!
Euer Forum hat mir schon öfters weiter geholfen....

Und nochmal danke für deine Antwort!!
Hab die Schleife jetzt eingebaut, und entdeckt dass mein Fehler daran lag, dass ich ein Array ausgegeben hab, obwohl ich gar keins wollte.
Jetzt ist aber mein Problem, dass ich von der main-Methode irgendwie nich auf die Klasse Spielstand zugreifen kann, zumindest wird nichts auf der Konsole ausgegeben.
 
Am besten aus der Main heraus das Objekt SchiffeVersenken erstellen mit new und von dort aus dann alle anderen Klassen erstellen und Methoden aufrufen.
Ansonsten versteh ich nicht was du meinst mit du kannst nich darauf zugreifen? Du erstellst am Ende der Main
Java:
Spielstand display = new Spielstand();
Solange du dort keine Methode aufrufst, kann ja auch nix angezeigt werden? :)
 
oh, ja.... da hab ich vergessen die letzten Zeilen rein zu kopieren.
Eigentlich gehts so weiter:

Java:
String tipp1 = meinSpielfeld.benutzerEingabe();
		int []tipp= meinSpielfeld.wandleUm(tipp1);
		
		
		System.out.println(display.zeigeSpielstand(tipp));

ich hab meine Methoden noch einmal ein bisschen umgeschrieben, deswegen taucht auf einmal ein"wandleUm" auf, aber eigentlich sollte es doch nicht daran liegen oder?

Danke nochmal!!
 
Nuetzlich bei sowas ist immer debuggen. Zur Not mit einigen System outs, um zu sehen bis wohin er kommt und ob ueberhaupt irgendwo eine Ausgabe ist.
Kann es momentan hier auch nicht testen. Daher genaue Angabe was er nicht mach tund ob er ueberhaupt in die Methode kommt bzw ob dein wandleUm das macht was es soll :)
 

Neue Beiträge

Zurück