AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Würfeln mit zwei Würfeln

Ein Thema von sokorota · begonnen am 23. Apr 2020 · letzter Beitrag vom 28. Apr 2020
Antwort Antwort
sokorota

Registriert seit: 23. Apr 2020
1 Beiträge
 
#1

Würfeln mit zwei Würfeln

  Alt 23. Apr 2020, 16:46
Delphi-Version: 5
Hey, ich bin noch sehr neu in Delphi und möchte gerne folgendes Würfelspiel im Programm Lazarus erstellen:

Es wird mit zwei Würfeln gewürfelt und immer nur die Augensumme betrachtet. Wenn man beim ersten Wurf eine 7 oder 11 würfelt, hat man gewonnen. Wenn man stattdessen beim ersten Wurf eine 2, 3 oder 12 würfelt, hat man verloren. Bei jeder anderen Augensumme ist das Spiel noch offen und geht weiter, solange, bis man entweder eine 7 würfelt (Dann hat man verloren), oder die im ersten Wurf erreichte Augenzahl ein zweites Mal würfelt (Dann hat man gewonnen). Das Programm soll so aussehen:

-Es soll Spieleinsätze entgegennehmen und das Kapital nach jedem Spiel entsprechend erhöhen oder vermindern
-Überwachung der Spielregeln
-Das Würfeln übernehmen

Nochmals entschuldigung :c Ich bin seit drei Tagen neu in Delphi/Lazarus eingestiegen und habe diese Aufgabe per Zufall gefunden und fand sie interessant. Es wäre sehr nett, wenn mir jemand helfen könnte :3
-Soko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: Würfeln mit zwei Würfeln

  Alt 23. Apr 2020, 17:35
Da Lazarus von Delphi abgeguckt hatte, ist Vieles somit gleich/ähnlich.
(bei der grundlegenden Syntax, auch bei vielen Funktionen und beim Aufbau der RTL/VCL)

Zufall: Delphi-Referenz durchsuchenRandom, Delphi-Referenz durchsuchenRandomRange
Prüfen: Delphi-Referenz durchsuchenif-then, Delphi-Referenz durchsuchencase, Delphi-Referenz durchsuchenin
Wiederholungen: For, Delphi-Referenz durchsuchenWhile oder Delphi-Referenz durchsuchenRepeat

OK, wenn man zwischendrin die Spieleinsätze noch ändern will und nicht automatisch bis zum Ende würfeln will,
dann keine direkte Schleife, sondern als State-Mashine:
* zu Beginn alles initialisieren, bzw. am Ende oder auch zwischendrin zurücksetzen (Reset-Knopf)
* im Würfel-Knopf zuerst schauen ob das Spiel aktiv ist (kein Ende-Zustand)
** Einsätze einsammeln (Geld abziehen)
** die zwei Zufallszahlen bestimmen
** prüfen ob gewonnen/verloren/nix
*** Gewinn ausschütten (Geld hinzufügen)
** Daten anzeigen


PS: Delphi-Referenz durchsuchenRandomize ruft man nicht ständig neu auf und innerhalb der VCL (TForm usw.) braucht man das garnicht aufrufen, da es schon einmal beim programmstart automatisch ausgeführt wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Würfeln mit zwei Würfeln

  Alt 24. Apr 2020, 08:46
und für das Würfeln das randomize; nicht vergessen, sonst ist das Würfelergebnis nach jedem Programm neustart gleich (war zumindest zu meiner "Lernzeit" noch so).
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

AW: Würfeln mit zwei Würfeln

  Alt 24. Apr 2020, 16:52
und für das Würfeln das randomize; nicht vergessen, sonst ist das Würfelergebnis nach jedem Programm neustart gleich (war zumindest zu meiner "Lernzeit" noch so).
Jein, siehe mein letzter Satz.

Aber OK, in einer Consolenawendung oder in einem Thread ist es noch so.
Aber in der VCL schon ewige nicht mehr.

Schlimmer ist es dagegen vor jedem einzelnen Random ein Randomize zu machen, was dann schnell dazu führen kann, dass du immer wieder die selben Zahlen bekommst.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Apr 2020 um 16:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Würfeln mit zwei Würfeln

  Alt 27. Apr 2020, 08:45
und für das Würfeln das randomize; nicht vergessen, sonst ist das Würfelergebnis nach jedem Programm neustart gleich (war zumindest zu meiner "Lernzeit" noch so).
Jein, siehe mein letzter Satz.

Aber OK, in einer Consolenawendung oder in einem Thread ist es noch so.
Aber in der VCL schon ewige nicht mehr.

Schlimmer ist es dagegen vor jedem einzelnen Random ein Randomize zu machen, was dann schnell dazu führen kann, dass du immer wieder die selben Zahlen bekommst.
Ok, den habe ich wohl überlesen^^ Wobei das mit dem einmaligen Aufruf wusste ich noch^^
Aber wenn das nicht mehr benötigt wird umso besser.

Wobei ich deinen letzten beschriebenen Effekt irgendwie witzig finde aber glaube noch nicht gesehen zu haben
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
150 Beiträge
 
#6

AW: Würfeln mit zwei Würfeln

  Alt 28. Apr 2020, 00:29
himitsu hat eigentlich schon alle wichtigen Funktionen genannt, da du aber ein Anfänger bist, vielleicht noch paar Tipps.

Um eine Zufallszahl zu ermitteln benötigt man die Funktion Random. Wobei die Funktion Random allein eine Fließkommazahl der Größe 0 <= X < 1 liefert, d. h. einen Wert zwischen 0 und unter 1. Die 1 wird nie geliefert. Der Wert wird immer kleiner 1 sein. Das muss man im Hinterkopf behalten.

Wobei die Funktion Random gibt es auch in der zweiten Variante, und zwar so: Random(MaxWert). In der Klammer kann man den MaxWert eingeben, wobei auch hier gilt 0 <= X < MaxWert. Der MaxWert wird nie geliefert.

Will man aus eine Zahl zwischen 1 und 6 Ziehen, macht man das folgendermassen: =: Random(6) + 1; Random(6) liefert einen Wert zwischen 0 und 5, nie 6. Da du sowieso keine 0 brauchst, addierst du einfach eine 1 dazu. Die obere Funktion liefert dann einen Wert zwischen 1 und 6. Eigentlich 0 bis 5, aber du addierst noch die 1 dazu.

Das Problem bei Delphi ist aber, dass die Zufallszahlen nie so zufällig sind. Delphi liefert immer die gleichen Werte. Damit das nicht passiert muss beim Programmstart mindestens einmal die Funktion Randomize ausgeführt werden. Man kann das auch öfters ausführen, schadet nicht, aber mindestens einmal sollte man es machen, sonst bekommst du ständig die gleiche Zahlenfolge. Hier die fertige Funktion:

Delphi-Quellcode:
function ZahlWuerfeln: Byte;
begin
  Randomize;

  Result := Random(6) + 1;
end;
Der Rest ist programmieren, wobei die von himitsu vorgeschlagene Case die Aufgabe zwar eleganter löst, aber als Anfänger würde ich If-Then nehmen. Zusätzlich musst du noch zählen wie oft gewürfelt wurde. Dazu brauchst du eine globale Variable. Und, falls du gewonnen oder verloren hast, sollte das Spiel nicht weiter gehen. Du brauchst also eine Variable die sich merkt ob das Spiel beendet ist:

Delphi-Quellcode:
var
  AnzahlWuerfe: Integer;
  SpielEnde: Boolean;

procedure TForm1.ButtonWuerfelnClick(Sender: TObject);
var
  a, b, c: Byte;
  a1, b1: Byte;
begin
  if SpielEnde then
    ShowMessage('Das Speil ist beendet! Starte das Spiel neu.');

  a := ZahlWuerfeln;
  b := ZahlWuerfeln;

  Label1.Caption := IntToStr(a);
  Label2.Caption := IntToStr(b);

  AnzahlWuerfe := AnzahlWuerfe + 1;

  if AnzahlWuerfe = 1 then
  begin
    if ((a + b) = 7) or ((a + b) = 11) then
    begin
      ShowMessage('Gewonnen!');
      SpielEnde := True;
    end;

    if ((a + b) = 2) or ((a + b) = 3) or ((a + b) = 12) then
    begin
      ShowMessage('Verloren!');
      SpielEnde := True;
    end;

    c := a + b;
  end
  else
  begin
    if (a + b) = 7 then
    begin
      ShowMessage('Verloren!');
      SpielEnde := True;
    end;

    if (a + b) = c then
    begin
      ShowMessage('Gewonnen!');
      SpielEnde := True;
    end;
  end;
end;

procedure TForm1.ButtonNeuesSpielClick(Sender: TObject);
begin
  AnzahlWuerfe := 0;
  SpielEnde := False;
end;
Dann, wenn man das noch schöner machen will, kann man statt mit Zahlen, mit Würfel-Bildern arbeiten.

Erstelle mit Paint 6 Bitmaps 32x32 Pixel groß. Zeichne Augen ein. Plaziere auf dem Formular eine TImageList Komponente. Stelle Width und Height auf 32 Pixel. Füge in die ImageList1 alle sechs Würfel der Reihe nach ein. Stelle für jedes Bild die Transparenz auf clNone. Füge nun zwei TImage Komponenten auf das Formular. Stelle bei beiden Komponenten Width und Height auf 32 Pixel.

Erweitere den Code um:

Delphi-Quellcode:
  Label1.Caption := IntToStr(a);
  Label2.Caption := IntToStr(b);

  Image1.Picture.Bitmap := nil;
  Image2.Picture.Bitmap := nil;
  ImageList1.GetBitmap(a - 1, Image1.Picture.Bitmap);
  ImageList1.GetBitmap(b - 1, Image2.Picture.Bitmap);
Wenn du willst kannst du die zwei Label Zeilen jetzt entfernen. Beachte a und b haben einen Wert zwischen 1 und 6. Deshalb muss bei GetBitmap der Wert -1 abgezogen werden, da die ImageList bei 0 beginnt.

Viel Spaß.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#7

AW: Würfeln mit zwei Würfeln

  Alt 28. Apr 2020, 10:03
Zitat:
Das Problem bei Delphi ist aber, dass die Zufallszahlen nie so zufällig sind.
Das ist aber kein Delphi-Problem, sondern ist völlig normal bei allen PseudoRandom-Generatoren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#8

AW: Würfeln mit zwei Würfeln

  Alt 28. Apr 2020, 13:05
Randomize initialisiert sie Zufallszahlenberechnung mit einem bestimmten Wert
und früher wurde da GetTickCount verwendet, also innerhalb von weniger als 15-16 Millisekunden aufgerufen, wird da oft der selbe Wert verwendet.

Außerdem ist so ein Pseudozufalszahlengenerator so designt, dass die Werte eine gewisse Verteilung aufweisen.
Initialisiert man den immer wieder neu, dann kann sich eine ungünstige Verteilung ergeben.
z.B. Zahlen von 1 bis 10 und Alles kommt etwa gleich oft vor
wird nun immer wieder neu gestartet, denn kann es sein, dass einzelne Zahlen/Zahlenbereiche zu häufig vorkommen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Apr 2020 um 13:07 Uhr)
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
150 Beiträge
 
#9

AW: Würfeln mit zwei Würfeln

  Alt 28. Apr 2020, 19:18
@himitsu

Stimmt. In der Regel. Aber ich denke würfeln ist die Ausnahme von der Regel. Ansonsten versucht Delphi beim Würfeln die Zahlen gleichmäßig zu verteilen, so dass die Zahl 2 nur alle sechs Würfe vorkommen müsste. Soll ja nicht passieren.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:31 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