Irgendwie beschleicht mich immer noch das Gefühl, du weißt gar nicht wie Schiffe versenken wirklich funktioniert, bzw. du hast das noch nicht in die wesentlichen Schritte zerlegt.
Doch. Ich hab in den letzten Jahren schon paar mal das Spiel programmiert. Du verwechselst da etwas, bzw. verstehst du nicht auf was ich hinaus will, bzw. verfolgst Regeln nicht nicht mehr Zeitgemäß sind.
Erstens: die Prozedur die ich vor paar Beiträgen gepostet habe ist keine Spielfeldanzeige, die kann man schöner machen, sogar mit Bitmaps usw., sondern lediglich eine Kontrollanzeige. Ich traue dir persönlich zu, dass du die gesamte Logik mit der Aufstellung der Schiffe beim ersten Mal und sofort fehlerfrei im Kopf durchdenkst und es fehlerfrei in Pascal runter programmierst. Natürlich wird alles fehlerfrei sein, vor allem die Schiffe im Array-Spielfeld plaziert. Ich denke aber nicht, dass der TE es so hinkriegt, zumindest beim ersten Mal nicht. Sätze des TE wie: "Lass ich jetzt per zufallsfunktion 3x 1er , 2x 2er, 1x 3er , 1x 4er zufällig auf das 12x12 anzeigen..? " lassen die Vermutung zu, dass da noch kein Plan dahinter steckt. Das klingt eher nach: lassen wir es mal runterplumpsen, es wird sich evtl. schon selbst sortieren. Ich denke eher es wird ein Prozess von Try and Error. Nur wie soll er es kontrollieren ohne den Inhalt des Array zu sehen? Selbst bei mir war die Aufstellung erst nach zwei Korrekturen fehlerfrei. Im Kopf war es schon beim ersten Mal richtig. Beim ersten Versuch platzierten sich aber keine Schiffe am Rand. Man denkt eben nicht an alles.
Also, ich hab das schon didaktisch durchdacht. Wenn du aber der Meinung bist, dass der TE den Algorithmus direkt hinkriegt, dann ja, dann kann man sich die Prüfanzeige sparen.
Zweitens: man sollte schon vorher überlegen wie man es später anzeigen wird. Wenn man das nicht macht, kann man später böse Überraschungen erleben.
Drittens: dein Konzept. Dein Konzept hält sich an die Papiervariante, wie sie in Wikipedia beschrieben wird. Und dieses Konzept ist nicht so ohne weiteres auf ein Programm übertragbar. Die Papiervariante funktioniert so: zwei Spieler zeichnen ein Spielfeld auf dem Blatt Papier und platzieren dort ihre Schiffe per menschlicher Logik und Kreuzchen. Im Spiel erkennt der Mensch mit seiner menschlichen Logik wenn alle Felder seines 4'er Schiffes getroffen wurden. Er meldet das Schiff dann als getroffen. Wie übertragen wir das nun auf ein Programm?
Du hast das Aufgezählt:
- Wasser
- Treffer
- Versenkt
- Flotte versenkt
- Auf das Feld wurde schon geschossen
- Koordinaten ausserhalb des Spielfelds
Das klingt toll, aber gehen wir der Reihe nach. Punkt 1 und 2 sind kein Problem, aber erkläre mir wie der TE nun erkennt, das ein Schiff versenkt wurde? Bei dir haben alle Schiffe wohl einen Wert. Einfach Schiff = 1, Wasser = 0. Zumindest habe ich das so verstanden (siehe Wasser, Schiff, Nahbereich). Natürlich ist das umsetzbar, aber was man am Anfang sich an Arbeit gespart hat, in dem man es simpel gemacht hat, muss man später kompliziert programmieren. Nun muss man Schiffe im Feld kompliziert erkennen.
Viertens:
function SchussAuf
. Du bist schon beim Feuern und mir hältst du vor, dass ich schon an die Anzeige denke. Wie wäre es wenn der TE erst die Schiffe automatisch auf dem Feld platziert, die den Regeln entsprechen? Das Feuern und anfragen ob ein Schiff getroffen wurde ist nicht wirklich kompliziert.
Fünftens: ich denke mir die Regeln die du favorisierst sind komplizierter als sie sein müssen. In der Computervariante des Spiels dürfen sich Schiffe berühren, sogar auf Stoß. Beim Programmieren hat man andere Möglichkeiten als auf dem Papier. Diese Regeln, die eigentlich nur für die Papier-Variante gelten, machen das für den TE komplizierter als es sein müsste.