![]() |
AW: Schiffe versenken programmieren
@Sir Rufo
Ok , bis zur Ausgabe habe ich es jetzt.. Wie könnte ich jetzt weitermachen? |
AW: Schiffe versenken programmieren
Zitat:
|
AW: Schiffe versenken programmieren
Zitat:
Delphi-Quellcode:
Ist jetzt nach deiner Idee und etwas andere Begriffe..
var
Form1: TForm1; Spielfeld : array[0..11,0..11] of integer; const wasser = 0 ; nahschiff = 1; //zur Positionierung der schiffe schiff = 2; twert = 10; T_wasser = wasser + twert; T_nahschiff = nahschiff + twert; T_schiff = schiff + twert; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var x, y : integer; begin // Ausgabe des Spielfeldes for y := 0 to 11 do for x := 0 to 11 do begin case Spielfeld[x,y] of wasser : Write( ' ' ); nahschiff : Write( '+' ); schiff : Write( '#' ); T_wasser : Write( 'o' ); T_nahwasser : Write( '*' ); T_schiff : Write( 'X' ); end; end; WriteLn; // Neue Zeile end; end. Wäre das soweit erstmal richtig? |
AW: Schiffe versenken programmieren
@leodinho
Kopiere nicht wieder, verstehe es. Wähl nicht wieder den Weg des kleinsten Widerstandes. Das wichtigste ist zuerst zu verstehen was ein Array ist, und was ich bisher gelesen habe, ist es noch nicht so 100% drin. Eine Variable kann ein Wert aufnehmen: Zitat:
Code:
Wobei man auch statt Integer auch ein zweites Array nehmen kann - z. B. array[1..3] of array[1..3] of Integer; - abgekürzt array[1..3, 1..3] of Integer - aber im Grunde genommen gleich. Das Array kann dann 3 x 3 = 9 Werte aufnehmen. Stellt man sich das nun zweidimensional vor, ergibt das ein Feld:
a[1] := 4;
a[2] := 3; 2[3] := 9; Zitat:
Delphi-Quellcode:
Wieso hast du das so gemacht, und nicht anders? Ich hoffe du hast es nicht nur angeschrieben.
var
Form1: TForm1; Spielfeld : array[0..11,0..11] of integer; Als erstes, es spielt nicht wirklich eine große Rolle, aber man sollte stets den kleinsten Variablentyp nehmen den man benötigt (auch wenn himitsu vermutlich gleich korrekterweise einwenden wird, dass Integer für die Verarbeitung trotz dem günstiger ist, trotzdem...). Ein ShortInt als Typ ist vermutlich ausreichend. Der geht von -128 bis 127. Das reicht. Zweitens solltest du die 11 über eine Konstante zuweisen. Du wirst die 11 noch als Zahl öfters brauchen. Somit ist eine Konstante zu empfehlen.
Delphi-Quellcode:
Was den Code angeht:
const
MaxFeld = 11; var Form1: TForm1; Spielfeld : array[0..MaxFeld, 0..MaxFeld] of ShortInt;
Delphi-Quellcode:
da ist nichts verkehrtes dran, aber das ist zu einfach. Was du dir hier an Arbeit sparst, mußt du später intelligent programmieren. Denn wenn du es dir jetzt einfach machst und Wasser 0 wählst und allen Schiffen dann eine 2, mußt du später einen Algorithmus programmieren der erkennt welche Schiffe untergegangen sind. Wenn dein Schiff von Länge 1 und Schiff von Länge 4 die gleiche Zahl hat, wie erkennst du, dass alle Bereiche von Schiff der Länge 4 getroffen wurden?
const
wasser = 0 ; nahschiff = 1; //zur Positionierung der schiffe schiff = 2; Bedenke, die Regeln in Wikipedia beschrieben die Papiervariante des Spiels. Da erkennt der Mensch ob alle Teile getroffen wurden. Bei einem Programm musst du es anders machen. Vorschlag: Wasser bekommt den Wert 0, dann bekommt jedes Schiff eine Zahl - Schiff 1 die 1, Schiff 2 die 2, Schiff 3 die 3, usw. Gehen wir davon aus, dass Schiff 3 vier Zellen lang ist, haben alle Zellen den Wert 3. Wurde eine Zelle getroffen, wird aus der positiven Zahl 3 die negative Zahl -3. Hat Schiff 3 alle Zahlen negativ, ist er versunken. Da braucht man keinen intelligenten Code um das zu prüfen. Dieses Konzept ist für ein Programm und vor allem für dich einfacher zu händeln. Du musst nur das Array nur nach positiven 3'er durchsuchen um zu prüfen ob das Schiff versunken ist. Teilst du allen Schiffen die gleiche Zahl zu, was am Anfang einfacher ist, musst du später komplizierter prüfen ob ein Schiff versunken ist. |
AW: Schiffe versenken programmieren
Zitat:
Zitat:
Da kommt das weiter oben bereits angesprochene Stringgrid ins Spiel. eine andere Möglichkeit wäre es z.B. Form1.Canvas.Output zu nutzen oder gleich eine gans andere Komponente.... Gruß K-H |
AW: Schiffe versenken programmieren
Hier eine kleine Prozedur zum Anzeigen des Spielfeldes. Benötigt wird die Komponente TPaintBox:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const MaxFelder = 11; //wenn bereits global gesetzt, kann die Konstante weg! procedure Rechteck(ax, ay, az: Integer); const Col: array[0..9] of TColor = (clWhite, clRed, clFuchsia, clGreen, clOlive, clMaroon, clNavy, clPurple, clBlue, clYellow); var w, h: Integer; begin with PaintBox1 do begin w := Width div (MaxFelder + 1); h := Height div (MaxFelder + 1); Canvas.Pen.Color := clBlack; Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := Col[az]; Canvas.Rectangle(ax * w, ay * h, (ax * w) + w, (ay * h) + h); end; end; var x, y: Integer; begin for y := 0 to MaxFelder do for x := 0 to MaxFelder do Rechteck(x, y, SpielFeld[x, y]); end; |
AW: Schiffe versenken programmieren
Sollte die Logik nicht erst einmal klar sein, bevor man eine Oberfläche bastelt? Sonst landet man wieder bei der "function follows design"-Programmierung und vermengt schlimmstenfalls Darstellung und Logik.
|
AW: Schiffe versenken programmieren
Das ist keine Oberfläche, das ist nur zum Testen des Inhalts von dem Array.
|
AW: Schiffe versenken programmieren
Zitat:
Zitat:
Gruß K-H |
AW: Schiffe versenken programmieren
Danke schonmal für eure zahlreichen ideen.. Habe sie weitgehend umgesetzt..
Nun habe ich auch schon einen zähler sowie eine bestenlisten , die ich mit tvielist erstellt habe. (: Nun möchte ich mich wieder an den schwierigen part setzten -> schiffe platzieren :D Wie wäre es sinnvoll dabei vorzugehen? (: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz