AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Schiffe versenken programmieren

Ein Thema von leodinho · begonnen am 11. Jan 2014 · letzter Beitrag vom 4. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 11:54
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 TSpielfeld : array[0..11,0..11] of integer;
  • Funktion procedure ZeigeSpielfeld( ASpielfeld : TSpielfeld );
  • Funktion function SchussAuf( ASpielfeld : TSpielfeld; x,y : Integer ) : Integer;
Wichtig ist, dass man hier das erwartete Verhalten festlegt und dokumentiert.
(Beispiel: Welche Werte gibt 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 var Spielfeld : array[0..11,0..11] of integer; und keinen Datentyp type TSpielfeld = array[0..11,0..11] of integer; . Darum steht da einmal var und type .

Das T ist nur Konvention und soll zeigen, dass es sich um einen Type handelt.
(z.B. kennst du 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Mär 2014 um 11:57 Uhr)
  Mit Zitat antworten Zitat
leodinho

Registriert seit: 9. Dez 2013
58 Beiträge
 
#2

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 12:08
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;
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 12:36
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;
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
leodinho

Registriert seit: 9. Dez 2013
58 Beiträge
 
#4

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 12:44
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
nun muss ich nur irgendwie die schiffe auf dem spielfeld anzeigen /:
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 13:00
Das T ist nur Konvention und soll zeigen, dass es sich um einen Type handelt.
(z.B. kennst du 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.

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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 13:40
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Mär 2014 um 13:43 Uhr)
  Mit Zitat antworten Zitat
leodinho

Registriert seit: 9. Dez 2013
58 Beiträge
 
#7

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 14:47
Ich bekomm es einfach nicht hin, das ist das problem.. /:
ich schick euch einfach mal das was ich habe.. weiter bekomm ich das eh nicht hin -.-
Angehängte Dateien
Dateityp: rar Projekt -.rar (208,6 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 15:07
Ich bekomm es einfach nicht hin, das ist das problem.. /:
ich schick euch einfach mal das was ich habe.. weiter bekomm ich das eh nicht hin -.-
Ohne mir das jetzt anzuschauen, solange wie du es nicht schaffst ein großes Problem in kleinere Problemchen zu zerlegen, wirst du nicht programmieren können.

Einfach so drauf los funktioniert nicht, du musst dir vorher Gedanken über den Ablauf machen und dann kannst du diesen Ablauf umsetzen. Bei der Umsetzung bin ich gerne bereit zu helfen (wenn dann noch benötigt), aber von dem Ablauf habe ich von dir noch nichts gesehen.

So wie ich im vorherigen Beitrag den Schussablauf definiert habe kannst du auch die anderen Abläufe darstellen. Die Anzeige kannst du zunächst raus lassen, denn rudimentär ist die ja schon da (Ausgabe über die Konsole) und für einen Test reicht die aus. Schön kommt immer erst nach Funktion. Und Schiffe versenken funktioniert nicht ausschließlich mit bunten Bildern, sondern wird nur hübscher.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 15:15
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:
  1. Wasser
  2. Treffer
  3. Versenkt
  4. Flotte versenkt
  5. Auf das Feld wurde schon geschossen
  6. 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.
  Mit Zitat antworten Zitat
leodinho

Registriert seit: 9. Dez 2013
58 Beiträge
 
#10

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 15:32
ich würde mich über eine anmerkung zu meinem bisherigen programm freuen..

ich gehe ja logisch und in kleinen schritten vor aber wie soll ich ein schuss auf das feld machen, wenn nicht mal schiffe auf dem feld vorhanden sind??
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 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