# Der Weg zum Ziel



## <Batman> (6. Apr 2014)

Hi, 

ich habe hier schon etwas im Forum gestöbert und kann leider nur mit den wenigsten Sachen etwas anfangen. Mir ist auch bewusst, dass diese Seite nicht für eine schnelle Erledigung von Hausaufgaben gedacht ist. Mein Problem ist folgendes:
Wir programmieren in Info gerade unser eigenes Programm und haben vorher die minimalsten Befehle gelernt und bisher nur kleine Zahlenprogramme geschrieben. Das jetzige Programm hat ein immenses Gewicht und wir haben uns als Ziel gesteckt ein Schiffe Versenken zu programmieren. Dabei haben wir uns über zweidimensionale Arrays erkundigt und nach Lösungsansätzen im Netz geschaut. Leider fehlt uns immer noch der richtige Ansatz oder ein paar Fetzen, mit denen wir weiter machen können. :rtfm:
Die größte Herausforderung stellt zu Zeit die grafische Umsetzung des ganzen dar. Mit Buttons und Labels wollten wir eigentlich nicht noch mal einen Versuch starten. Unser Programm kann bereits nach Eingabe der Koordinaten und Betätigung eines Schießbefehls auf die Koordinate schießen und den Wert des feldes verändern. :toll:
Mir geht es nicht um eine Komplettlösung, denn es soll eine Herausforderung bleiben. Eine Herausforderung sind auch Bücher für Programmiereinsteiger, die meist in der unverständlichsten Sprache geschrieben sind. Es wäre unglaublich hilfreich und nett, wenn sich der ein oder andere freundliche User finden würde, der uns ein paar Richtungen vorgibt, mit denen wir zum Ziel gelangen können. Bitte berücksichtigt, dass wir so gut wie keine Erfahrungen haben und es nicht allzu kompliziert werden soll. Der Eigenanteil soll aber dennoch erhalten bleiben.

Mit freundlichen Grüßen Wayne ähhh Batman


----------



## ARadauer (6. Apr 2014)

Was war jetzt genau die Frage? 
Zweidimensionales Array ist schon der richtige Weg...


----------



## Ruzmanz (7. Apr 2014)

Entwerfe ein Szenario und programmiere das schrittweise runter.

Beim Programmstart muss man 2 Integer eingeben, um die Größe des Arrays/Spielfelds festzulegen.
>20
>9
(Einlesen + Array mit dieser Dimension erstellen)

Der Spieler (Mensch) setzt 6 Schiffe (1x1 Block) auf das Spielfeld.
>set 4 2
>set 4 1
>set 6 3
>set 4 3
>set 1 1
>set 2 2
(Einlesen + Array verändern)

Der Computer setzt zufällig 6 Schiffe irgendwo auf das Spielfeld.
(Java Klasse Random)

Das Spielfeld des Menschen wird angezeigt und daneben kommt ein mit Fragezeichen '?' gefülltes Spielfeld des Gegners.

~~~#~~~   ???????
~#~~~~~   ???????
~~~~~#~   ???????

(Ausgabe von 2D-Arrays mit for-Schleife)

Der Mensch kann ein Feld mit einem Befehl bombadieren:
>attack 1 1

Sofern an dieser Position beim Gegner ein Schiff '#' ist, wird das Fragezeichen durch ein '*' ersetzt, ansonsten Wasser '~'. Wurde das Schiff getroffen, darf der Spieler nochmal bombadieren.

Wenn der Computer drann ist, wird wieder mit der Klasse Random ein Feld ausgewählt. Das attackierte Feld wird beim Spieler mit einem '*' gekennzeichnet.

Das ganze packt man in eine Schleife, sodass das Programm erst beendet wird, wenn Computer oder Spieler keine Schiffe '#' in ihrem Array besitzen.

... Nach Lust und Laune kann man mehr Regeln / Optionen / "Sicherheitsabfragen" einbauen ...


----------



## Highchiller (7. Apr 2014)

Wie Ruzmanz schon sagte würde ich auch empfehlen auf der Konsole zu arbeiten. Eine ordentliche GUI überfordert Einsteiger immer sehr schnell, grad weil oft viel Code gebraucht wird um wenig darzustellen. Das schreckt ab und man verliert schnell die Übersicht.

Wenn ihr euch vorher Gedanken macht und euer Projekt gut strukturiert, könnt ihr auf dieser Grundlage später auch noch ganz leichte eine graphische Oberfläche drauf setzen. Euer Programm funkioniert dann aber schon einwandfrei.

Diese Struktur erreicht man wenn ihr darauf achtet Ein- & Ausgaben von der eigentlichen Programmlogik (also euer Board, mit den Schiffen und den Methoden fürs schießen blabla) getrennt zu behandeln. Später könnt ihr dann eure Konsolen-Klassen einfach weglassen und durch eine entsprechende GUI ersetzen ohne das euer Programm dahinter schaden nimmt.

Ansonsten hat Ruzmanz schon alles gesagt. Wie man von der Konsole ließt und darauf Strings ausgebt wisst ihr ja sicher. System.out und System.in sind dabei die wichtigen Streams zur Konsole 

Have fun
Highchiller


----------



## <Batman> (7. Apr 2014)

Hi,

vielen Dank für die Ideen und Ratschläge. Wenn ich wieder nicht weiter komme melde ich mich. Das mit der Konsole klingt ganz gut. 

LG Batman


----------



## ARadauer (8. Apr 2014)

Noch ein Tipp: Last euch nicht entmutigen. Es ist grundsätzlich kein Problem, wenn ihr euch in die falsche Richtung bewegt und dann vieles nochmal umschreiben müsst. Das gehört zum Lernprozess dazu und wird auch in der Praxis oft gemacht.


----------



## <Batman> (8. Apr 2014)

Hi,

wir haben uns gerade etwas in die Zufallszahlen eingelesen, da wir die Werte 0 (kein Schiff) und 1 (Schiff) zufällig in einer konstanten Anzahl auf unseren zweidimensionalen Array verteilen wollen. Allerdings fehlt noch die Idee, die Zufallszahl in den Array einzubringen. 
Btw: Jetzt besitzt unser Spiel auch eine funktionierende Rundenanzeige. 

LG Batman


----------



## Highchiller (8. Apr 2014)

Naja so ganz Zufällig darf die Belegung mit 0 und 1 natürlich nicht sein.
Ihr bastelt euch eine gewisse Anzahl an Schiffen. Nehmen wir der Einfachheit halber 2 kleine Schiffe der Länge 2 und Breite 1 und ein großes der Länge 4 und Breite 1 (ich glaub bei Schiffeversenken sind immer alle Schiffe nur ein Feld breit.)

Jetzt geht es darum diese Zufällig zu platzieren! Das ist der Unterschied!
Ein Ansatz dafür wäre ungefähr folgende Idee als Pseudocode (nicht sehr strenger Pseudocode).


```
Sei TMP := die Menge aller Schiffe;
WHILE TMP nicht leer DO
   generiere Zufällige Position auf dem Feld (x,y);
   finde zulässige Lage in (x,y); // das Schiff kann ja hochkant oder längs liegen.
   IF keine zulässige Lage THEN
      wiederhole schleife;
   ELSE
      wähle zufällig eine Lage aus den zulässigen Lagen;
      setze das Schiff und lösche das Schiff aus TMP;
   END ELSE IF
END WHILE
```

Zuälliges generieren der Positionen dürfte kein Problem sein. Herauszufinden welche Lage aber zulässig ist, könnte etwas kniffliger werden. Darüber könnt ihr euch mal den Kopf zerbrechen


----------



## <Batman> (15. Apr 2014)

Hi,
mittlerweile ist ein Trefferzähler mit hinzugekommen, der auch das Spielende bestimmt. Der letzte Beitrag von highchiller ist zwar gut nachzuvollziehen, allerdings sind wir nicht sicher, wie wir das in unseren bestehenden Code einfügen können. Unser Programm geht momentan jede Zeile und Spalte durch und ordnet in unbegrenzter Anzahl 0 und 1 den koordinaten zu.

Code:
public static void feldmalen() {

    String bname ="";
    for (int z=0 ;z<=9 ;z++ ) {
      for (int s=0 ;s<=9 ;s++ ) {
        bname = "feld"+z+s;
        System.out.println(bname);

      } // end of for
    } // end of for

  }

}  
  // end of class schlachtfeld

Gibt es einen einfachen Trick, um das einfach abzuändern? Wenn wir ein Limit für die Verteilung von 1 festlegen, kann es sein, dass eine vermehrte Verteilung im Bereich der ersten Zeilen und Spalten, die das Programm logischerweise zuerst generiert stattfindet.

Mit freundlichsten Grüßen
Batman


----------



## Androbin (17. Apr 2014)

Moment mal :exclaim: Du sagst einerseits, es fehlt dir an der graphischen Umsetzung und setzt dann trotzdem auf KONSOLEN- Ein/Aus -gaben :question:


----------



## <Batman> (29. Mai 2014)

Hi,

so ganz verstehe ich nicht, was mit Konsole gemeint ist.
Es wurden jetzt sowohl die Positionierung der Einer-Schiffe, als auch die der Zweier-Schiffe mit hunderten if-Anweisungen für jedes einzelne Feld des 10x10 Feldes und Zufallszahlen, die das Feld bestimmen umgesetzt. Es funktioniert sogar, nur braucht der etwas ältere Schulcomputer etwas, bis er es durchgerödelt hat. Sicher hätte man das auch eleganter lösen können, fragt sich nur wie. Wäre ja im Nachhinein doch interessant zu wissen. 

LG Batman


----------



## Androbin (30. Mai 2014)

> ... so ganz verstehe ich nicht, was mit Konsole gemeint ist. ...


Ich glaube, ich helfe dir mal ein wenig auf die Sprünge *8*
Das ist das kleine Fenster mit dem schwarzen Hintergrund, welches sich öffnet,
wenn du noch keine grafische Benutzer-Oberfläche programmiert hast. Das kann ungefähr so aussehen *8*


----------



## lord239123 (4. Jun 2014)

<Batman> hat gesagt.:


> Hi,
> 
> so ganz verstehe ich nicht, was mit Konsole gemeint ist.
> Es wurden jetzt sowohl die Positionierung der Einer-Schiffe, als auch die der Zweier-Schiffe mit hunderten if-Anweisungen für jedes einzelne Feld des 10x10 Feldes und Zufallszahlen, die das Feld bestimmen umgesetzt. Es funktioniert sogar, nur braucht der etwas ältere Schulcomputer etwas, bis er es durchgerödelt hat. Sicher hätte man das auch eleganter lösen können, fragt sich nur wie. Wäre ja im Nachhinein doch interessant zu wissen.
> ...



Ihr solltet später versuchen, die hunderten if Anweisungen durch eine geschachtelte Schelfe zu ersetzen, die jedes Feld durchgeht und überprüft, ob es schon belegt ist. Falls nicht, wird evtl dort ein Schiff platziert.


----------

