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.
 

Dario Linsky

Erfahrenes Mitglied
Hi,

ich glaube, so einen Operator gibt es in Pascal/Delphi (zumindest für einfache Arrays) nicht. Schreib dir am besten eine Methode, die dein Array durchsucht und entweder true oder false zurück gibt. Oder benutz sowas wie TList, das könnte sogar eine entsprechende Methode anbieten.

Grüße, D.
 

HarryXVI

Erfahrenes Mitglied
Wie soll ich denn nun die Rangfolge der Würfelzahlen (31,...41,...51,...61,...66, 11,...55, 21) implementieren?

Bitte Vorschläge mit sinnvollem Code, dann kann ich das besser nachvollziehen. Wenn ihr nur schreibt "mit einer ListBox", hilft mir das nicht viel weite!
 
Zuletzt bearbeitet:

Imod

Mitglied
hey,

ich will net fies sein, aber warum verlangst du hier den kompletten Code?
.. so kannste ja gleich jemand Fragen ob er dir das Programm schreibt.

Es gibt in Delphi ne gute Hilfe, gib da mal ListBox ein da findest du extreme viel!

ohne fleiß kein Preis ....

naja

Mfg ImoD
 

HarryXVI

Erfahrenes Mitglied
Ich habe mir nun eine ListBox gemacht und die Würfelzahlen nach Werten sortiert als Strings eingegeben. Dann habe ich die ListBox unsichtbar gemacht, denn sie nimmt nur Platz weg.
Könnt ihr mir vielleicht noch einen Tipp geben, wie der Compiler von dieser Liste auf die Reihenfolge der gewürfelten Zahlen schließen kann?
 

Dario Linsky

Erfahrenes Mitglied
Hi,

ich an deiner Stelle würde das nicht über eine ListBox machen, denn die frisst nur unnötig viel Speicher. Eine verkettete Liste (TList) sollte es auch tun und ist relativ flexibel, was das Anhängen neuer Elemente angeht. Neue Würfelergebnisse hängst du einfach hinten an und bekommst so eine sortierte Liste nach der Reihenfolge, in der die Würfelergebnisse anfallen.

Grüße, D.
 

Dario Linsky

Erfahrenes Mitglied
Hi,

TList ist keine sichtbare Formularkomponente der VCL. Das ist ein Klassentyp, den du in deinem Code verwenden kannst. Für weitere Details kann ich dir da nur die Online-Hilfe oder Google nahe legen.

Grüße, D.
 

HarryXVI

Erfahrenes Mitglied
ich habe mich nochmal an das thema herangewagt und es auf anderem wege probiert. um dem Compiler die rangfolge klar zu machen (21 zählt mehr als 66), habe ich die array-positionen einzeln zugewiesen:
Code:
numbers[0] := 31; numbers[1] := 32; numbers[2] := 41; numbers[3] := 42;
numbers[4] := 43; numbers[5] := 51; numbers[6] := 52; numbers[7] := 53;
numbers[8] := 54; numbers[9] := 61; numbers[10] := 62; numbers[11] := 63;
numbers[12] := 64; numbers[13] := 65; numbers[14] := 11; numbers[15] := 22;
numbers[16] := 33; numbers[17] := 44; numbers[18] := 55; numbers[19] := 66;
numbers[20] := 21;
Nun stehe ich vor dem Problem, dass wenn der Benutzer z.B. 63 eingibt, der Compiler die Position der 63 im array "numbers" erfahren muss. Dann kann der Computer-Gegner die Position seiner gewürfelten Zahl mit der Position meiner angegeben Zahl vergleichen und somit selber eine geeignete Zahl ausgeben:

Beispiel, so wie es aussehen soll: Ich drücke "Wuerfeln" und bekomme eine 43. Der Compiler erfährt über den Button "Einlesen", dass meine eingegebene Zahl 43 die Position 4 hat. Der Computer-Gegner würfelt selbst und hat die Zahl 31, deren Position 0 ist. Durch eine if-Abfrage gibt er eine Zahl aus, deren Position höher ist als 4 (der meiner Zahl).

Das mit der if-Abfrage und den Buttons krieg ich hin, brauche nur Hilfe bei der Übergabe der Positonsdaten.
 

CSANecromancer

Erfahrenes Mitglied
Spontan würde ich es mal damit probieren:

Code:
function Get Position(const p_nValue: Byte): Byte;
var
  i: Integer;
begin
  Result := -1;
  for i := 0 to 20 do
    if p_nValue = numbers[i] then
    begin
      Result := i;
      break;
    end;
end;
Die Funktion sollte dir bei Übergabe des entsprechenden Wertes den Index (die Position) des Wertes im Array zurückgeben. Der Code ist allerdings von mir nicht getestet.

Ein Aufruf sollte klappen mit:
Code:
procedure OnEinlesenClick(Sender. TObject);
var
  nGamerValue: Byte;
begin
  nGamerValue := GetPosition(43); // oder was auch sonst für ein Wert für den Spieler gewürfelt wurde
  if nGamerValue <> -1 then
  // ab hier kann dann der Vergleich mit dem Würfelwert des Computers stattfinden
  ...
end;
 

Neue Beiträge