Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

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)

Mavarik 28. Feb 2014 11:31

AW: Schiffe versenken programmieren
 
Mit schönem Gruß von uns alle an Deinen Informatik-Lehrer.

Er möge sich hier mal einloggen, damit wir Ihn mal so richtig durch den Wolf drehen können...

OK... Wie mache ich aus einem Array ein Spielfeld...

Delphi-Quellcode:
Var
  Feld : Array ['A'..'B',1..2] of Integer;
Spielfeld;

AB
1..
2.o

Initialisierung:

Delphi-Quellcode:
begin
  Feld['A',1] := 0; // Wasser
  Feld['A',2] := 0; // Wasser
  Feld['B',1] := 0; // s.o.
  Feld['B',2] := 1; // U-Boot
end;
Schuss:

Gegeben sind 2 Edit Felder. 1x für die Spalte "A..B" ('L' in Deinem Fall) 1x für die Reihe

Delphi-Quellcode:
var
  Spalte : Shortstring; // eigentlich auch ein "Array" ;-)
  Reihe : Integer;
begin
  Spalte := copy(Uppercase(trim(Edit1.Text)),1,1);
  Reihe := Strtoint(trim(Edit2.Text));

  if Feld[Spalte[1],Reihe] = 0 then
    // Ausgabe "Wasser"
    else // Ausgabe "Treffer"
end;
Verstanden?

Mavarik

PS.: 120 Nachtrichten für so ein kleines Thema... Klingt langsam wie ein Wettbewerb... Wer Programmiert Schiffe-Versenken mit den wenigsten Zeilen Source-Code... Müssen nur noch die Rahmenbedingungen festlegen...

p80286 28. Feb 2014 11:34

AW: Schiffe versenken programmieren
 
[OT]
Zitat:

Zitat von Mavarik (Beitrag 1250008)
Mit schönem Gruß von uns alle an Deinen Informatik-Lehrer.
Er möge sich hier mal einloggen, damit wir Ihn mal so richtig durch den Wolf drehen können...

Und ich dachte immer zum Lernen gehören zwei, einer der lehrt und einer der lernt

Gruß
K-H
[/OT]

Sir Rufo 28. Feb 2014 11:38

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von p80286 (Beitrag 1250009)
[OT]
Zitat:

Zitat von Mavarik (Beitrag 1250008)
Mit schönem Gruß von uns alle an Deinen Informatik-Lehrer.
Er möge sich hier mal einloggen, damit wir Ihn mal so richtig durch den Wolf drehen können...

Und ich dachte immer zum Lernen gehören zwei, einer der lehrt und einer der lernt

Gruß
K-H
[/OT]

Wenn Bauer mit Badehose nicht schwimmen kann, dann sagt der Bauer "Liegt an der Badehose" und die Hose "Liegt am Bauern".
Das Wasser sagt "Mir doch egal wer Schuld ist"

Mavarik 28. Feb 2014 11:41

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von p80286 (Beitrag 1250009)
[OT]
Zitat:

Zitat von Mavarik (Beitrag 1250008)
Mit schönem Gruß von uns alle an Deinen Informatik-Lehrer.
Er möge sich hier mal einloggen, damit wir Ihn mal so richtig durch den Wolf drehen können...

Und ich dachte immer zum Lernen gehören zwei, einer der lehrt und einer der lernt

Gruß
K-H
[/OT]

[OT]Ach Du bist sein Lehrer? :cyclops:...

Hast natürlich recht, aber das ist doch auch die Aufgabe eines Lehrers den Stoff so zu vermitteln, dass der Schüler Ihn versteht. So eine Aufgabe "Programmier mal Schiffeversenken" kommt ja nicht von 0 auf 100.
Das Thema wurde doch sicherlich aufgebaut...
König Dodon und das Array of Boolean...usw.
[/OT]

Mavarik 28. Feb 2014 11:43

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250010)
Wenn Bauer mit Badehose nicht schwimmen kann, dann sagt der Bauer "Liegt an der Badehose" und die Hose "Liegt am Bauern".
Das Wasser sagt "Mir doch egal wer Schuld ist"

Du hast "was" vergessen...

leodinho 28. Feb 2014 12:05

AW: Schiffe versenken programmieren
 
:?::?::?:
Ich bekomme es aber nicht auf meine Form übertragen /:

leodinho 28. Feb 2014 12:11

AW: Schiffe versenken programmieren
 
Zitat:

Wenn du das Spielfeld anzeigen willst, dann gibst du abhängig vom Wert eben das passende heraus
Wie bekomm ich das Spieldfeld nun ausgegeben? syntaktisch habe ich keine fehler aber sobald ich auf den button klicke habe ich ein error /:

Mavarik 28. Feb 2014 12:11

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250015)
:?::?::?:
Ich bekomme es aber nicht auf meine Form übertragen /:

Hä?

Was von wo nach wo? Kannst du bitte deine Frange etwas ausführlicher stellen?

Mavarik 28. Feb 2014 12:13

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250016)
Zitat:

Wenn du das Spielfeld anzeigen willst, dann gibst du abhängig vom Wert eben das passende heraus
Wie bekomm ich das Spieldfeld nun ausgegeben? syntaktisch habe ich keine fehler aber sobald ich auf den button klicke habe ich ein error /:

Welchen error? Welchen sourcecode? Meine Glaskugel will gerade nicht so richtig...

Klaus01 28. Feb 2014 12:13

AW: Schiffe versenken programmieren
 
.. das kommt ja auch erst später...

Ein Array ist ein nicht visuelles Element.

Ein StringGrid/DrawGrid kannst Du zum anzeigen verwenden.

Das Array ist zur Datenhaltung gedacht.
Das StringGrid/DrawGrid zur Anzeige der Daten.

Im Prinzip musst Du nach jeder Aktion ducht das Array wandern
und anhand der Daten das StringGrid/DrawGrid füllen.

Grüße
Klaus

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? (:

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.

leodinho 2. Mär 2014 14:47

AW: Schiffe versenken programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 -.-

Sir Rufo 2. Mär 2014 15:07

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250223)
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.

Popov 2. Mär 2014 15:15

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250195)
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:
Delphi-Quellcode:
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.

leodinho 2. Mär 2014 15:32

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

Sir Rufo 2. Mär 2014 15:38

AW: Schiffe versenken programmieren
 
@Popov

Wenn ich mit einer Aussage dich anspreche, dann schreibe ich @Popov oder zitiere etwas von dir und schreibe einen Kommentar dazu. Wenn ich den TE meine, dann schreibe ich einfach los.

Preisfrage, wen habe ich mit dem von dir zitierten Beitrag angesprochen?

Es kommt nicht auf zeitgemäße Regeln oder was auch immer an, sondern nur darauf, was in der Aufgabenstellung, bzw. was im Projektplan festgelegt ist (das gehört da mit rein). Wenn das fehlt, dann ist der Projektplan unvollständig.

Ja, so einfach ist das.

Des Weiteren befinden wir uns in der nächsten Phase der Programmentwicklung (nach dem Projektplan, der relativ grob das Projekt beschreibt) und konkretisieren die Abläufe weiter - aber wir sind noch nicht bei der Implementierung. Die kommt erst im nächsten Schritt.

Mein Beispiel mit dem Schuss war nur ein Wink mit dem Zaunpfahl, dass mit dieser konkrete Beschreibung (viel Text von mir) sehr leicht die Brücke zur Implementierung geschlagen werden kann (substantiell 1 Zeile Code).

Es geht nicht darum, ob du in der Lage bist Schiffe versenken ohne vorherigen Projektplan etc. zu implementieren, sondern dass die Aufgabenstellung lautet ein Projekt mit Projektplan zu implementieren. Und die Abfolge ist damit vorgegeben.

Nach jedem Schritt wird der Projektplan nochmals von allen Beteiligten überprüft und wenn alle nicken, dann erst dann wenn keine Fragen mehr offen sind, dann wird implementiert.

Das ist der Lerneffekt der mit der Aufgabenstellung provoziert werden soll.

leodinho 2. Mär 2014 15:42

AW: Schiffe versenken programmieren
 
Wenn ich ehrlich bin , will ich e jetzt nicht mehr unbedingt lernen.. Ich will dieses projekt dann abgeben und sgen: ,,reicht mit programmieren'' da ich mich eher auf auf andere teilgebiete spezialisiere und das programmieren dann eh überflüssig ist..
Noch einmal die frage, ob ihr euch das programm mal angucken könntet, anstatt nur zu disskutieren? /:

Popov 2. Mär 2014 15:46

AW: Schiffe versenken programmieren
 
@leodinho

Im Grunde hast du noch gar nichts. Es kann aber sein, dass ich schon wieder etwas nicht gelesen habe und du musst keine Schiffe automatisch platzieren. Was du hast ist schon mal das Highscore, aber das interessiert zu dem Zeitpunkt keinen, denn vom Spiel selbst ist noch keine Zeile programmiert. Mein Tipp: erzeuge ein neues Projekt und fange von vorne an.

Wir können dir am Anfang helfen, aber programmieren mußt du schon selber. Auch sollte dir klar sein, dass die Konzepte von mir und Sir Rufo unterschiedlich sind. Keines der Konzepte ist schlechter oder besser, nur unterschiedlich. Du kannst sie nicht in einem Projekt gleichzeitig umsetzten.

Bevor du dich aber für ein Konzept entscheidest, oder gar zwei parallel betreibst, ein kleine Hilfe für den Anfang. Du bist schon bei Highscore, hast aber noch keine Schiffe platziert. Bis die Schiffe platziert sind brauchst du dich nicht entscheiden, soweit kann ich dir helfen.

Hier etwas für den Anfang. Am Ende (es fehlen noch fünf weitere Funktionen) wird der Computer alle Schiffe nach deinen Regeln im Spielfeld platziert haben. Das ist noch nicht das Spiel, aber du hast dann ein mit Schiffen gefülltes Array-Spielfeld. Weitere Tipps gibt es wenn die drei Funktionen/Prozedur gefüllt sind.

Delphi-Quellcode:
implementation

const
  MaxFelder = 11; //12 Felder. Null wird gezählt, also 11.

type
  TSpielfeld = array[0..MaxFelder, 0..MaxFelder] of ShortInt;

var
  Feld: TSpielfeld;


//Löscht das Feld-Array mit Nullen.
procedure FeldLeeren;
begin
  //mit Code füllen
end;

//Prüft ob Zelle gültig ist, also im Feld liegt
function IstZelleGueltig(x, y: Integer): Boolean;
begin
  //mit Code füllen
end;

//Prüft ob Zelle frei ist, sich darin also kein anderes Schiff befindet
function IstZelleFrei(x, y: Integer): Boolean;
begin
  //mit Code füllen
end;

leodinho 2. Mär 2014 15:56

AW: Schiffe versenken programmieren
 
das problem dabei ist schon ,dass ich nichtmal weiß was ich beim ersten als code reinschreibe..

Popov 2. Mär 2014 16:05

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250229)
... sondern nur darauf, was in der Aufgabenstellung, bzw. was im Projektplan festgelegt ist (das gehört da mit rein). Wenn das fehlt, dann ist der Projektplan unvollständig.

Ja, so einfach ist das.

Da gebe ich die voll Recht. Sieh dir mal Beitrag #103 an, da habe ich das Gleiche an den TE geschrieben. Jetzt hat er es so geplant, jetzt muss er es umsetzten.

Zitat:

Des Weiteren befinden wir uns in der nächsten Phase der Programmentwicklung (nach dem Projektplan, der relativ grob das Projekt beschreibt) und konkretisieren die Abläufe weiter - aber wir sind noch nicht bei der Implementierung. Die kommt erst im nächsten Schritt.
Nun machen wir es nicht komplizierter als es sein muss. Selbst wenn du Recht hast, der TE ist kein Student der lernen soll wie es später im Berufsleben richtig geht, er soll nur etwas kleines programmieren.

Zitat:

Mein Beispiel mit dem Schuss war nur ein Wink mit dem Zaunpfahl
Dein Beispiel am Ende ist sogar richtig gut, vor allem die Anwendung der Konstanten, aber noch sind wir nicht so weit.

Ich denke der einzige Punkt in dem wir uns zurzeit wirklich unterscheiden ist, ob alle Schiffe ein Kreuzchen im Feld bekommen oder jedes Schiff eine eigene Nummer.

Popov 2. Mär 2014 16:13

AW: Schiffe versenken programmieren
 
Zitat:

Zitat von leodinho (Beitrag 1250232)
das problem dabei ist schon ,dass ich nichtmal weiß was ich beim ersten als code reinschreibe..

Sorry, aber das sind Grundlagen. Du hast ein globales Array und der ist mit Werten gefüllt, ob mit sinnlosen bei der Erstellung oder weil bereits ein Spiel gespielt wurde. In der Prozedur werden einfach alle Felder einfach auf Null gesetzt (vorläufig, später kann man das verbessern).

Du hast ein zweidimensionales Feld, somit kannst du das mit zwei Schleifen machen, z. B. X und Y, angefangen bei 0, weil das Array hier beide Male bei Null beginnt, bis zu der Konstante MaxFelder.

Du hast doch schon ein Spielfeld auf deinem Formular. Das muss vorerst mit einem Wert gelöscht werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz