Delphi-PRAXiS
Seite 15 von 19   « Erste     5131415 1617     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)

Puke 2. Mär 2014 10:09

AW: Schiffe versenken programmieren
 
Highscores als letztes!
Konzentrier dich auf das Spiel, denn ohne Spiel kein Highscores!:mrgreen:

Popov 2. Mär 2014 10:23

AW: Schiffe versenken programmieren
 
@leodinho

Was hast du bisher programmiert?

Sir Rufo 2. Mär 2014 10:34

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250158)
Danke schonmal ür eure zahlreichen ideen.. Habe sie weitgehend umgesetzt..
Nun habe ich auch schon zähler fertig und will jetzt erstmal weitere, leichte parts programmieren..
Wie könnte ich ein highscore einbauen?
Oder soll ich jetzt erstmal anfangen die schiffe auf dem vorhanden welt anzeigen zu lassen?

Wenn man geplant vorgeht, dann arbeitet man sich von der groben Planung immer tiefer bis zur Implementierung durch..

Nach der groben Planung definiert man die Funktionen/Klassen/Datentypen.
  • Datentyp
    Delphi-Quellcode:
    TSpielfeld : array[0..11,0..11] of integer;
  • Funktion
    Delphi-Quellcode:
    procedure ZeigeSpielfeld( ASpielfeld : TSpielfeld );
  • Funktion
    Delphi-Quellcode:
    function SchussAuf( ASpielfeld : TSpielfeld; x,y : Integer ) : Integer;
Wichtig ist, dass man hier das erwartete Verhalten festlegt und dokumentiert.
(Beispiel: Welche Werte gibt
Delphi-Quellcode:
SchussAuf
zurück und welche Bedeutung haben diese)

Dann kann man diese bei der Implementierung auch benutzen, ohne dass diese schon implementiert sein müssen. Es passiert halt einfach noch nichts, gibt aber auch keinen Fehler.

Dann geht man an die Implementierung der einzelnen Teile.

leodinho 2. Mär 2014 11:44

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250166)
Zitat:

Zitat von leodinho (Beitrag 1250158)
Danke schonmal ür eure zahlreichen ideen.. Habe sie weitgehend umgesetzt..
Nun habe ich auch schon zähler fertig und will jetzt erstmal weitere, leichte parts programmieren..
Wie könnte ich ein highscore einbauen?
Oder soll ich jetzt erstmal anfangen die schiffe auf dem vorhanden welt anzeigen zu lassen?

Wenn man geplant vorgeht, dann arbeitet man sich von der groben Planung immer tiefer bis zur Implementierung durch..

Nach der groben Planung definiert man die Funktionen/Klassen/Datentypen.
  • Datentyp
    Delphi-Quellcode:
    TSpielfeld : array[0..11,0..11] of integer;
  • Funktion
    Delphi-Quellcode:
    procedure ZeigeSpielfeld( ASpielfeld : TSpielfeld );
  • Funktion
    Delphi-Quellcode:
    function SchussAuf( ASpielfeld : TSpielfeld; x,y : Integer ) : Integer;
Wichtig ist, dass man hier das erwartete Verhalten festlegt und dokumentiert.
(Beispiel: Welche Werte gibt
Delphi-Quellcode:
SchussAuf
zurück und welche Bedeutung haben diese)

Dann kann man diese bei der Implementierung auch benutzen, ohne dass diese schon implementiert sein müssen. Es passiert halt einfach noch nichts, gibt aber auch keinen Fehler.

Dann geht man an die Implementierung der einzelnen Teile.

Ich haben den datentyp ja schon ( aber warum (T)Spielfeld? )
Wie zeige ich nun die Schiffe auf dem 12 x 12 Spielfeld an?
Lass ich jetzt per zufallsfunktion 3x 1er , 2x 2er, 1x 3er , 1x 4er zufällig auf das 12x12 anzeigen..?
Wie bekomm ich das am besten hin ?

Sir Rufo 2. Mär 2014 11:54

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250179)
Zitat:

Zitat von Sir Rufo (Beitrag 1250166)
Zitat:

Zitat von leodinho (Beitrag 1250158)
Danke schonmal ür eure zahlreichen ideen.. Habe sie weitgehend umgesetzt..
Nun habe ich auch schon zähler fertig und will jetzt erstmal weitere, leichte parts programmieren..
Wie könnte ich ein highscore einbauen?
Oder soll ich jetzt erstmal anfangen die schiffe auf dem vorhanden welt anzeigen zu lassen?

Wenn man geplant vorgeht, dann arbeitet man sich von der groben Planung immer tiefer bis zur Implementierung durch..

Nach der groben Planung definiert man die Funktionen/Klassen/Datentypen.
  • Datentyp
    Delphi-Quellcode:
    TSpielfeld : array[0..11,0..11] of integer;
  • Funktion
    Delphi-Quellcode:
    procedure ZeigeSpielfeld( ASpielfeld : TSpielfeld );
  • Funktion
    Delphi-Quellcode:
    function SchussAuf( ASpielfeld : TSpielfeld; x,y : Integer ) : Integer;
Wichtig ist, dass man hier das erwartete Verhalten festlegt und dokumentiert.
(Beispiel: Welche Werte gibt
Delphi-Quellcode:
SchussAuf
zurück und welche Bedeutung haben diese)

Dann kann man diese bei der Implementierung auch benutzen, ohne dass diese schon implementiert sein müssen. Es passiert halt einfach noch nichts, gibt aber auch keinen Fehler.

Dann geht man an die Implementierung der einzelnen Teile.

Ich haben den datentyp ja schon ( aber warum (T)Spielfeld? )
Wie zeige ich nun die Schiffe auf dem 12 x 12 Spielfeld an?
Lass ich jetzt per zufallsfunktion 3x 1er , 2x 2er, 1x 3er , 1x 4er zufällig auf das 12x12 anzeigen..?
Wie bekomm ich das am besten hin ?

Du hast eine Variable
Delphi-Quellcode:
var Spielfeld : array[0..11,0..11] of integer;
und keinen Datentyp
Delphi-Quellcode:
type TSpielfeld = array[0..11,0..11] of integer;
. Darum steht da einmal
Delphi-Quellcode:
var
und
Delphi-Quellcode:
type
.

Das T ist nur Konvention und soll zeigen, dass es sich um einen Type handelt.
(z.B. kennst du
Delphi-Quellcode:
TForm
)

Gerade wenn man das Spielfeld als Parameter übergeben will/muss, dann einen eigenen Type deklarieren
Delphi-Quellcode:
type
  TSpielfeld = array[0..11,0..11] of integer;

var
  Spielfeld : TSpielfeld;

procedure ZeigeSpielfeld( ASpielfeld : TSpielfeld );
Das mit dem wie anzeigen und platzieren der Schiffe haben wir hier doch schon durchgekaut.

leodinho 2. Mär 2014 12:08

AW: Schiffe versenken programmieren
 
achso, stimmt, fällt mir grad auch ein.
Ja , das mit dem platzieren meine ich in der Sicht, sie auf dem Feld für den Benutzer sichtbar zu machen? (:

wenn ich den datentyp hinschreibe und starten will ob es probleme gibt, erscheint ein problem das '=' vorhanden aber ':' erwartet wird.. Änder ich das, so kommt neue meldung.


Delphi-Quellcode:
TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    Label1: TLabel;
    Button2: TButton;
    lvHighscore: TListView;
    Button3: TButton;
    Label2: TLabel;
    Label3: TLabel;
    TSpielfeld = array[0..11,0..11] of integer;
Delphi-Quellcode:
var
  Form1: TForm1;
  zaehler : integer = 0 ;
  Spielfeld : TSpielfeld;
  name : integer;

TForm1 2. Mär 2014 12:36

AW: Schiffe versenken programmieren
 
Jetzt hast du TSpielfeld unter TForm1 deklariert, du musst den Typ aber unter dem Abschnitt Type deklarieren:
Code:
Type
    TForm1 = class(TForm)
        Button1: TButton;
        PaintBox1: TPaintBox;
        Label1: TLabel;
        Button2: TButton;
        lvHighscore: TListView;
        Button3: TButton;
        Label2: TLabel;
        Label3: TLabel;
        end;

    TSpielfeld = array[0..11,0..11] of integer;

leodinho 2. Mär 2014 12:44

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von TForm1 (Beitrag 1250185)
Jetzt hast du TSpielfeld unter TForm1 deklariert, du musst den Typ aber unter dem Abschnitt Type deklarieren:
Code:
Type
    TForm1 = class(TForm)
        Button1: TButton;
        PaintBox1: TPaintBox;
        Label1: TLabel;
        Button2: TButton;
        lvHighscore: TListView;
        Button3: TButton;
        Label2: TLabel;
        Label3: TLabel;
        end;

    TSpielfeld = array[0..11,0..11] of integer;

ahh ok :thumb:
nun muss ich nur irgendwie die schiffe auf dem spielfeld anzeigen /:

Popov 2. Mär 2014 13:00

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250181)
Das T ist nur Konvention und soll zeigen, dass es sich um einen Type handelt.
(z.B. kennst du
Delphi-Quellcode:
TForm
)

Das mit dem T bringt noch weitere Vorteile mit sich, z. B. das schon von Sir Rufo (nur) nebenbei erwähnte
Delphi-Quellcode:
type
  TSpielfeld = array[0..11,0..11] of integer;

var
  Spielfeld : TSpielfeld;

procedure ZeigeSpielfeld( ASpielfeld : TSpielfeld );
Soll bedeuten, man kann das Array Spielfeld auch als Parameter übergeben. Ohne das wäre es etwas problematischer.

Trotzdem, an dieser Stelle (wg. Anfänger) würde ich das nicht als Parameter übergeben, sondern das Spielfeld global nutzen.

Somit könnte man das auch so deklarieren:
Delphi-Quellcode:
var
  Spielfeld : array[0..11,0..11] of integer;
man kann es aber auch so lassen:
Delphi-Quellcode:
type
  TSpielfeld = array[0..11,0..11] of integer;

var
  Spielfeld : TSpielfeld;
Die Frage ist nur, ob man es versteht und evtl. dem Lehrer erklären muss was das damit auf sich hat, bzw. woher das Wissen kommt. Aber letztendlich ist beides ok.

Delphi-Quellcode:
TForm1 = class(TForm)
    Button1: TButton;
    abc: Integer;
Wenn du das so machst, dann erweiterst du TForm1, abc ist dann eine Faldvariable von TForm1, bzw. Art Eigenschaft von TFom1. Der Zugriff ist dann aber auch so: Form1.abc := 123;

@leodinho

Und bevor wir weiter machen, eine Frage: was machst du gerade? Zeig mal dein Konzept auf, denn im Beitrag #106 habe ich dir mit der Auflistung der Funktionen ein grobes Konzept gegeben, aber vor allem auch den Weg beschrieben mit kleinen Codes zum Ergebnis zu kommen. Man kann es auch anders machen, aber ich hab das Gefühl, dass du gerade das Stück Code nimmst was dir gerade einer vorlegt, ohne zu verstehen wozu es da ist, statt selbst zu programmieren.

Zeig das Konzept, sonst kann man dir nicht wirklich helfen und du kriegst höchstens Antworten auf Fragen, aber keine richtigen Tipps.

Zitat:

Zitat von leodinho (Beitrag 1250187)
nun muss ich nur irgendwie die schiffe auf dem spielfeld anzeigen /:

Ich habe dir eine Prozedur geliefert mit der du dein Array überprüfen kannst. Nicht gesehen oder gefällt sie dir nicht?

Sir Rufo 2. Mär 2014 13:40

AW: Schiffe versenken programmieren
 
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.

Darum verbeißt du dich in diese "bekloppte" Anzeige des Spielfelds, die mit dem Spiel an sich nichts zu tun hat.

Nehmen wir doch mal völlig losgelöst (ja das geht, und so sollte man jedes Einzelne Teilproblem hier angehen) den Schuss auf eine Koordinate und überlegen uns, was da passieren muss:
  1. Die Schuss-Koordinaten werden benötigt
  2. Das Spielfeld wird benötigt
Ok, damit können wir nun den Schuss abgeben, aber reicht uns das schon?
Wäre ja schick, wenn wir eine Rückmeldung bekommen.
Was für Rückmeldungen können dort kommen?
  • Wasser
  • Treffer
  • Versenkt
  • Flotte versenkt
  • Auf das Feld wurde schon geschossen
  • Koordinaten ausserhalb des Spielfelds
Damit können wir schon folgendes schreiben:
Delphi-Quellcode:
const
  Schuss_Wasser = 0;
  Schuss_Treffer = 1;
  Schuss_Versenkt = 2;
  Schuss_FlotteVersenkt = 3;
  Schuss_NichtNochmal = 4;
  Schuss_Ausserhalb = 5;

function SchussAuf( ASpielfeld : TSpielfeld; x,y : Integer ) : Integer;
begin
  // Dummy, wir melden mal immer Wasser, weil wir noch nicht wissen, wie wir das umsetzen wollen
  Result := Schuss_Wasser;
end;
Bei 2 Ergebnissen muss die Eingabe der Koordinaten wiederholt werden, und bei einem Ergebnis ist das Spiel zu Ende.
Die anderen Ergebnisse gehören zum normalen Spielablauf.

Genau das musst du auch für die anderen Teile erst mal ausarbeiten, dann kannst du anfangen das umzusetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr.
Seite 15 von 19   « Erste     5131415 1617     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