AGB  ·  Datenschutz  ·  Impressum  







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

Magische 21

Ein Thema von Jansteger · begonnen am 23. Jun 2013 · letzter Beitrag vom 23. Jun 2013
Antwort Antwort
Seite 1 von 2  1 2      
Jansteger

Registriert seit: 18. Mär 2013
32 Beiträge
 
Delphi 7 Personal
 
#1

Magische 21

  Alt 23. Jun 2013, 07:46
Hallo,
Ich habe versucht das Spiel "Die Magische 21 zu programmieren" Nur irgendwie funktioniert das nicht richtig.
Hier der Quellcodeausschnitt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var wAugenzahl,
    wSumme,
    wVorher : real;
begin
wAugenzahl:=random(6)+1;
wVorher:=StrToFloat(Edit1.Text);
wSumme:=wVorher + wAugenzahl;
ESumme.Text:=FloatToStr(wSumme);
Edit1.Text:=FloatToStr(wAugenzahl);
end
Ich hoffe, dass mir jemand weiterhelfen kann!
MfG
Jan

Geändert von Jansteger (23. Jun 2013 um 07:47 Uhr) Grund: Tippfehler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Magische 21

  Alt 23. Jun 2013, 07:56
Wie sollen wir dir weiterhelfen, wenn wir nicht wissen was irgendwie nicht funktioniert?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jansteger

Registriert seit: 18. Mär 2013
32 Beiträge
 
Delphi 7 Personal
 
#3

AW: Magische 21

  Alt 23. Jun 2013, 08:00
War mein Fehler!
Das Programm würfelt beim ersten Klick eine Zahl zwischen 1 und 6 und gibt diese in zwei Fenstern aus. Beim nächsten Klick Würfelt er wieder eine Zahl gibt diese in einem Fenster aus und addiert sie mit der ersten und gibt das Ergebnis in einem Weiteren Fenster aus. Das funktioniert nur beim 1. und 2. Mal. danach nicht mehr.
Das ist das Problem
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Kalakmul
Kalakmul

Registriert seit: 11. Apr 2008
27 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Magische 21

  Alt 23. Jun 2013, 08:12
Hallo Jan,

beim ersten Drüberschauen ist mir folgendes aufgefallen:

1. Da Augenzahlen beim Würfeln immer Ganzzahlen sind, solltest Du statt Real eher Integer als Datentyp nehmen. Entsprechend dann Befehle wie StrToInt verwenden! Falls es beim Randombefehl deshalb Probleme mit dem Datentyp gibt, einfach einen Trunc-Befehl um die rechte Seite legen (schneidet eine Kommazahl hinter dem Komma ab und macht sie zum Integer).

2. Die in der Prozedur verwendeten Variablen sind lokal definiert, d. h. wenn Du sie nicht explizit belegst, können darin Zufallswerte stehen. Du solltest die Variablen wSumme und wVorher global (im Variablendeklarationteil des Programms) definieren, da sie über die "Lebensdauer" eines Clickereignisses hinaus präsent sein sollen. wAugenzahl kann dagegen lokal definiert bleiben, da es eh bei jedem Click neu belegt wird.

3. Muss es nicht: wSumme := wSumme + wAugenzahl heißen?

Hoffe das hilft Dir!
Wer fragt, ist ein Narr für 5 Minuten, wer nicht fragt, ist ein Narr ein Leben lang.

Geändert von Kalakmul (23. Jun 2013 um 08:27 Uhr)
  Mit Zitat antworten Zitat
Jansteger

Registriert seit: 18. Mär 2013
32 Beiträge
 
Delphi 7 Personal
 
#5

AW: Magische 21

  Alt 23. Jun 2013, 08:15
Du solltest die Variablen wSumme und wVorher global (im Variablendeklarationteil des Programms) definieren
Und wie mache ich das?
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Magische 21

  Alt 23. Jun 2013, 08:20
Nein, bitte nicht global ... vor allem dann, wenn es nicht notwendig ist.

Für das Spiel benötigt man einen Würfel (TDice) und einen Spieler (TPlayer) die man wie folgt definieren kann
Delphi-Quellcode:
unit Game;

interface

type
  TDice = class
  private
    FEyes : Integer;
  protected
    procedure SetEyes( const Value : Integer );
  public
    constructor Create;
    procedure Roll; virtual;
    property Eyes : Integer read FEyes;
  end;

  TPlayer = class
  private
    FSum : Integer;
  public
    procedure RollDice( ADice : TDice ); virtual;
    property Sum : Integer read FSum;
  end;

  TStandardDice = class( TDice )
  public
    procedure Roll; override;
  end;

implementation

{ TDice }

constructor TDice.Create;
begin
  inherited;
  Roll;
end;

procedure TDice.Roll;
begin
end;

procedure TDice.SetEyes( const Value : Integer );
begin
  FEyes := Value;
end;

{ TPlayer }

procedure TPlayer.RollDice( ADice : TDice );
begin
  ADice.Roll;
  FSum := FSum + ADice.Eyes;
end;

{ TStandardDice }

procedure TStandardDice.Roll;
begin
  inherited;
  SetEyes( Random( 6 ) + 1 );
end;

end.
und für das Spiel dann so benutzt
Delphi-Quellcode:
unit Main_ViewU;

interface

uses
  Game,

  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMain_View = class( TForm )
    DiceEyes_Label : TLabel;
    PlayerSum_Label : TLabel;
    RollDice_Button : TButton;
    procedure RollDice_ButtonClick( Sender : TObject );
    procedure FormCreate( Sender : TObject );
    procedure FormDestroy( Sender : TObject );
    procedure FormShow( Sender : TObject );
  private
    FDice : TDice;
    FPlayer : TPlayer;
    procedure ShowPlayer( APlayer : TPlayer );
    procedure ShowDice( ADice : TDice );
  public

  end;

var
  Main_View : TMain_View;

implementation

{$R *.dfm}
{ TForm1 }

procedure TMain_View.FormCreate( Sender : TObject );
begin
  FDice := TStandardDice.Create;
  FPlayer := TPlayer.Create;
end;

procedure TMain_View.FormDestroy( Sender : TObject );
begin
  FPlayer.Free;
  FDice.Free;
end;

procedure TMain_View.FormShow( Sender : TObject );
begin
  ShowPlayer( FPlayer );
  ShowDice( FDice );
end;

procedure TMain_View.RollDice_ButtonClick( Sender : TObject );
begin
  FPlayer.RollDice( FDice );
  ShowDice( FDice );
  ShowPlayer( FPlayer );
end;

procedure TMain_View.ShowDice( ADice : TDice );
begin
  DiceEyes_Label.Caption := IntToStr( ADice.Eyes );
end;

procedure TMain_View.ShowPlayer( APlayer : TPlayer );
begin
  PlayerSum_Label.Caption := IntToStr( APlayer.Sum );
end;

end.
und schon programmiert man so, wie das Spiel im wahren Leben auch funktioniert.
Der Spieler nimmt einen Würfel und würfelt FPlayer.RollDice( FDice );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (23. Jun 2013 um 08:23 Uhr)
  Mit Zitat antworten Zitat
Jansteger

Registriert seit: 18. Mär 2013
32 Beiträge
 
Delphi 7 Personal
 
#7

AW: Magische 21

  Alt 23. Jun 2013, 08:25
Geht das nicht auch ein bisschen einfacher?
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Magische 21

  Alt 23. Jun 2013, 08:27
Geht das nicht auch ein bisschen einfacher?
Noch einfacher als eine Zeile Code zum Würfeln?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jansteger

Registriert seit: 18. Mär 2013
32 Beiträge
 
Delphi 7 Personal
 
#9

AW: Magische 21

  Alt 23. Jun 2013, 08:34
Welche Komponenten brauche ich denn für das Programm? (Label, edititierfenster...)
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Magische 21

  Alt 23. Jun 2013, 08:36
Welche Komponenten brauche ich denn für das Programm? (Label, edititierfenster...)
Delphi-Quellcode:
  TMain_View = class( TForm )
    DiceEyes_Label : TLabel;
    PlayerSum_Label : TLabel;
    RollDice_Button : TButton;
2 Label und 1 Button (ordentlich benannt)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:43 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