# Java Einstieg Schiffe versenken



## Neudabei (7. Nov 2010)

Guten Abend zusammen 

Folgendes, bin momentan dabei in Java einzusteigen. Zurzeit programmier ich mir ganz einfach gestaltet " Schiffe versenken " mit ganz einfachen Funktionen. Nun hab ich schon 'soviel' geschafft:


```
import java.util.Scanner;

public class testbattleship 
{
 private static int sea[][] = new int[10][10];
private static int see[][] = new int[10][10];


 public static void reset( )
{

	  for ( int i=0 ; i <= 9 ; i++)
	{
	   	for (int j=0; j <= 9 ; j++)
	      {
		sea[i][j]=0;
	}
}
}

 
public static void showSea()
{
  for ( int i=0 ; i <= 9 ; i++)
	{
		System.out.println();
	   	for (int j=0; j <= 9 ; j++)
	      {
		System.out.print(+ sea[i][j]);
}
}System.out.println();
}

public static boolean fire(int p, int q)
{
	if(sea[p][q]==1)
		return true;
	else return false;
}



public static void setShip(int x, int y)
{
 sea[x][y] = 1;
}

 public static void reset2( )
{

	  for ( int i=0 ; i <= 9 ; i++)
	{
	   	for (int j=0; j <= 9 ; j++)
	      {
		see[i][j]=0;
	}
}
}

 
 
public static void showSea2()
{
  for ( int i=0 ; i <= 9 ; i++)
	{
		System.out.println();
	   	for (int j=0; j <= 9 ; j++)
	      {
		System.out.print(+ see[i][j]);
}
}System.out.println();
}

public static boolean fire2(int p, int q)
{
	if(see[p][q]==1)
		return true;
	else return false;
}



public static void setShip2(int x, int y)
{
 see[x][y] = 1;
}

 public static void main( String[] args)

  {
          // DEKLARATION  
 
  int x,y;
  int a,b;
  int option = 1;
  Scanner sc1= new Scanner (System.in);
  Scanner sc2= new Scanner (System.in);
  Scanner sc3= new Scanner (System.in);
  Scanner sc4= new Scanner (System.in);
  Scanner sc5= new Scanner (System.in);

reset();

	  // Berechnung
 
System.out.println("Geben Sie (Spieler 1) die x,y Koordinaten fuer ihr Schiff ein:"); 
x = sc1.nextInt();
  y = sc2.nextInt(); 
setShip(x,y);	
System.out.println("Geben Sie (Spieler 2) die x,y Koordinaten fuer ihr Schiff ein:");
x = sc1.nextInt();
  y = sc2.nextInt();
  setShip2(x,y);
 
  
 
while (option != 0) {
			System.out.println(" 1 Zuruecksetzen");
			System.out.println(" 2 Spieler 1 - Schiessen");
			System.out.println(" 3 Spieler 2 - Schiessen");
			System.out.println(" 4 Feld von Spieler 1 anzeigen");	
			System.out.println(" 5 Feld von Spieler 2 anzeigen");
			System.out.println(" 6 Spieler 1 - Schiff(e) setzen");
			System.out.println(" 7 Spieler 2 - Schiff(e) setzen");
			System.out.println(" 8 Neues Spiel");
			
			
			option = sc3.nextInt();
		
			switch (option) {
					  case 1:
						 reset();
						 System.out.println("z.Zt. keine Schiffe gesetzt");
						 break;

					  case 2:
						System.out.println(" Geben Sie die Koordinate x & y ein:");
						
						x = sc1.nextInt();
						y = sc2.nextInt();

						if ( fire2(x,y) ) {
							see[x][y] = 0;
							System.out.println("Getroffen!");
						}
							else {
							
							System.out.println("Daneben!");
						}
						break;
						
					case 3:
						System.out.println(" Geben Sie (Spieler ) die Koordinate x & y ein:");
						x = sc1.nextInt();
						y = sc2.nextInt();

						if ( fire(x,y) ) {
							sea[x][y] = 0;
							System.out.println("Getroffen!");
							
						}
						
							else {
							
							System.out.println("Daneben!");
						}
						break;

		
					case 4:
						showSea();
						break;

					case 5: 
						showSea2();
						break;
					

					  case 6:
						 showSea();
					
					System.out.println("Geben sie die x,y Koordinaten fuer ihr Schiff ein:"); 
							x = sc1.nextInt();
							y = sc2.nextInt();
							setShip( x,y);
						break;

					 case 7:
						 showSea2();
					
					System.out.println("Spieler 2:Geben sie die x,y Koordinaten fuer ihr Schiff ein:"); 
							x = sc1.nextInt();
							y = sc2.nextInt();
							setShip2( x,y);
						break;

					case 8:
						reset();
						System.out.println("Neues Spiel.Geben Sie (Spieler 1) die x,y Koordinaten fuer ihr Schiff ein:"); 
						a = sc4.nextInt();
						b = sc5.nextInt();
						setShip( a,b);
						break;

					
		
}
}


         //  Ausgabe
  
System.out.println( "X -> " + x + " Y -> " + y  );
```

Meine Frage an euch, was muss ich machen, damit man ein größeres Schiff setzen kann, also ein z.B: dreier Schiff.
Danke im vorraus!


----------



## XHelp (7. Nov 2010)

Wo ist der unterschied zwischen setShip und setShip2 bzw. generen von Methode und Methode2?

Wie würdest du es denn auf dem Papier setzen? Vermutlich würdest du irgendwo anfangen, und dann 3x nach rechts oder 3x nach unten gehen? Genau so kannst du es auch in Java machen.

Aber bevor du dich in die Programmierung stürzt rate ich dir Grundlagen zu lernen und dich etwas in die Objektorientierung reinzulesen.
P.S. Es reicht auch 1 Insatz der Scanner-Klasse.


----------



## Andi_CH (8. Nov 2010)

Erklärungen tippen braucht länger ;-)

Vieles ist einfach so nach meinem Geschmack, ich würds so machen aber andere können einen anderen Stil haben.

Getestet ist nicht viel.
Was jetzt noch fehlt sind die Regeln
- Schiffe dürfen sich nicht überdecken / berühren
- Wieviele Schiffe welcher Länge müssen gesetzt werden
- Prüfung wann ein Schiff versenkt ist
- Prüfung wann ein Spieler gewonnen hat


```
import java.util.Scanner;

public class Testbattleship {

	private static final int PLAYER1 = 0;
	private static final int PLAYER2 = 1;

	private static int sea [][][] = new int [2][10][10];

	public static void reset() {
		for(int s=0; s<2; s++) {
			for ( int i=0 ; i <= 9 ; i++) {
				for (int j=0; j <= 9 ; j++) {
					sea[s][i][j] = 0;
				}
			}
		}
	}

	public static void showSea(int pPlayer) {
		for ( int i=0 ; i <= 9 ; i++) {
			System.out.println();
			for (int j=0; j <= 9 ; j++) {
				System.out.print(+ sea[pPlayer][i][j]);
			}
		}
		System.out.println();
	}

	public static boolean fire(int pX, int pY, int pToPlayer) {
		boolean hit = sea[pToPlayer][pX][pY]!=0;
		if (hit)
			sea[pToPlayer][pX][pY]=2;
		return hit;
	}

	public static void setShip(int pX, int pY, int pL, boolean pVertikal, int pPlayer) {
		for (int i=0; i<pL; i++)
			if (pVertikal)
				sea[pPlayer][pX][pY+i] = 1;
			else
				sea[pPlayer][pX+i][pY] = 1;
	}

	private static void readShip(int pSpieler) {
		int x, y, l;
		String c;
		Scanner sc = new Scanner (System.in);
		System.out.print("Spieler " + pSpieler+1 + " > Geben Sie die Anfangskoordinaten ein [X Y] :");
		x = sc.nextInt();
		y = sc.nextInt();
		System.out.print("Spieler " + pSpieler+1 + " > Geben Sie die Länge des Schiffes ein : ");
		l = sc.nextInt();
		System.out.print("Spieler " + pSpieler+1 + " > Geben sie die Lage des Schiffes ein h|v :");
		c = sc.next();
		setShip(x,y, l, c.charAt(0)=='v', pSpieler);
	}

	public static void main( String[] args) {
		int option = 1;
		Scanner sc = new Scanner (System.in);
		reset();

		// Berechnung
		readShip(PLAYER1);
		readShip(PLAYER2);
		while (option != 0) {
			System.out.println(" 1 Zuruecksetzen");
			System.out.println(" 2 Spieler 1 - Schiessen");
			System.out.println(" 3 Spieler 2 - Schiessen");
			System.out.println(" 4 Feld von Spieler 1 anzeigen");   
			System.out.println(" 5 Feld von Spieler 2 anzeigen");
			System.out.println(" 6 Spieler 1 - Schiff(e) setzen");
			System.out.println(" 7 Spieler 2 - Schiff(e) setzen");
			System.out.println(" 8 Neues Spiel");

			option = sc.nextInt();

			switch (option) {
			case 1:
				reset();
				System.out.println("z.Zt. keine Schiffe gesetzt");
				break;

			case 2: {
				int x, y;
				System.out.println("Spieler 1 Geben Sie die Zielkoordinate ein [x y] :");
				x = sc.nextInt();
				y = sc.nextInt();
				if (fire(1, x, y)) {
					System.out.println("Getroffen!");
				} else {
					System.out.println("Daneben!");
				}
			}
			break;

			case 3: {
				int x, y;
				System.out.println("Spieler 2 Geben Sie die Zielkoordinate ein [x y] :");
				x = sc.nextInt();
				y = sc.nextInt();
				if (fire(0, x, y)) {
					System.out.println("Getroffen!");
				} else {
					System.out.println("Daneben!");
				}
			}
			break;

			case 4:
				showSea(PLAYER1);
				break;

			case 5: 
				showSea(PLAYER2);
				break;


			case 6:
				showSea(PLAYER1);
				readShip(PLAYER1);
				break;

			case 7:
				showSea(PLAYER2);
				readShip(PLAYER2);
				break;

			case 8:
				reset();
				System.out.println("Neues Spiel");
				readShip(PLAYER1);
				readShip(PLAYER2);
				break;
			}
		}
		//  Ausgabe
//		System.out.println( "X -> " + x + " Y -> " + y  );
	}
}
```


----------



## XHelp (8. Nov 2010)

Nicht zu verachten ist die Prüfung darauf, ob das Schiff überhaupt passt, sonst fliegen ständig ArrayIndexOutOfBounds-Exceptions. Und ich würde es dennoch etwas objektorientierter gestalten. Solche Aufgaben sind eine gute Übung dafür.


----------



## Andi_CH (8. Nov 2010)

Ich hab natürlich bewusst nicht fertig gedacht - OO würde ich für so eine einfach Sache in Fragen stellen - als Übung natürlich ok, aber im "Ernstfall" würde ich wirklich auf meiner Datenstruktur aufbauen.

Ich dachte an mich selbst wie ich getippt habe - als blutiger Anfänger mochte ich es auch ein compilierbares Framework zu haben das auch schon so ein wenig läuft ;-)


----------

