Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Roulette (https://www.delphipraxis.net/174187-roulette.html)

galoru 8. Apr 2013 18:01

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 ?

Bummi 8. Apr 2013 18:08

AW: Roulette
 
Was meinst Du mit Bereich, nur die Zahlen (1,3,9,12,17) sind ein gültiges Ergebnis?

galoru 8. Apr 2013 18:10

AW: Roulette
 
Ich möchte eine generierte Zahl zwischen den Zahlen 1,3,9,12,17 haben. Also nur eine dieser 5 Zahlen.

Bummi 8. Apr 2013 18:15

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;

galoru 8. Apr 2013 18:18

AW: Roulette
 
Vielen Dank, hilft mir wirklich sehr!:-D

galoru 8. Apr 2013 20:32

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?

Sir Rufo 8. Apr 2013 20:45

AW: Roulette
 
Indem du überall - vor dem nächsten Ziehen - alles auf die Werte stellst, die du haben möchtest?

galoru 8. Apr 2013 20:49

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;

galoru 8. Apr 2013 21:06

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.

Bjoerk 8. Apr 2013 21:15

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;

Medium 8. Apr 2013 21:19

AW: Roulette
 
Hierbei:
Delphi-Quellcode:
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
arbeitet das "or" nicht wie du aus dem sprachlichen Gebrauch her vermutest. Es wird hier ein Bei Google suchenlogisches Oder auf Zahlen angewendet, und du hast dort im Grunde eigentlich dieses hier stehen:
Delphi-Quellcode:
If Edit3.text=IntTostr(63) then
. (63 ist das Ergebnis von 1 or 3 or 5 or...)

Wenn du anders herum umwandelst wird es deutlich einfacher, vorausgesetzt ihr dürft ein sogenanntes "Set" benutzen:
Delphi-Quellcode:
if StrToInt(Edit3.Text) in [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] then
Das wäre die bei weitem einfachste Variante. Der lange und hässliche Weg könnte (angedeutet) so aussehen:
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

galoru 8. Apr 2013 21:26

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 ?

sx2008 9. Apr 2013 00:14

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:
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;
Mit diesen kleinen netten Funktionen wird die Auswertung viel leichter!

galoru 9. Apr 2013 05:48

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.

Bummi 9. Apr 2013 06:46

AW: Roulette
 
Wenn der Code noch der ist der er war trägst Du das Ergebnis ein statt es zu addieren.

Jumpy 9. Apr 2013 08:43

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.

galoru 9. Apr 2013 13:35

AW: Roulette
 
Sorry für den Doppelpost, bin zu blöd :-D

galoru 9. Apr 2013 13:36

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:
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);
Mit Label:
Code:
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);
Wieso bleibt das Labelfenster unverändert?

DeddyH 9. Apr 2013 13:44

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;

p80286 9. Apr 2013 14:53

AW: Roulette
 
Ich würde das ganze mit einem Record erschlagen
Delphi-Quellcode:
  tRouletteRec = record
     Zahl : word;
     PI  : TPairImpair;
     RN  : TRougeNoir { Grün nicht vergessen }
     ...
  end;

var
  ra: array [0..36] of tRouletteRec;
Im Initialisierungsteil werden alle Werte gesetzt und nach dem Würfeln wird dann ausgelesen was geworfen wurde.

Gruß
K-H

galoru 9. Apr 2013 16:06

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?

Sir Rufo 9. Apr 2013 16:07

AW: Roulette
 
Indem du dir in einer Variable das speicherst/merkst?

galoru 9. Apr 2013 16:12

AW: Roulette
 
Beim Impair muss es ja nicht zweimal die selbe Zahl sein. Es kann ja auch 21 und 13 sein.

Sir Rufo 9. Apr 2013 16:16

AW: Roulette
 
Zitat:

Zitat von galoru (Beitrag 1210845)
Beim Impair muss es ja nicht zweimal die selbe Zahl sein. Es kann ja auch 21 und 13 sein.

Und wo ist das Problem?

Delphi-Quellcode:
LastRoundWasAlreadyImpair : Boolean;
Und wenn Impair, prüfen ob wahr und reagieren. Wert auf wahr lassen.
Ansonsten den Wert auf false setzen.

Immer genau das speichern, was man sich merken möchte

galoru 27. Apr 2013 16:48

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 03:10 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