In meinem Spiel befindet sich oben auf dem Bildschirm ein Wort, Buchstaben regnen von oben nach unten und der Benutzer muss die Buchstaben berühren, um das Wort zu vervollständigen.
Momentan generiere ich Buchstaben nach dem Zufallsprinzip (tatsächlich sind Zufallszahlen und Zahlen der Index für das Buchstabenarray, z. B.: 0 = a, 1 = b), aber das Problem ist, dass es zu lange dauert, bis alle erforderlichen Buchstaben zum Ausfüllen der Buchstaben vorliegen Wort.
Ich möchte, dass die Zufallszahlen, die ich generiere, häufiger die erforderlichen Buchstaben generieren, damit der Spieler nicht den ganzen Tag damit verbringen muss, ein Wort zu vervollständigen.
Ich habe folgende Methoden ausprobiert:
Erkennen Sie alle Buchstaben im Wort (das Wort ist immer 6 Buchstaben lang), generieren Sie das Array von Indizes der Länge 6, weisen Sie jedem Index des Arrays eine Zufallszahl von Buchstabe 2 bis Buchstabe + 2 zu und wählen Sie am Ende zufällig einen Index aus aus dem Array zu zeigen.
Lassen Sie eine Selektorvariable, deren Wert im Bereich [0..2] liegt, zufällig generieren. Wenn Selektor == 0 ist, erkennen Sie Buchstaben, aus denen das Wort besteht, und wählen Sie zufällig einen Buchstaben aus. Andernfalls erhalten Sie zufällig ein Alphabet von az.
Beide Methoden haben mir keine Hilfe gegeben. Ich würde mich sehr freuen, wenn Sie mir helfen können.
Vielen Dank für das Lesen. Ich hoffe, Sie haben die Frage verstanden und ich warte auf die Antwort.
Antworten:
Sie wollen eigentlich keine zufällige Verteilung. Ich weise explizit darauf hin, denn was wir für das Design als "zufällig" betrachten, ist normalerweise keine echte Zufälligkeit.
Lassen Sie uns in diesem Sinne einige Optimierungswerte hinzufügen - dies sind Dinge, mit denen Sie herumspielen werden, bis sich das Design "richtig" anfühlt.
Die Wahrscheinlichkeit steuert, wie wahrscheinlich es ist, dass Sie bei einem bestimmten Aufruf von ChooseLetter einen Wortbuchstaben erhalten. Bei 0,5 erhalten Sie ungefähr jedes zweite Mal einen Wortbuchstaben. Bei 0,25 ist jeder vierte ein Wortbuchstabe usw.
Dies ist immer noch ein bisschen simpel - da Zufälligkeit zufällig ist , haben Sie keine Garantie dafür, wie lange Sie zwischen Wortbuchstaben wechseln. (Theoretisch kann man für immer ohne einen Wortbuchstaben auskommen, es ist nur sehr, sehr unwahrscheinlich.) Stattdessen können wir einen Faktor hinzufügen, um die Wahrscheinlichkeit eines Wortbuchstabens jedes Mal zu erhöhen, wenn wir keinen erhalten:
Okay, jetzt gehen wir nie mehr als zwei Buchstaben ohne einen Wortbuchstaben. (Weil wir nach zwei Fehlern eine Wahrscheinlichkeit von 1,0 haben, einen Wortbuchstaben zu bekommen.)
Schließlich müssen wir berücksichtigen, wie die Auswahl des Buchstabens in einem Wort funktioniert. Um dem Spieler die Buchstaben zu liefern, die er tatsächlich benötigt, müssen wir die Buchstaben aus dem Satz entfernen, sobald sie sie erhalten.
Wenn das Wort beispielsweise "Test" lautet und der Spieler bereits "s" hat, möchten wir ihm keine weiteren "s" geben, da er sie nicht benötigt!
Von hier aus wird der Rest an Ihr Design angepasst.
quelle
Sie können die Wahrscheinlichkeit aller Ihrer Buchstaben anhand der Häufigkeit gewichten, mit der sie in der Sprache vorkommen, in der sich Ihre Wörter befinden. Eine gute Richtlinie ist das Scrabble-Set . Die englische Version hat zum Beispiel 12 E, aber nur ein Z und ein Q.
Eine einfache Möglichkeit, dies zu implementieren, besteht darin, alle Buchstaben in eine fortlaufende Zeichenfolge zu setzen, wobei jeder Buchstabe so oft wie gewünscht erscheint, und dann Ihr RNG einen Buchstaben von einer zufälligen Position nehmen zu lassen. Pseudocode-Beispiel:
quelle
Hier ist eine Möglichkeit, es mit einem einzigen Parameter zu verbessern
k
, den Sie anpassen können.Anstatt nur einen zufälligen Buchstaben auszuwählen:
A
X
X > k
undA
ist nicht in[list of remaining needed letters]
, versuchen Sie es erneut auf 1.Je kleiner
k
ist, desto öfter wird der letzte BuchstabeA
tatsächlich benötigt.Um den Algorithmus zu optimieren, spielt mit einem beliebigen Wert für
k
, zBk = 0.5
. Wenn Sie feststellen, dass das Spiel zu schwierig ist, versuchen Sie es0.4
stattdessen usw., bis Sie einen angemessenen Wert gefunden haben. Dies gibt Ihnen auch direkt eine Schwierigkeitseinstellung , die Sie beispielsweise erhöhen möchten, wenn der Spieler im Spiel Fortschritte macht.quelle
Eine einfache Möglichkeit, um sicherzustellen, dass die erforderlichen Buchstaben innerhalb einer bestimmten Zeit angezeigt werden, besteht darin, ein Array mit den Buchstaben im Wort und dem Rest des Alphabets zu füllen (möglicherweise wiederholt) und das Array dann zufällig zu mischen (c ++ hat std :: random_shuffle) Wenn Sie in der Standardbibliothek eine andere Sprache verwenden, ist die Implementierung nicht schwierig.
Wenn Sie möchten, dass die Buchstaben im Wort schneller angezeigt werden, fügen Sie mehr Kopien der Wortbuchstaben in das Array ein.
quelle
Wenn Sie C ++ verwenden, können Sie eine bereits vorhandene Distribution http://en.cppreference.com/w/cpp/numeric/random/piecewise_constant_distribution verwenden
Es hat auch eine konstante zeitliche Komplexität amortisiert, die besser ist als naive Methoden. Beispiel:
quelle