# Schiffe Versenken



## javfix (12. Dez 2007)

Hallo,

Kann mir einer vll. dabei weiterhelfen?
Also ich muss die Implementierung für eine vereinfachte Version von Schiffe Versenken vornehmen.

D.h.:

Das Spielfeld = Rechteck von n mal m Felder auf denen Schiffe positioniert werden können.
Ich soll das Spielfeld als 2-domensionales Array von ganzen Zahlen impl. , dabei soll die 0 für ein leeres Feld (also Wasser)

Außerdem gibt mir die Aufgabenstellung noch folgende Konstanten:

final int WASSER = 0;
final int MINENSUCHER = 1;
final int KREUZER = 2;
final int SCHLACHTSCHIFF = 3;
final int HORIZONTAL = 0;
final int VERTIKAL = 1;

Diese Werte geben an wie viel Arrayfelder benötigt werden.

Dann soll ich noch folgende Methoden anbieten:

SchiffeVersenken (int laenge, int breite)
-- legt ein neues Spielfeld mit gegebener Länge und Breite an

boolean kannSetzen(int typ, int xkor, int ykor, int richtung)
-- Methode soll überprüfen ob der Schiffstyp ab der Startpos. xkor, ykor in die richtung gesetzt werden kann.

void setzeSchiff (int typ, int xkor, int ykor, int richtung)
-- Setzt ein Schiff vom Typ typins Spielfeld

Naja dann soll noch eine kleine Testklasse impl. die das Verhalten eines Schiffe-Versenken-Objekts überprüft...


Ich postet hier mal die Angabe damit du auch weißt was ich meine und was ich alles haben sollte....

Mein Problem liegt jetzt darin, dass ich nicht weiß wie ich jetzt an eine solche (für meine Verhältnisse) sehr umfangreiche Aufgabe ran gehen soll...(Soll aber nicht heißen ich will hier eine Lösung oder so, ich will eig. nur lernen wie ich ran gehe und dann kann ich ja meine Zwischenergebnisse auch mal posten, denn eig. ist das ja ne tolle Aufgabe Schiffe Versenken zu impl.


----------



## SlaterB (12. Dez 2007)

fange an,
ein nxm-Array zu definieren und auch auf der Konsole auszugeben
(3x4-Array:
0 0 0 0
0 0 0 0
0 0 0 0

oder

0 0 0
0 0 0
0 0 0
0 0 0

jenachdem)

so, das ist weit weniger kompliziert und wird dir als guten Start dienen


----------



## javfix (12. Dez 2007)

Hallo,

ok du meinst also erst mal das 2-dimensionale Array machen und dann weiter drauf aufbauen
hab ich das so richtig verstanden?


----------



## SlaterB (12. Dez 2007)

genau


----------



## Prusik (12. Dez 2007)

Tipp: mach auch wirklich eine Methode, die dir das Spielfeld ausgibt, damit du immer siehst, wie es aussieht... natürlich danach nicht mehr, wenn dann wirklich gespielt wird, aber bis dann... So weisst du immer ob auch (fast) alles funktioniert...


----------



## javfix (14. Dez 2007)

Hallo,

ich komm jetzt nicht mehr weiter,
wie mach ich jetzt das Spielfeld und überprüfe ob es auch richtig ist?


```
public class SchiffeVersenken {
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Willkommen beim Spiel SchiffeVersenken!");
		SchiffeVersenken spiel1 = new SchiffeVersenken(5,4);
		
	}	
	
	
	//Attribute
	final int WASSER = 0;
	final int MINENSUCHER = 1;
	final int KREUZER = 2;
	final int SCHLACHTSCHIFF = 3;
	
	final int HORIZONTAL = 0;
	final int VERTIKAL = 1;
	
	int m, n;
	

	//Konstruktor-Methode
	SchiffeVersenken(int laenge, int breite){
		this.n=laenge;
		this.m=breite;
		
	}
	
/*
	
	//Methoden
	boolean kannSetzen (int typ, int xkor, int ykor, int richtung){
		
	}
	
	void setzeSchiff (int typ, int xkor, int ykor, int richtung){
		
	}

*/	
	
}//End of class SchiffeVersenken
```


----------



## SlaterB (14. Dez 2007)

int[] feld = new int[n][m]


dann suchst du dir die entsprechenden Koordinaten aus,
je nach Typ, Richtung und x/y sind das 1-3 Felder,
musst aufpassen, ob die nicht außerhalb des Arrays liegen oder schon besetzt sind,

fange mit dem Minensucher (nur 1 Feld) an,

und immer noch: schreibe dir als erstes eine Ausgabe-Operation für das Array!,
wenn dir das zu schwer ist (du nicht mal ein zweidimensionale Feld deklarieren kannst),
dann erstmal eine Dimension oder gar nur ein einzelnes Feld


----------



## javfix (14. Dez 2007)

hallo, 


warum schreibst du int [] feld = new int [n][m]
ist das dann überhaupt 2-dimensional muss das nicht 
int [][] feld = new int [n][m] sein?
Und wo muss ich das erstellen bei den Attributen?

Und soll ich das mit der Ausgabe-Operation machen bzw. wie amch ich sowas??


----------



## SlaterB (14. Dez 2007)

int[][] ist besser, stimmt,

> Und wo muss ich das erstellen bei den Attributen? 

die Antwort darauf wird sich aus deinem Programm ergeben, wann du wo überall das Feld brauchst,
wenn es bisher noch nicht gebraucht wird, dann ist es erstmal egal wo,
später wird es weniger egal sein

> Und soll ich das mit der Ausgabe-Operation machen 

in der Aufgabe steht es nicht, es würde dir nur helfen

> bzw. wie amch ich sowas??

an dieser Stelle werde ich persönlich nicht weiterhelfen,
wie willst du ein Java-Programm programmieren wenn dir Grundlagen wie der Umgang mit einem Array fehlen?

-> Lehrbuch, seitenweise Beschreibung zu Arrays


----------



## ARadauer (14. Dez 2007)

wo?
ja bei den attributen oder im konstruktor. wenn du es im konstruktor machst musst du natürlich, die variable bei den attributen dabei haben. klar sonst ist das feld ja nur im konstruktor sichtbar.

wie du ein zweidimensionales array ausgiebst? das is doch ned so schwierig:



```
int[][] feld = new int[5][5];
		feld[2][2] = 8;
		TestKlasse.printArray(feld);
```


```
public static void printArray(int[][] a){
		for(int i = 0; i < a.length; i++){
			for(int j = 0; j <a[i].length; j++){
				System.out.print(a[i][j]+" ");
			}
			System.out.println();
		}
	}
```


----------



## javfix (14. Dez 2007)

Hallo,

jetzt bin ich soweit:

```
public class SchiffeVersenken {
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Willkommen beim Spiel SchiffeVersenken!");
		SchiffeVersenken spiel1 = new SchiffeVersenken(5,4);
				
	}	
		
	//Attribute
	final int WASSER = 0;
	final int MINENSUCHER = 1;
	final int KREUZER = 2;
	final int SCHLACHTSCHIFF = 3;
	
	final int HORIZONTAL = 0;
	final int VERTIKAL = 1;

	
	
	//Konstruktor-Methode
	SchiffeVersenken(int laenge, int breite){
		int [][] spielfeld = new int [laenge][breite];
	}
	
/*
	//Methoden
	boolean kannSetzen (int typ, int xkor, int ykor, int richtung){
		
	}
	
	void setzeSchiff (int typ, int xkor, int ykor, int richtung){
		
	}
*/	
}//End of class SchiffeVersenken
```

Jetzt ist die Frage, wie überprüfe ich nun ob ein Schiff von den oben genannten Typen bei einer Startposition in eine int richtung gesetzt werden kann?

Dank für die tolle Hilfe hier!


----------



## ARadauer (14. Dez 2007)

versuch mal, dass du das mit papier und bleistift löst!

du hast zb ein 4 x 4 feld: auf malen, 0 1 2 3 ....
also die breite kannst du ermitteln oder? feld[o].lenght, das wird 4 sein
die breite deines schiffes kennst du auch oder? zb 2
dann die postioion zb in der spalte 0, zeile 1
0123
OOOO
XXOO
OOOO
OOOO
super passt
spalte 2
OOOO
OOXX
OOOO
OOOO
super passt
spalte 3
OOOO
OOOXX
OOOO
OOOO

passt nicht
2+2 = 4 geht
3+2 = 5 geht nicht
if(pos+länge <= breite)
    ok
else
    geht ned


so ungefähr, ermittelt man sowas, einfach mit bleistifft und papier überlegen


----------

