AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schiffe versenken programmieren

Ein Thema von leodinho · begonnen am 11. Jan 2014 · letzter Beitrag vom 4. Mär 2014
Antwort Antwort
Seite 14 von 19   « Erste     4121314 1516     Letzte »    
leodinho

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

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 13:15
@Sir Rufo

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

Geändert von leodinho (28. Feb 2014 um 13:32 Uhr)
  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
 
#132

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 13:40
@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
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
leodinho

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

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 13:46
@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?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#134

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 15:43
@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.

Geändert von Popov (28. Feb 2014 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#135

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 16:21
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#136

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 16:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#137

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 16:51
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#138

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 17:00
Das ist keine Oberfläche, das ist nur zum Testen des Inhalts von dem Array.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#139

AW: Schiffe versenken programmieren

  Alt 28. Feb 2014, 18:05
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.
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
leodinho

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

AW: Schiffe versenken programmieren

  Alt 2. Mär 2014, 10:47
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
Wie wäre es sinnvoll dabei vorzugehen? (:

Geändert von leodinho ( 2. Mär 2014 um 11:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 14 von 19   « Erste     4121314 1516     Letzte »    

 

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 11:15 Uhr.
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