Würfel-Programmierung

HarryXVI

Erfahrenes Mitglied
Hallo,
ich möchte es so programmieren, dass ein Zufallsgenerator eine Zahl zwischen 11 und 66 erstellt und diese dann ausgibt. Es dürfen aber nur 11, 21, 22, 32, 33, 42, 43, 44, 52, 53, 54, 55, 61, 62, 63, 64, 65, 66 herauskommen. Ich weiß, dass ich randomize anwenden muss, aber wie?

Zweite Frage: Wie gebe ich die erstellte Zahl am besten aus?
 

Dario Linsky

Erfahrenes Mitglied
Hi,

erstell dir doch einfach ein Array, in dem du die erlaubten Zahlen ablegst. Du kannst dann mit fortlaufenden Zufallszahlen auf die Elemente des Arrays zugreifen.

Code:
procedure RollDice();
const
    numbers: array[0..17] of Integer = (11, 21, 22, 32, 33, 42, 43, 44, 52, 53, 54, 55, 61, 62, 63, 64, 65, 66);
var
    i: Integer;
begin
    Randomize; // Zufallszahlengenerator vorbereiten
    i := Random(17); // Zufallszahl erstellen
    ShowMessage(IntToStr(numbers[i])); // Würfelergebnis als MessageBox ausgeben
end;

Grüße, D.
 

HarryXVI

Erfahrenes Mitglied
Gut, dass klappt soweit.
Ich möchte ein Programm schreiben, wo User gegen Computer spielt.
Weitere Fragen:
1. Wie kann ich Zahlen abspeichern?
2. Wie kann ich es machen, dass das Programm automatisch eine weitere Zahl erstellt und diese mit meiner eingegebenen Zahl vergleicht?
 

CSANecromancer

Erfahrenes Mitglied
Hi,

erstell dir doch einfach ein Array, in dem du die erlaubten Zahlen ablegst. Du kannst dann mit fortlaufenden Zufallszahlen auf die Elemente des Arrays zugreifen.

Klugscheis.serei meinerseits:
Das von dir gebastelte Array unterscheidet nicht zwischen 12 und 21 und gibt damit eine falsche Wahrscheinlichkeitsverteilung für die einzelnen Werte weiter. :)
Mit zwei Würfeln habe ich 6 * 6 = 36 verschiedene Ergebnismöglichkeiten. Die Wahrscheinlichkeit auf einen bestimmten Pasch ist dabei 1 / 36. Die Möglichkeit einer bestimmten Zahlenkombination (z.B. 12) ist jedoch doppelt so hoch.
 

Dario Linsky

Erfahrenes Mitglied
Hi,

genau genommen stimmt das natürlich. Man könnte auch den komplizierteren Weg gehen und nach den jeweiligen Wahrscheinlichkeiten verschiedene Intervalle der Zufallszahlen auswerten.

Effektiv wird das aber bei einer Handvoll von Zufallszahlen kaum merkbar sein, dafür reicht die Funktion. Für einen spürbaren Unterschied der Wahrscheinlichkeiten müsste man schon eine Messreihe mit mehreren hundert Ergebnissen auswerten. Wenn es darauf ankommt, lohnt sich auch der Aufwand einer genaueren Funktion, ansonsten stimmt das Verhältnis von Aufwand zu Nutzen m.M.n. nicht so ganz. ;)

Grüße, D.
 

HarryXVI

Erfahrenes Mitglied
Weitere Fragen:

1.Wie sage ich dem Compiler, dass 21, 11, 22, 33, 44, 55 mehr zählt als 66?
2. Ich habe folgendes als Vergleichsmethode geschrieben..

Code:
if eingabe <> w then ShowMessage('Gelogen!');

Weiter oben steht dann:
Code:
w := Random(20); // Zufallszahl für Spieler
ShowMessage(IntToStr(numbers[w]));
...
eingabe := StrToInt(EdEingabe.Text);

Trotzdem gibt der Computer oft "Gelogen" aus, auch wenn ich die echte Zahl eingetippt habe.
 
Zuletzt bearbeitet:

Dario Linsky

Erfahrenes Mitglied
Hi!

1. Wie die Ergebnisse gewertet werden (und wie du demnach die Regeln implementieren musst) hängt von den Regeln selbst ab. Dem Compiler musst du das nicht erklären, der interessiert sich nur für syntaktische Richtigkeit des Codes.

2. Du musst auch auf das Würfelergebnis vergleichen, nicht auf dessen Index. ;)

Grüße, D.
 

Dario Linsky

Erfahrenes Mitglied
Hi,

wenn du die Würfelergebnisse in deinem Array hast, solltest du auch die Eingabe mit dem Inhalt des Arrays an der w-ten Stelle vergleichen, nicht mit w selbst.

Code:
if eingabe <> numbers[w] then // ...

Zumindest soweit ich dich verstanden habe. ;)

Grüße, D.