![]() |
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:
1. Beim ersten Start des Spiels sind generell alle Felder Bomben
...
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. 2. Es sind immer unterschiedlich viele Bomben. Ich find da meinen Fehler nicht :( |
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... ;) |
Re: Einige Probleme mit Random
Ne bringt nix. Das hatte ich schon :>
Mfg Robert |
Re: Einige Probleme mit Random
Das es nichts bringt ist schon Klar, trotzdem sollst Du das machen... ;)
|
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