# Schiffe versenken -setzten.



## Chillchen (29. Nov 2014)

Guten Tag meine Lieben Freunde

Wiedereinmal zum alt bekannten Thema Schiffe versenken. Ich steht im moment gerade ein wenig auf dem schlauch. Die Schiffe überschneiden sich im Moment in einem 12x12 grid. und ich weiss nicht wie ich die überschneidungen lösen sollte. ich wäre dankbar für ein tipp/hilfe.


```
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package battleship.strategies;

import battleship.Grid;
import java.util.Random;

/**
 *
 * @author Doomhammer
 */
public class DavidMichelStrategy implements Strategy {

    int shootR;
    int shootC;
    int width;
    int height;
    
    @Override
    public void init(Grid grid, int[] numberOfShips) {
        width=grid.getWidth();
        height=grid.getHeight();
    }

    @Override
    public void fillGrid(Grid grid, int[] numberOfShips) {
        int r=0;
        Random a = new Random();
        int z = a.nextInt(3);
        int c=z;
        for (int l=2; l<numberOfShips.length; l++) { //null Schiffe mit Länge 0 und 1, 3 Schiffe mit Länge 2, 3 Schiffe Länge 3, 2 Schiffe Länge 4, 1 Schiff Länge 5
            Random random = new Random();
            int b = random.nextInt(2); 
            for (int s=0; s<numberOfShips[l]; s++) {
                if (c+l>= width) {
                    c=0;
                    r+=2;
                }
                
                for (int i=0;i<l;i++) {
                    if(b==0) {
                        
                        grid.ships[r][c++]=l;
                        
                    }
                    else {
                        
                        grid.ships[c++][r]=l;
                        
                    }
                }
                c++;
            }
        }
        //Anfangen zu Ballern
        Random random = new Random();
        shootR=0;
        shootC=0;
    }

    @Override
    public int[] shoot() {
        int[] res = new int[] {shootR, shootC};
        shootC++;
        if (shootC==width) {
            shootC=0;
            shootR++;
        }
        if (shootR==height) {
            shootR=0;
        }
        return res;
    }

    @Override
    public void shot(int[] position) {
        
    }

    @Override
    public void result(int code) {
        
    }
    
}
```

Danke


----------



## Gucky (29. Nov 2014)

Was meinst du mit "überschneiden"?

Wenn es so ist, wie ich es verstanden habe, dann wird ein Schiff gesetzt, obwohl Andere im Weg sind.


----------



## Chillchen (29. Nov 2014)

Ja genau, es kann  vorkommen, dass sich die schiffe gegenseitig berühren. Und das ist ja laut regel verboten. Zudem sollte ein abstand von einem feld generiert werden na h und vor dem schiff. Da ich die schiffe random gesetzt habe und mir das technische knowhow fehlt um eine passende if schleife zu generieren, welche dieses problem löst, komme ich nicht weiter. Evtl. Könnte man auch eine 'zweischichtige schleife' schreiben. Die erste kontrolliert und die zweite setzt das schiff. Aber ich bräuchte dabei ein wenig hilfe oder ein Anstubser. Oder könnte man das Problem einfach lösen? Ich wäre für tipps dankbar.


----------



## Gucky (29. Nov 2014)

Zuerst guckst du bitte einmal hier.

Du guckst vor jedem Setzen eines Schiffes, ob ein Anderes im Weg ist und verschiebst das Schiff dann zufällig eine Richtung, bis kein anderes Schiff mehr im Weg ist.
Da du die Schiffe in einem Array speicherst, ist das sehr einfach.
Solltest du außerhalb des Arrays kommen, so wird dies abgefangen und du guckst in eine andere, zufällige Richtung weiter.

So läuft dein Cursor über das Feld, bis er einen ordentlichen Ort gefunden hat.

Was bezweckst du damit:

```
Random random = new Random();
shootR=0;
shootC=0;
```
?


----------

