AGB  ·  Datenschutz  ·  Impressum  







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

Einige Probleme mit Random

Ein Thema von butch · begonnen am 13. Sep 2003 · letzter Beitrag vom 13. Sep 2003
Antwort Antwort
butch

Registriert seit: 22. Aug 2003
Ort: Herzberg/E.
15 Beiträge
 
#1

Einige Probleme mit Random

  Alt 13. Sep 2003, 10:00
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
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#2

Re: Einige Probleme mit Random

  Alt 13. Sep 2003, 10:09
Hi,

nimm das Randomize aus dem Button-Click raus und schreib es nur ins OnCreate des Form1 und sonst nirgends mehr! Besser das...
  Mit Zitat antworten Zitat
butch

Registriert seit: 22. Aug 2003
Ort: Herzberg/E.
15 Beiträge
 
#3

Re: Einige Probleme mit Random

  Alt 13. Sep 2003, 10:24
Ne bringt nix. Das hatte ich schon :>

Mfg Robert
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#4

Re: Einige Probleme mit Random

  Alt 13. Sep 2003, 10:26
Das es nichts bringt ist schon Klar, trotzdem sollst Du das machen...
  Mit Zitat antworten Zitat
idefix

Registriert seit: 13. Sep 2003
Ort: Stolberg
2 Beiträge
 
#5

Re: Einige Probleme mit Random

  Alt 13. Sep 2003, 15:04
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
Es klapperte die Klapperschlang bis die Klapper schlapper klang.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:20 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