Delphi-PRAXiS
Seite 14 von 19   « Erste     4121314 1516     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schiffe versenken programmieren (https://www.delphipraxis.net/178499-schiffe-versenken-programmieren.html)

leodinho 28. Feb 2014 12:15

AW: Schiffe versenken programmieren
 
@Sir Rufo

Ok , bis zur Ausgabe habe ich es jetzt..
Wie könnte ich jetzt weitermachen?

Sir Rufo 28. Feb 2014 12:40

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250020)
@Sir Rufo

Ok , bis zur Ausgabe habe ich es jetzt..
Wie könnte ich jetzt weitermachen?

Dann zeig doch mal was du bis jetzt hast

leodinho 28. Feb 2014 12:46

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250025)
Zitat:

Zitat von leodinho (Beitrag 1250020)
@Sir Rufo

Ok , bis zur Ausgabe habe ich es jetzt..
Wie könnte ich jetzt weitermachen?

Dann zeig doch mal was du bis jetzt hast

Delphi-Quellcode:
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.
Ist jetzt nach deiner Idee und etwas andere Begriffe..
Wäre das soweit erstmal richtig?

Popov 28. Feb 2014 14:43

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:

a := 1;
Ein Array - z. B. array[1..3] of Integer kann drei Werte aufnehmen
Code:
a[1] := 4;
a[2] := 3;
2[3] := 9;
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:

Zitat:

0 0 0
0 0 0
0 0 0
Kommen wir zu deinem Beispiel:
Delphi-Quellcode:
var
  Form1: TForm1;
  Spielfeld : array[0..11,0..11] of integer;
Wieso hast du das so gemacht, und nicht anders? Ich hoffe du hast es nicht nur angeschrieben.

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:
const
  MaxFeld = 11;

var
  Form1: TForm1;
  Spielfeld : array[0..MaxFeld, 0..MaxFeld] of ShortInt;
Was den Code angeht:
Delphi-Quellcode:
const
  wasser = 0 ;
  nahschiff = 1; //zur Positionierung der schiffe
  schiff = 2;
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?

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.

p80286 28. Feb 2014 15:21

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250026)
Wäre das soweit erstmal richtig?

Nein, denn Du hast ein wichtiges Detail übersehen:
Zitat:

Delphi-Quellcode:
// Ausgabe des Spielfelds auf der Console
 for y := 0 to 11 do
   for x := 0 to 11 do ....

Wenn Du mit einem Form hantierst, kannst du nicht Write/Writeln für die Ausgabe nutzen.
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

Popov 28. Feb 2014 15:46

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;

DeddyH 28. Feb 2014 15:51

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.

Popov 28. Feb 2014 16:00

AW: Schiffe versenken programmieren
 
Das ist keine Oberfläche, das ist nur zum Testen des Inhalts von dem Array.

p80286 28. Feb 2014 17:05

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von DeddyH (Beitrag 1250045)
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.

Zitat:

Zitat von Popov (Beitrag 1250048)
Das ist keine Oberfläche, das ist nur zum Testen des Inhalts von dem Array.

Ich denke jetzt hole ich mir Chips und Bier.

Gruß
K-H

leodinho 2. Mär 2014 09:47

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.
Seite 14 von 19   « Erste     4121314 1516     Letzte »    

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