Einzelnen Beitrag anzeigen

Benutzerbild von TOC
TOC

Registriert seit: 5. Jan 2005
Ort: Trier
248 Beiträge
 
Delphi 7 Personal
 
#11

Re: Zufallszahlen, wer kann helfen?

  Alt 17. Nov 2009, 08:01
Hi!

Zitat von TOC:
"Möchtest Du einen einzigen Button auf den du klickst, und er berechnet dann in der Reihenfolge zuerst die 1 von Cell[0,0], beim zweiten klick die 2 von Cell[1, 0] usw bis 16 und beide StringGrids sind dann nach 16 Clicks voll?"
Zitat von kunta:
Genau. Diesen Fall möchte ich erreichen.
Also gut, dann müssen wir das Programm halt nochmal etwas anpassen.
Die Funktion "GetRandomNumber" hasst Du ja weiter oben in diesem Thread, die wieder hole ich hier nicht noch mal.

Also, erstmal brauchen wir eine Variable, diese müssen wir zuerst mal auf eins setzen und dann mit jedem Klick hoch zählen.
Nur, wohin mit der Variable? Ich würde folgendes vorschlagen:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    procedure StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
      var CanSelect: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    // Diese Zähler-Variable ist wichtig!
    Count: Integer;
  public
  end;
So in etwa könnte das Formular in Deinem Programm aussehen, und unter "Private" habe ich die Zählvariable hinein geschrieben.
Es gibt auch andere Möglichkeiten, zum Beispiel hätte man auch eine globale Variable nehmen können, aber ich persönlich finde es so besser.

Dann ist folgendes noch wichtig: Am Programmstart müssen wir erstmal mit Randomize den Zufallszahlengenerator initialisieren und die Zählvariable auf 1 setzen. Dazu würde ich folgenden Vorschlag machen:

Delphi-Quellcode:
// Diese Methode wird immer aufgerufen wenn das Formular erzeugt wird, also beim Programmstart
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Zufallszahlgenerator initialisieren
  Randomize;
  // Zählvariable auf 1 setzen
  Count:=1;
end;
Ok. Und nun, der Würfel-Knopf:

Delphi-Quellcode:
// Würfel-Knopf
// Diese Prozedur erzeugt die Zufallszahlen von 1 bis 16 in aufsteigender Reihenfolge
// und schreibt die Anzahl der Würfelversuche in Stringgrid2
procedure TForm1.Button1Click(Sender: TObject);
Var
  Col, Row: Integer;
begin
  // Aus Zählvariable die Spalte berechnen
  Col:=(Count-1) mod 4;
  // Aus Zählvariable die Zeile berechnen
  Row:=(Count-1) div 4;
  // Schreibe die Zählvariable in StringGrid1
  StringGrid1.Cells[Col, Row]:=IntToStr(Count);
  // Zähle die Versuche bis die Zahl gewürfelt wurde und schreib die Anzahl in StringGrid2
  StringGrid2.Cells[Col, Row]:=IntToStr(GetRandomNumber(Count, 1, 16));
  // Erhöhe die Zählvariable
  Inc(Count);

  // Falls Zählvariable>16 ist...
  If Count>16 then Begin
    // Meldung an Benutzer ausgeben
    ShowMessage('Stringrid ist voll!');
    // Würfelknopf sperren
    Button1.Enabled:=false;
  End;
end;
Ok. Also, jedesmal, wenn Du auf den Würfel-Knop klickst zählt er um eins weiter, und wenn die Stringgrids voll sind gibt es eine Meldung und der Würfel-Knopf wird gesperrt.

Man könnte auch noch einen zweiten-Knopf machen, nämlich um die StringGrids wieder zu lehren, den Zäher wieder auf 1 zu setzen und den Würfel-Knopf zu entsperren. Dazu noch ein letzter Vorschlag:

Delphi-Quellcode:
// Lösch-Knopf
// Diese Prozedur setzt die Zählvariable zurück und löscht die StringGrids
procedure TForm1.Button2Click(Sender: TObject);
Var
  Col, Row: Integer;
begin
  // Zählvariable wieder auf 1 setzen
  Count:=1;
  // Zähle für die Zeilen von 0 bis 3...
  For Row:=0 to 3 do Begin
    // Zähle für die Spalten von 0 bis 3...
    For Col:=0 to 3 do Begin
      // Lösche die Zelle in StringGrid1 und 2 mit Leerstring
      StringGrid1.Cells[Col, Row]:='';
      StringGrid2.Cells[Col, Row]:='';
    End;
  End;
  // Entsperre wieder den Würfel-Knopf
  Button1.Enabled:=true;
end;

Grüße von TOC!
Lars Uwe Hohmann
"Wäre die Erde eine Bank, ihr hättet sie längst gerettet!"
(Zitat GreenPeace)
  Mit Zitat antworten Zitat