Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Roulette-Strategie-Simulator (https://www.delphipraxis.net/175561-roulette-strategie-simulator.html)

Der Siedler 1. Jul 2013 00:39

Roulette-Strategie-Simulator
 
Hallo zusammen,

ich bin ganz neu hier und deshalb bitte ich darüber hinwegzusehen, wenn ich hier im falschen Teil des Forums gepostet habe. Ich habe heute Abend ein paar Zeilen geschrieben, die die sog. "Masse egale"-Strategie beim Roulette auf Herz und Nieren überprüfen soll.

Im Grunde ist das Programm aber auch unabhängig vom Roulette betrachtbar. Vereinfacht könnte man sagen, ich zähle Münzwürfe, bis ein bestimmtes Verhältnis von Kopf zu Zahl gefallen ist. Das kann natürlich lange dauern, wie man sich vorstellen kann. Jedenfalls läuft das Programm irgendwann ohne Fehlermeldung einfach nicht mehr weiter. Ich würde mich sehr freuen, wenn mir jemand einen Tipp geben kann.

Anbei der Code. Auch hier weiß ich nicht, inwiefern es üblich ist, hier den Code einfach als bedrohliche Wall of Text zu posten, aber ich wusste mir nicht anders zu helfen.

Gute Nacht,

Der Siedler

Code:
unit MasseEgale;

interface

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

type
  TfMasseEgale = class(TForm)
    btStart: TButton;
    edAnzahl: TEdit;
    lbGewinn: TLabel;
    procedure btStartClick(Sender: TObject);
  private
    i,a : integer;
    aManque,aPasse,aZero,aGewinn,aMinus : real;
    procedure Wurf (pWette : string);
    procedure StueckGewinn;
    procedure Manquespiel;
    procedure Passespiel;
  public
    { Public declarations }
  end;

var
  fMasseEgale: TfMasseEgale;

implementation

{$R *.dfm}

procedure TfMasseEgale.btStartClick(Sender: TObject);
begin
  i := 0;
  aManque := 0;
  aPasse := 0;
  aZero := 0;
  aGewinn := 0;
  aMinus := 0;
  Randomize;
  Stueckgewinn;
end;

procedure TfMasseEgale.Stueckgewinn;
begin
  if i < strtoint(edAnzahl.Text)
    then
    begin
      while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
      begin
        Wurf('Keine Wette');
      end;
      if aManque - aPasse = 5
        then Passespiel
        else Manquespiel;
      Stueckgewinn;
    end;
  lbGewinn.Caption := floattostr(aGewinn) + ' Gewinn, Rückhalt: ' + floattostr(-aMinus);
  edAnzahl.Text := inttostr(i);
end;

procedure TfMasseEgale.Manquespiel;
var aGewinnziel : real;
begin
  aGewinnziel := aGewinn + 1;
  while aGewinn < aGewinnziel do
  begin
    Wurf('Manque');
  end;
end;

procedure TfMasseEgale.Passespiel;
var aGewinnziel : real;
begin
  aGewinnziel := aGewinn + 1;
  while aGewinn < aGewinnziel do
  begin
    Wurf('Passe');
  end;
end;

procedure TfMasseEgale.Wurf (pWette : string);
begin
  a := Random(37);
  case a of
    0      : begin
               aZero := aZero + 1;
               if pWette <> 'Keine Wette'
                 then aGewinn := aGewinn - 0.5;
             end;
    1..18  : begin
               aManque := aManque + 1;
               if pWette <> 'Keine Wette'
                 then aGewinn := aGewinn -1;
               if pWette = 'Manque'
                 then aGewinn := aGewinn + 2;
             end;
    19..36 : begin
               aPasse := aPasse + 1;
               if pWette <> 'Keine Wette'
                 then aGewinn := aGewinn -1;
               if pWette = 'Passe'
                 then aGewinn := aGewinn + 2;
             end;
  end;
  i := i + 1;
  if aGewinn < aMinus
    then aMinus := aGewinn;
end;

end.

Furtbichler 1. Jul 2013 07:43

AW: Roulette-Strategie-Simulator
 
Was verstehst Du unter 'läuft einfach nicht weiter'?

baumina 1. Jul 2013 08:05

AW: Roulette-Strategie-Simulator
 
Delphi-Quellcode:
procedure TfMasseEgale.Stueckgewinn;
begin
  if i < strtoint(edAnzahl.Text) then
  begin
    while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
    begin
      Wurf('Keine Wette');
    end;
    if aManque - aPasse = 5
      then Passespiel
      else Manquespiel;
    Stueckgewinn;
  end;
  lbGewinn.Caption := floattostr(aGewinn) + ' Gewinn, Rückhalt: ' + floattostr(-aMinus);
  edAnzahl.Text := inttostr(i);
end;
i wird immer wieder um 1 erhöht und wird irgendwann wohl die Zahl, die im Editfeld eingegeben wurde, erreichen, danach passiert nichts mehr, denn "if i < strtoint(edAnzahl.Text)" wird nicht mehr erfüllt und somit kommt er nicht mehr in die while-Schleife.

Der Siedler 1. Jul 2013 09:16

AW: Roulette-Strategie-Simulator
 
Erstmal Danke für die Rückmeldung :)

Unter "läuft einfach nicht weiter" verstehe ich, dass das Programm sich "aufhängt". Es ist nicht mehr bedienbar und liefert auch bei sehr langem Warten kein Ergebnis. Nach einiger Zeit wird das Fenster dann komplett weiß.

Der Zähler i ist ja gerade dafür gedacht, dass das Programm nicht unendlich weiterläuft. Das ist quasi die Mindestanzahl von Würfen. Das funktioniert auch so weit alles wie gedacht, nur habe ich das Gefühl, dass Delphi das alles nicht unendlich oft durchführt, sondern bei der x-ten Wiederholung ins Stocken gerät. Könnte das sein?

baumina 1. Jul 2013 09:28

AW: Roulette-Strategie-Simulator
 
Also ich habs bei mir mal laufen lassen. Ja, manchmal kommt er nie wieder aus der while-Schleife raus, weil aManque immer gleich aPasse ist.

Bei einem anderen Test kam er aus der anderen while-Schleife bei PasseSpiel nimmer raus, weil aGewinn -1193345 fallend war.

EDIT: Durch Setzen eines Haltepunkts innerhalb der while-Schleifen kannst du ganz leicht sehen, dass er sich nicht aufhängt, sondern brav in der Endlos-Schleife hängt.

Der Siedler 1. Jul 2013 09:34

AW: Roulette-Strategie-Simulator
 
Wie hast du denn die beiden Werte im Auge? Oder ist das eine Vermutung?

Ich stimme dir zwar zu, dass es Fälle geben mag, wo der Fall von (aManque - aPasse) < 5 bzw. umgekehrt sehr lange nicht auftritt, aber irgendwann muss es doch so weit sein. Heißt das, hier sind einfach die Grenzen von Delphi erreicht :?

lbccaleb 1. Jul 2013 09:38

AW: Roulette-Strategie-Simulator
 
Zitat:

Zitat von Der Siedler (Beitrag 1220196)
Delphi-Quellcode:
procedure TfMasseEgale.Stueckgewinn;
begin
  if i < strtoint(edAnzahl.Text)
    then
    begin
      while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
      begin
        Wurf('Keine Wette');
      end;
      if aManque - aPasse = 5
        then Passespiel
        else Manquespiel;
      Stueckgewinn;
    end;
  lbGewinn.Caption := floattostr(aGewinn) + ' Gewinn, Rückhalt: ' + floattostr(-aMinus);
  edAnzahl.Text := inttostr(i);
end;

Ruft sich selber auf, dadurch kommt das Programm in eine Endlosschleife.
Solltest also die Werte im Auge behalten...

Edit:
Wenn das:

Delphi-Quellcode:
      while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
nicht erfüllt wird, hängt er hier in einer Endlosschleife.

baumina 1. Jul 2013 09:39

AW: Roulette-Strategie-Simulator
 
Setz dir einen Haltepunkt in allen while-Schleifen und schau dir in den überwachten Ausdrücken die einzelnen Variablen an.

EDIT: Du kannst es auch erst eine Weile laufen lassen und wenn du meinst es hängt, dann erst die Haltepunkte setzen, bis er anhält.

Der Siedler 1. Jul 2013 09:42

AW: Roulette-Strategie-Simulator
 
@lbccaleb: Auch das ist gewollt. Da dieser Selbstaufruf aber nur stattfindet, wenn i die Grenze noch nicht überschreitet, kann das nicht die Ursache des Fehlers sein. Der tritt schließlich auch dann auf, wenn als Grenze 1 eingegeben wird.

DeddyH 1. Jul 2013 09:45

AW: Roulette-Strategie-Simulator
 
Zitat:

Zitat von Der Siedler (Beitrag 1220216)
Wie hast du denn die beiden Werte im Auge?

http://www.delphipraxis.net/41047-tu...ortgeschr.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Seite 1 von 3  1 23      

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