![]() |
Roulette
Servus Leute,
ich programmiere derzeit das Roulette und möchte nun eine zufällige Zahl würfeln lassen. Der Zahlenbereich ist z.B 1,3,9,12,17 Wie kann ich eine Zahl dieses Bereiches erzeugen ? |
AW: Roulette
Was meinst Du mit Bereich, nur die Zahlen (1,3,9,12,17) sind ein gültiges Ergebnis?
|
AW: Roulette
Ich möchte eine generierte Zahl zwischen den Zahlen 1,3,9,12,17 haben. Also nur eine dieser 5 Zahlen.
|
AW: Roulette
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
const C_NUM: Array[0..4] of integer =(1,3,9,12,17); begin Caption := IntToStr(C_NUM[Random(5)]); end; procedure TForm2.FormCreate(Sender: TObject); begin Randomize; end; |
AW: Roulette
Vielen Dank, hilft mir wirklich sehr!:-D
|
AW: Roulette
Ich hätte noch eine Frage; wenn ich z.B auf Rot setze und die zufällige Zahl liegt auf Rot, dann gewinne ich ja. Diesen Gewinn gebe ich in einem Editfenster aus. Wenn ich nun nochmal würfle mit einem anderen Einsatz und nochmal gewinne, bleibt das Editfenster so wie es ist. Es ändert sich praktisch nichts am Gewinn obwohl ich ja gewonnen habe. Wie kann ich nun nach jedem Würfeln alles "resetten" um mit einem neuen Einsatz zu spielen?
|
AW: Roulette
Indem du überall - vor dem nächsten Ziehen - alles auf die Werte stellst, die du haben möchtest?
|
AW: Roulette
Ich habe sie im Editfenster geändert aber es tut sich nichts.
Vielleicht findet jemand meinen Fehler. Wir programmieren seit 1 Jahr in der Schule, also bitte nicht an der Fachtermini wundern. Edit1 zeigt den Einsatz, Edit2 das aktuelle Konto und Edit3 die zufällige Zahl.
Code:
IF Edit1.text= '' then showmessage ('Einsatz ungültig')else begin
x:= strtoint(Edit1.text); randomize; Edit3.text:=IntToStr(random(37)); If Edit3.text=IntTostr(1 or 3 or 5 or 7 or 9 or 12 or 14 or 16 or 18 or 19 or 21 or 23 or 25 or 27 or 30 or 32 or 34 or 36) then Edit2.Text:=inttostr(x+x)else Edit2.text:=inttostr(0); If Edit3.text=IntTostr(0) then Edit2.Text:=inttostr(x div 2); end; end; |
AW: Roulette
Ich fange an eine Zahl zwischen 0 und 36 zu würfeln. Ist es eine 1,3,5,7 etc., also alle Zahlen die auf Rot liegen, setzt sich das Konto aus dem doppeltem des Einsatzes zusammen. Wenn eine Zahl gewürfelt wird, die nicht auf Rot liegt, so setzt sich das Konto aus der Differenz des aktuellen Kontos und des Einsatzes zusammen. Wird eine 0 gewürfelt dann halbiert sich das Konto. Egal ob ich gewinne oder verliere, es wird immer nur eine 0 beim Konto angezeigt und nach nochmaligem Würfeln passiert nichts.
|
AW: Roulette
Wenn ich richtig aufgedröselt hab?
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var A, B, C: integer; begin if not TryStrToInt(Edit1.Text, A) then ShowMessage('Einsatz ungültig') else begin B := Random(37); Edit3.Text := IntToStr(B); If B in [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] then C := A + A else C := 0; If B = 0 then Edit2.Text := IntToStr(A div 2) else Edit2.Text := IntToStr(C); end; end; procedure TForm2.FormCreate(Sender: TObject); begin Randomize; end; |
AW: Roulette
Hierbei:
Delphi-Quellcode:
arbeitet das "or" nicht wie du aus dem sprachlichen Gebrauch her vermutest. Es wird hier ein
If Edit3.text=IntTostr(1 or 3 or 5 or 7 or 9 or 12 or 14 or 16 or 18 or 19 or 21 or 23 or 25 or 27 or 30 or 32 or 34 or 36) then
![]()
Delphi-Quellcode:
. (63 ist das Ergebnis von 1 or 3 or 5 or...)
If Edit3.text=IntTostr(63) then
Wenn du anders herum umwandelst wird es deutlich einfacher, vorausgesetzt ihr dürft ein sogenanntes "Set" benutzen:
Delphi-Quellcode:
Das wäre die bei weitem einfachste Variante. Der lange und hässliche Weg könnte (angedeutet) so aussehen:
if StrToInt(Edit3.Text) in [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] then
Delphi-Quellcode:
var
geworfen: Integer; begin // würfel code hier, Ergebnis in "geworfen" speichern if (geworfen = 1) or (geworfen = 3) or (geworfen = 5) or (geworfen = 7) or ... ... ... then |
AW: Roulette
Ich habe es mit deiner Variante gemacht und es klappt wunderbar, danke dafür! Wenn ich nun einmal gewinne zeigt er mir den richtigen Kontostand an, aber wenn ich direkt danach nochmal gewinne ändert sich nichts.Der alte Kontostand bleibt erhalten. Warum ?
|
AW: Roulette
Ein ganz heisser Tipp:
beim Roulette gibt es verschiedene Gewinnchancen (Zahl, rot/schwarz, pair/impair, mangue/passe, 1-3 Douzaines, ...) Für jede dieser Gewinnchancen solltest du eine eigene Funktion schreiben:
Delphi-Quellcode:
Mit diesen kleinen netten Funktionen wird die Auswertung viel leichter!
function IstManque(zahl:integer):Boolean;
begin if (zahl >= 1) and (zahl <= 18) then result := True else result := False; // Verdichtet kann man das auch so schreiben Result := ((zahl >= 1) and (zahl <= 18)); end; function IstPasse(zahl:integer):Boolean; begin if (zahl >= 19) and (zahl <= 36) then result := True else result := False; end; function IstRot(zahl:integer):Boolean; begin // selbermachen end; |
AW: Roulette
Irgendjemand der mir weiterhelfen kann? Oder soll ich mein Problem nochmal erklären? Ich habe ja verschiedene Buttons für die unterschiedlichen Spielmöglichkeiten. Ich habe z.B den Button Rouge, ich setze also auf eine rote Zahl. Wenn ich nun auf den Button tippe und eine Zahl generiert die rot ist, gewinne ich ja und mein Konto erhöht sich. Tippe ich danach nochmal auf den Button und gewinne, bleibt das Konto unverändert.
|
AW: Roulette
Wenn der Code noch der ist der er war trägst Du das Ergebnis ein statt es zu addieren.
|
AW: Roulette
Vielleicht wäre es auch sinnvoll das "Konto" als variable zu speichern.
Vor einem Spiel wird der Einsatz davon abgezogen, passiert derzeit nicht, und es könnte auch geprüft werden, ob überhaupt noch genug Geld zum Einsetzen vorhanden ist. Nach dem Spiel wird dann der evtl. Gewinn dem Konto zugerchnet und der aktualisierte Wert der variablen im entsprechenden Edit angezeigt. Ansonsten solltest du vllt. über den Ansatz von sx2008 nachdenken und die Aufgabe in viele kleine Funktionen zerteilen. |
AW: Roulette
Sorry für den Doppelpost, bin zu blöd :-D
|
AW: Roulette
Danke für die Tipps; die einzelnen Funktionen mit den Editfenstern klappen alle, d.h. wenn gewinne ändert sich der wert,gewinne ich nochmal, ändert sich der wert nochmal. Jetzt habe ich versucht die Editfenster durch Labelfenster zu ersetzen; das Edit in dem die zufällige Zahl ausgegeben wird zu einem Label und der aktuelle Kontostand auch. Wenn ich dann mehrmals nacheinander gewinne, verändert sich am Konto nichts.
Mit Edit:
Code:
Mit Label:
x:= strtoint(Edit1.text);
y:= strtoint(Edit2.text); randomize; Edit3.text:=IntToStr(random(37)); If strtoint(Edit3.text)in[0,1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] then Edit2.Text:=inttostr(y+x)else Edit2.text:=inttostr(0); If Edit3.text=IntTostr(0) then Edit2.Text:=inttostr(x div 2);
Code:
Wieso bleibt das Labelfenster unverändert?
x:= strtoint(Edit1.text);
Label41.caption:=inttostr(y); randomize; Label47.caption:=IntToStr(random(37)); If strtoint(Label47.caption)in[1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] then Label41.caption:=inttostr(y+x)else Label41.caption:=inttostr(0); If Label47.caption=IntTostr(0) then Label41.caption:=inttostr(x div 2); |
AW: Roulette
Steigst Du da noch durch? Hast Du auch das richtige Label erwischt, oder sollte es eher Label63 oder gar Label74 sein? Was ich meine: benenne Deine Komponenten ordentlich, so dass man aus dem Bezeichner schon schließen kann, was sie darstellen. Apropos darstellen: noch besser wäre es, die Komponenten tatsächlich zur reinen Darstellung zu benutzen und nicht als Datenspeicher. Mal ein Beispiel zur Gegenüberstellung:
Delphi-Quellcode:
procedure TDeinForm.Division;
begin lblErgebnis.Caption := IntToStr(StrToInt(lblZahl1.Caption) div StrToInt(lblZahl2.Caption)); end; procedure TDeinForm.Division2; var Ergebnis: integer; begin Ergebnis := FZahl1 div FZahl2; //private Integer-Felder des Formulars lblErgebnis.Caption := IntToStr(Ergebnis); end; |
AW: Roulette
Ich würde das ganze mit einem Record erschlagen
Delphi-Quellcode:
Im Initialisierungsteil werden alle Werte gesetzt und nach dem Würfeln wird dann ausgelesen was geworfen wurde.
tRouletteRec = record
Zahl : word; PI : TPairImpair; RN : TRougeNoir { Grün nicht vergessen } ... end; var ra: array [0..36] of tRouletteRec; Gruß K-H |
AW: Roulette
Bis jetzt steige ich noch durch, ich benenne nie die einzelnen Komponenten:wink:. Habe mittlerweile schon einiges an Quelltext dazubekommen. Wie prüfe, wenn zweimal ein Impair nacheinander kommt?
|
AW: Roulette
Indem du dir in einer Variable das speicherst/merkst?
|
AW: Roulette
Beim Impair muss es ja nicht zweimal die selbe Zahl sein. Es kann ja auch 21 und 13 sein.
|
AW: Roulette
Zitat:
Delphi-Quellcode:
Und wenn Impair, prüfen ob wahr und reagieren. Wert auf wahr lassen.
LastRoundWasAlreadyImpair : Boolean;
Ansonsten den Wert auf false setzen. Immer genau das speichern, was man sich merken möchte |
AW: Roulette
Danke für die Tipps :-D
Ach ja, 14 Punkte sind es geworden, 1 Punkt Abzug für nicht vorhandene Komponentenbezeichnung :x |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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