Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Schleife wohin und wie? (https://www.delphipraxis.net/130237-schleife-wohin-und-wie.html)

Jean-Luc_Picard 5. Mär 2009 10:54


Schleife wohin und wie?
 
Hallo zusammen,

ich habe mir hier ein Proggi geschrieben was folgendes tut.
Einlesen 2 Spielernamen, Würfelbereich (später zufallszahl) und Anzahl der Runden.

Wenn das Proggi dann startet und man die Felder füllt und auf start klickt erscheint eine 2. Form wo Spieler 1 und Spieler 2 eine Zahl eingeben dürfen.
Jetzt ermittelt das Programm wer näher dran ist und zeigt den Sieger an.

Jetzt kommt mein Problem:
Ich wollte eine Schleife bauen die so lange durch läuft wie man am Anfang die Anzahl der Runden eingibt.
Wenn ich im 2. Fenster auf den Button Würfeln klicke läuft die erste Runde, dann soll man wieder 2 Zahlen eingeben dürfen und
die nächste runde wenn wieder auf Würfeln geklickt wird.
Habe mir n Tutos durchgelesen wie Schleifen geschrieben werden.

Muss ich ich die Schleife über dem: procedure Tspiel.Button1Click(Sender: TObject); einstellen?
also so:
Zitat:

FOR...
procedure Tspiel.Button1Click(Sender: TObject);
...
FOR ENDE
Weil ich will ja immer das man in jeder Runde der Spieler1 und Spieler2 eine andere Zahl eingeben können und dann wieder auf den Button Würfeln klicken sollen.

Bis hier hin läuft das Proggi übrigens super.
Könnt ihr mir weiterhelfen bzw. eventuell zeigen wie ich das am besten Lösen kann?

Ich nutze auch Variablen die von einer Form in die andere übergeben werden für die Übernahme der Namen und runden und bereich.
Stehen unter PUBLIC. Hatte ich so nachgelesen und funktioniert super.

Das ist der erste Teil meines Programmes, für die Aufnahme der Spieloptionen:
Delphi-Quellcode:
unit start_programm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tstart = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    spieler1: TEdit;
    Label2: TLabel;
    spieler2: TEdit;
    ueberschrift: TLabel;
    GroupBox2: TGroupBox;
    Label3: TLabel;
    bereich: TEdit;
    Label4: TLabel;
    runden: TEdit;
    start: TButton;
    beenden: TButton;
    procedure beendenClick(Sender: TObject);
    procedure startClick(Sender: TObject);
  private
    { Private declarations }
  public
  player1, player2: String;
  range, round : integer;
    { Public declarations }
  end;

var
  start: Tstart;

implementation

uses das_spiel;

{$R *.dfm}

procedure Tstart.beendenClick(Sender: TObject);
begin
close;
end;

procedure Tstart.startClick(Sender: TObject);
begin
player1 := spieler1.Text;
player2 := spieler2.Text;

range := StrToInt(bereich.Text);
round := StrToInt(runden.Text);

spiel.showModal;
end;

end.

Hier ist der 2. Teil das Spiel selbst:
Delphi-Quellcode:
unit das_spiel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls;

type
  Tspiel = class(TForm)
    ueberschrift: TLabel;
    p1: TGroupBox;
    Label1: TLabel;
    zahl_p1: TEdit;
    p2: TGroupBox;
    Label2: TLabel;
    zahl_p2: TEdit;
    Image1: TImage;
    Button1: TButton;
    Label3: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  spiel: Tspiel;

implementation

uses start_programm;

{$R *.dfm}

procedure Tspiel.FormActivate(Sender: TObject);
begin
p1.Caption := start.player1;
p2.Caption := start.player2;
end;

procedure Tspiel.Button1Click(Sender: TObject);
var zahl_sp1, zahl_sp2, Erg1, Erg2, zufallszahl : integer;
begin
zahl_sp1 := StrToInt(zahl_p1.Text);
zahl_sp2 := StrToInt(zahl_p2.Text);

zufallszahl := 1 + Random(start.range);

Label3.Caption := IntToStr(zufallszahl);

Erg1 := Abs(zahl_sp1 - Zufallszahl);
Erg2 := Abs(zahl_sp2 - Zufallszahl);

if Erg1 = Erg2 then
begin
  ShowMessage('Beide Gleich');
end
else
if Erg1 > Erg2 then
begin
  ShowMessage('Spieler 2 hat gewonnen');
end
else
  ShowMessage(start.player1+' hat gewonnen');
end;

end.
Ich hoffe es ist nicht zu viel. Aber dachte mir ich Poste alles damit ihr besser klar kommt.
Ich bin neu in Delphi, habe vorher nur PHP,SQL, JavaScript und Makro und so programmiert und Versuche mich jetzt in Delphi :-)

Vielen Dank schonmal!!!

Gruß, Picard

hoika 5. Mär 2009 11:15

Re: Schleife wohin und wie?
 
Hallo,

ich verstehe ein Problem nicht ...
Aber auch PHP kennt Funktionen.
Delphi-Quellcode:
type
  TForm
      procedure OnButton1Click;
      procedure DoPlay;
  end;


procedure TForm.OnButton1Click;
var
   xxx
  iGame    : Integer;
  iMaxGames : Integer;
begin
 // Variablen auslesen

  for iGasme:= 1 to iMaxGames do
  begin
    DoPlay;
  end;
end;

procedure TForm.DoPlay;
begin
 // das eigentliche Spielen
end;
Die anderen Variablen würde ich in einee 3. Unit auslagern (interface-Teil)
und diese 3. Unit per Uses an die beiden anderen "ankoppeln".


Heiko

Jean-Luc_Picard 5. Mär 2009 11:19

Re: Schleife wohin und wie?
 
Hallo,

ja ich weiß das. Meine unklarheit war ja diese ob die FOR Schleife in die Prozedur soll.
Weil ich möchte, z.B. Runden 3, das ich 3 mal auf den Button klicken muss und jedes mal die Werte neu eingeben.

Ich hoffe ich kann es gut erklären.
Wenn dem so ist das die FOR in der Prozedur steht dann ist ja gut.
Weil die Prozedur wird ja nur aktiv wenn ich den Button klicke und dann rennt ja die FOR 3 mal durch zum Beispiel.

Deswegen hatte ich gedacht das sie for der Prozedur muss, wisste wie? ;)

Danke trotzdem!


Gruß, Picard

hoika 5. Mär 2009 11:31

Re: Schleife wohin und wie?
 
Hallo,

zum Verständnis.
die OnClick ist keine normale Prozedur, sondern die Reaktion auf das Klicken des Buttons.
Wenn nach dem Klicken etwas 3mal gemacht werden soll,
schreibe ich ein eigene Methode und rufe Sie dreimal (for) in der OnClick-Methode auf.

Ich gehe sogar soweit, dass ich im OnClick nur den Aurfuf einer eigenen Methode
(DoStartGame als Bsp.) stehen habe.

Dann kann ich das OnClick auch intern "simulieren".


Heiko

sirius 5. Mär 2009 12:08

Re: Schleife wohin und wie?
 
Hier ist keine Schleife angebracht, sondern einfach ein Zähler, der anfangs auf die Rundenzahl gesetzt wird un beim erreichen von 0 bspw die Form2 schließt.

Jean-Luc_Picard 5. Mär 2009 12:54

Re: Schleife wohin und wie?
 
Hallo Sirius, hallo Hoika,

vielen Dank für die Ideen.
Das mit dem Zähler bis der Wert vom aufhören kommt ist ne feine idee.
Manchmal denke ich einfach zu kompliziert.
Danke @irius!

@Hoika: Kannst du mir ein Beispiel zeigen? Einfach zum verständnis damit ich lernen kann. Danke!
Eventuell kannst du auch meinen Code benutzen.

Vielen Dank,

Wenn ich Probleme habe Poste ich :-)

DANKE!

DeddyH 5. Mär 2009 13:31

Re: Schleife wohin und wie?
 
Delphi-Quellcode:
procedure SayHello(i: integer);
begin
  ShowMessage(Format('Hello World No. %d',[i]));
end;

procedure TFormBla.ButtonWuppdiClick(Sender: TObject);
var i: integer;
begin
  for i := 1 to 3 do
    SayHello(i);
end;
So in der Art hat hoika das wahrscheinlich gemeint.

Jean-Luc_Picard 5. Mär 2009 14:38

Re: Schleife wohin und wie?
 
Vielen Dank, ich werde beide Versionen mal testen.

Danke, Super Forum!

guidok 5. Mär 2009 14:51

Re: Schleife wohin und wie?
 
Delphi-Quellcode:
type
  TForm1 = class
     
  private
    Rundenzahl: Integer;
  end;


procedure ButtonWürfelnClick(Sender: TObject);
begin
  if Rundenzahl > 0 then begin
    Rundenzahl := Rundenzahl - 1;
    DoSpielen;
  end;
end;
Ich schätze mal eher, dass Hoika es so gemeint hat. Irgendwann vor dem Ersten Klicken auf "Würfeln" musst du eine Rundenzahl größer als Null eingeben, dann wird mit jedem Klick auf "Würfeln" einmal gespielt, solange bis der Rundenzähler auf Null steht.

Was ist der Unterschied zwischen der Zähler- und der Schleifenvariante?

Bei der Schleifenvariante muss man den Button "Würfeln" einmal Klicken, dann wird sooft gespielt, wie in Rundenzahl festgelegt. Bei der Zählervariante muss man jedes Spiel mit dem Button "Würfeln" beginnen.


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