Thema: Delphi Schiffe versenken

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

Re: Schiffe versenken

  Alt 24. Feb 2010, 00:22
Hallo kk

ich hätte da einige Tipps:

1. Randomize

sollte nur einmal pro Application aufgerufen werden.
Entgegen der weit verbreiteten Meinung, dieses gehöre in die Create-Methode der Form,
empfehle ich den Befehl in der dpr-Datei aufzurufen:
Delphi-Quellcode:
program Test1;

uses
  Forms,
  frmMain in 'frmMain.pas{Form1};

{$R *.res}

begin
  Application.Initialize;
  Randomize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm( TForm1, Form1 );
  Application.Run;
end.
2. Die Button_StartClick-Moloch-Procedure

würde ich ein wenig in einzelne Bereiche (Procedures) aufteilen, dann wird die nicht so unübersichtlich.
Beispielhaft habe ich das mal aufgeführt ... ist natürlich nicht vollständig.


Delphi-Quellcode:
type
  TSpielFeld = array[ 0..9, 0..9 ] of boolean;

function IstFreieStelle( SpielFeld : TSpielFeld; PosX, PosY, Hochkant ) : boolean;
begin
  // Prüfen, ob die Position so in Ordnung ist
  Result := ...
end;

procedure ZufallPos( const Laenge : integer; var PosX, PosY : integer; var Hochkant : boolean );
  var
    a, b : integer;
  begin
    a := Random( 10 );
    b := Random( 10 - Laenge );
    Hochkant := ( Random( 2 ) = 0 )

    if Hochkant then
      begin
        PosX := a;
        PosY := b;
      end
    else
      begin
        PosX := b;
        PosY := a;
      end;
  end;

procedure TForm1.button_startClick(Sender: TObject);
  var
    SchiffLaenge : integer;
    SchiffPosX, SchiffPosY : integer;
    SchiffHoch : boolean; // True = Hochkant; False = Waagerecht
  begin

    for SchiffLaenge := 1 to 5 do
      begin

        repeat

          ZufallPos( SchiffLaenge, SchiffPosX, SchiffPosY, SchiffHoch );

        until IstFreieStelle( Schiffe_Cpu, SchiffPosX, SchiffPosY, SchiffHoch );

        PlatziereSchiff( Schiffe_Cpu, SchiffLaenge, SchiffPosX, SchiffPosY, SchiffHoch );

      end;

    ZeichneSpielFeld( Schiffe_Cpu );

  end;
Wie du siehst ist deine Ursprungs-Procedure nicht mehr so überladen und durch geschickt gewählte Namen auch wesentlich "sprechender".

Vor allem sollte auffallen, dass die Function IstFreiStelle auch dafür benutzt werden kann, die Position der Spieler-Schiffe zu überprüfen
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