Frage von Sapunja, 8

Zufallszahlen aber wie?

Hallo, ich möchte Memory mit dem Programm BlueJ programmieren, weil mir langweilig ist :D 

Ich habe aber ein kleines Problem: Da die Karten vor dem Spiel zufällig gelegt werden sollen, muss ich Zufallszahlen ziehen. 

Wie das geht weis ich aber ich das Problem ist das die x- Koordinaten 100 Einheiten auseinander liegen. Mir fällt kine Formel ein, die einheitlich ist. Mit der y-Koordinaten ist es dasselbe. Sie liegen im Abstand von 150 Einheiten auseinander. 

Das Feld mit den Karten ist 850 x 650 groß. Somit liegen die Karten in einem Muster von 8 x4 auseinander mit einer Größe von 50 x 100. Der Abstand beträgt also 50 in der Horizontale und 150 in der Vertikale. 

Es wäre echt super wenn einer von euch eine Idee hätte, wie ich dieses Problem bewältigen kann. Danke schon mal im Voraus.

 LG Max

Antwort
von wotan38, 5

Echte Zufallszahlen zu bilden ist relativ kompliziert, meist begnügt man sich mit Näherungslösungen. Das erste Problem besteht darin, dass ein in sich abgeschlossener Programmlauf gar keine Zufallszahl erstellen kann, weil bei jedem Neustart die gleiche Zahl herauskäme. Man muss also eine vom Programm unabhängige Komponente reinbringen, die den Programmlauf auf unterschiedliche Weise beeinflusst. Dafür kommt der Timer in Frage. Man holt sich die Computerzeit als Ausgangsbasis für eine Zufallszahlenermittlung. Manche Programmiersprachen bieten einen eigenen Befehl für diese Ermittlung an. Das zweite Problem besteht darin, dass man nur beim ersten Mal mit Sicherheit eine echte Zufallszahl bekommt. Bei Wiederholungen stehen die folgenden Zahlen wegen des gleichen Abfrageinterwalls in einem Abhängigkeitsverhältnis. das kann dazu führen, dass bei gleichem Anfangswert alle nachfolgenden Werte immer die selben Zahlen sind. Man kann in so einem Fall auch einen Tastendruck vorsehen, der gleiche Interwalle verhindert. In den meisten Fällen ist ein Tastendruck vom Konzept her unerwünscht und kommt nicht in Frage. Multitasking auf dem PC bringt eine erwünschte Unruhe ins Spiel. Bleibt zum Schluss die Frage nach dem Bereich. Braucht man z.B. Zufallszahlen im Bereich von 1 bis 6 zum Simulieren eines Spielwürfels, so kann man aus einer beliebigen hinreichend großen Zufallszahl auf einfache Weise eine neue Zahl im gewünschten Bereich erzeugen, indem man diese Zahl durch 6 dividiert und dann den um 1 erhöhten Rest nimmt. Um bei der Eingangszahl um größere Streuung zu bekommen, kann man diese durch eine Primzahl dividieren und die Nachkommastellen verwenden.

Am Rande bemerkt: In den IBM-Laboratorien wurden in den 60-ger Jahren Versuche mit einem Generator für Zufallszahlen gemacht, der aus dem atmosphärischen Rauschen der Luft seine Zahlen ermittelt hat.

Ich denke, beim Mischen für ein Kartenspiel kommt es nicht darauf an, echte Zufallszahlen zu verwenden. Überraschungen kann es aber schon geben. Wenn man es sich zu einfach macht, kann es schon vorkommen, dass je nach der ersten ermittelten Karte alle nachfolgenden die gleiche Reihe bilden. das wären dann insgesamt nur 32 mögliche Anfangsbilder nach dem Mischen.

Antwort
von Minihawk, 6

Ich würde das folgendermaßen Lösen: du hast n Karten im Stapel, du bestimmst eine Karte per Zufallszahl, legst sie auf Pos1, dann ziehst du aus dem um eine Karte verringerte Stapel wieder per Zufallszahl eine Karte, legst sie auf Pos 2, und so fort, bis die letzte Karte verteilt ist.

Antwort
von Sapunja, 5

schon klar aber wie soll ich die Zufallszahlen ziehen, damit die in meinem Raster liegen

Kommentar von Zyrober ,

Gar nicht. Wie Minihawk schon sagte, arbeitest du einfach mit festen Positionen. Die arbeitest du einfach nacheinander ab. Berechnen kann man die Position natürlich auch. Wenn's 8x4 ist, kannst du ja die Position über die Modulo-funktion bei 8 karten auf die nächste Zeile umbrechen lassen. Du brauchst 2 Funktionen, eine für x und eine für y. Die berechnest du in einer Schleife von 0 - 31 mit zum Beispiel i als Zählvariable. Für die für X brauchst du die Modulo-Funktion.... X = (i mod 8) * 100.  Für Y brauchst du eine ganzzahlige Division... nenn ich jetzt mal div. Y = (i div 8) * 150.

Da ich BlueJ nicht kenne, musste das jetzt nur noch in deiner Programmiersprache schreiben.

Antwort
von PWolff, 4

Bei nullbasierten Indizes {i, j}:

x[n] = x_0 + delta_x * i[n]

y[n] = y_0 + delta_y * j[n]

die linke obere Karte hat ihren linken oberen Eckpunkt bei {x_0, y_0}

die linken oberen Ecken horizontal benachbarter Karten liegen um delta_x auseinander und die linken oberen Ecken vertikal benachbarter Karten um delta_y

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten