Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einige Probleme mit Random (https://www.delphipraxis.net/8847-einige-probleme-mit-random.html)

butch 13. Sep 2003 10:00


Einige Probleme mit Random
 
Also ich bin immernoch bei meinem Minesweeper-Klon. Nicht wundern das is bist jetzt noch kein 9 x 9 feld sondern erst eine Reihe von 9 Quadraten und das ich die if abfragen zu case of machen soll haben mir schon genug gemacht das is aber jetzt nich das wichtige :)
Delphi-Quellcode:
...
  public
    procedure DrawCube(Row: Integer);
    function BombCheck(Row: Integer): Integer;
    function GiveRandom : Integer;
  end;

var
  Form1: TForm1;
  Feld: array[0..8] of Byte;


const
  PicWidth = 17;
  PicHeight = 17;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.DrawCube(Row: Integer);     { zeichnet Spielfeld mit Wuerfel}
begin
  with Canvas do
  begin
    Pen.Color := clBtnFace;
    Brush.Color := clBtnFace;
    Brush.Style := bsSolid;
    Rectangle(0, Row * PicHeight, PicWidth, (Row + 1) * PicHeight);
    Draw(0, Row * PicHeight, IWuerfel.Picture.Bitmap);
  end;
end;

procedure TForm1.Beenden1Click(Sender: TObject);   { beendet Spiel }
begin
  Close;
end;

procedure TForm1.FormPaint(Sender: TObject);     { zeichnet bei FormPaint Spielfeld neu }
var
  Row: Integer;
begin
  Row := 0;
  while Row <= 8 do
    begin
      DrawCube( Row);
      Inc(Row);
  end;
end;

procedure TForm1.INeuClick(Sender: TObject);     { startet neues Spiel }
var
  Row: Integer;
  i: Integer;
begin
  Randomize;                 { neue Zufallszahlen }
  Row := 0;
  for i:= 1 to 10 do Feld[i - 1]:= 10;   { alle Felder im Spielfeld auf 10 setzen ( kein Wert)}

  for i:= 1 to 4 do Feld[GiveRandom] := 0; { soll die Felder mit den Bomben bestimmen } { Feld = 0 = Bombe }

  while Row <= 8 do
    begin
      DrawCube(Row);
      Inc(Row);
  end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; { wenn Maus auf Form klickt }
  Shift: TShiftState; X, Y: Integer);
var
  Row: Integer;     { index den angeklickten Wuerfels }
  zahl: Integer;    { anzahl der Bomben um den Wuerfel }
begin
  Row := Y div PicHeight;
  if Row <= 8 then
  begin
    if Feld[Row] = 0 then
      Canvas.Draw(0, Row * PicHeight, IBombe.Picture.Bitmap)
    else
    begin
      zahl := BombCheck(Row);
      if zahl = 0 then Canvas.Draw(0, Row * PicHeight, Ileer.Picture.Bitmap);      { leeres Kaestchen}
      if zahl = 1 then Canvas.Draw(0, Row * PicHeight, Ieins.Picture.Bitmap);      { Zahl 1 }
      if zahl = 2 then Canvas.Draw(0, Row * PicHeight, Izwei.Picture.Bitmap);      { Zahl 2 }
     end;
  end;
end;

function TForm1.BombCheck(Row: Integer): Integer;
var
  bomben: Integer; { anzahl der Bomben um dem Wuerfel }
begin
  bomben := 0;
  if Feld[Row - 1] = 0 then Inc(bomben);     { ob feld zuvor bombe ist}
  if Feld[Row + 1] = 0 then Inc(bomben);     { ob feld danach bombe ist }
  Result := bomben;
end;

function TForm1.GiveRandom: Integer;
var
  Gezogene : TStringList;
  i : Integer;

begin
  Gezogene := TStringList.Create;
  i := Random(8);

  if Gezogene.IndexOf(IntToStr(i)) <> -1 then GiveRandom
  else
  begin
    Gezogene.Add(IntToStr(i));
    result := i;
  end;
end;

end.
1. Beim ersten Start des Spiels sind generell alle Felder Bomben
2. Es sind immer unterschiedlich viele Bomben. Ich find da meinen Fehler nicht :(

Daniel B 13. Sep 2003 10:09

Re: Einige Probleme mit Random
 
Hi,

nimm das Randomize aus dem Button-Click raus und schreib es nur ins OnCreate des Form1 und sonst nirgends mehr! Besser das... ;)

butch 13. Sep 2003 10:24

Re: Einige Probleme mit Random
 
Ne bringt nix. Das hatte ich schon :>

Mfg Robert

Daniel B 13. Sep 2003 10:26

Re: Einige Probleme mit Random
 
Das es nichts bringt ist schon Klar, trotzdem sollst Du das machen... ;)

idefix 13. Sep 2003 15:04

Re: Einige Probleme mit Random
 
Hi Butch,
Deine Fehler dürften relativ leicht zu beheben sein:

1.)
Erzeuge ein OnCreate-Eventhandler für Deine Form
2.)
Schreibe dort eine Schleife, die alle Felder des Arrays "Feld" auf den
Wert "10" setzt. 10=kein Wert
3.)
Verschiebe folgende Zeile aus der Funktion "GiveRandom" ins
Tform1.OnCreate-Event:
"Gezogene := TStringList.Create;"
Bedenke "GiveRandom" ist rekursiv!!
In Deinem Fall erzeugt Du 1 Instanz von "Gezogene", die dann
im RAM hängen bleibt. Außerdem wird nur der Else-Teil der If-Bedingung
ausgeführt.
4.)
Nach dem Aufruf von GiveRandom schreibe noch folgendes:
"Gezogene.Clear".
5.)
Verschiebe die Deklaration der Variable "Gezogene" in die private
Section der Klassendeklaration von form1
6.)
Erzeuge ein OnDestroy-Eventhandler für Deine Form.
7.)
Und füge dort folgende Zeile ein:
"Gezogene.Free"

Mfg, Idefix


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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