![]() |
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. |
AW: Roulette-Strategie-Simulator
Was verstehst Du unter 'läuft einfach nicht weiter'?
|
AW: Roulette-Strategie-Simulator
Delphi-Quellcode:
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.
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; |
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? |
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. |
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 :? |
AW: Roulette-Strategie-Simulator
Zitat:
Solltest also die Werte im Auge behalten... Edit: Wenn das:
Delphi-Quellcode:
nicht erfüllt wird, hängt er hier in einer Endlosschleife.
while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
|
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. |
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.
|
AW: Roulette-Strategie-Simulator
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 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