Die Geschichte der Tetris-Randomisierungsalgorithmen

Bild
1985 veröffentlichten Alexey Pajitnov und Vadim Gerasimov Tetris. Bei diesem faszinierenden und süchtig machenden Spiel mussten die Spieler zufällig erscheinende Teile miteinander verbinden. Seitdem wurden mehr als 150 lizenzierte Versionen von Tetris veröffentlicht. Sie unterschieden sich in Spielmodi, Regeln und Implementierung und spielten alle leicht (oder sehr) unterschiedlich. Der Tetris-Zufallsgenerator ist eine Funktion, die eine zufällig ausgewählte Form zurückgibt. Im Laufe der Jahre haben sich die Regeln für die Auswahl von Formen weiterentwickelt und das Gameplay und die Zufälligkeit selbst beeinflusst. Einige dieser Algorithmen wurden rückentwickelt und dokumentiert. Ich habe eine Liste von Randomisierern zusammengestellt, die ich für wichtig halte, und ich werde im Artikel zeigen, wie sich die interne Struktur von Tetris im Laufe der Jahre verändert hat.

Tetris (um 1985)


Die erste und ursprüngliche Version von Tetris hatte einen Randomizer ohne Vorurteile. Nichts beeinflusste die Wahl der nächsten Figur, sie wurde einfach ausgewählt und dem Spieler gezeigt.

Bei Verwendung eines Zufallsgenerators ohne Verschiebung treten Situationen auf, in denen der Spieler eine Folge von einer Figur (als „Flut“, Flut) oder eine Folge von einer bestimmten Figur (als „Dürre“, Dürre bezeichnet) empfängt. Wir werden sehen, wie Designer verschiedener Versionen von Tetris versucht haben, dieses Problem leicht zu beheben.

Obwohl ein Randomizer ohne Verzerrung die größte Rätselkomplexität für die Spieler erzeugt, ist er instabil und kann zu einer unbesiegbaren Sequenz (PDF) führen . Dies ist jedoch in einem echten Spiel nicht der Fall, da Computer keine echten Zufallszahlengeneratoren haben. Pseudozufallszahlengeneratoren (PRNGs) versuchen, echte Zufälligkeit zu simulieren, haben jedoch nicht die Eigenschaften, die in einer Reihe 70.000 Zahlen Z erzeugen können.

Wahre Pseudozufälligkeit


function* random() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; while (true) { yield pieces[Math.floor(Math.random() * pieces.length)]; } } 

Puzzle-Schwierigkeit: 4/5

Hochwasserschutz: 0/5

Dürreprävention: 0/5

Tetris , Nintendo (1989)


Vier Jahre später wurde die ungewöhnlich beliebte Version von Tetris für NES veröffentlicht .

Um die Anzahl der Überschwemmungen (Wiederholungen) von Zahlen zu verringern, wurde dem Randomizer eine Verlaufsprüfung hinzugefügt. Diese einfache Überprüfung hat Folgendes bewirkt:

  1. Wähle eine Figur
  2. überprüft, ob die Zahl mit der vorherigen übereinstimmt,
  3. Wenn ja, dann hat der Algorithmus eine neue Form ausgewählt, aber nur einmal.
  4. und was auch immer das Ergebnis war, die Figur wurde dem Spieler gegeben.

Obwohl die Wahrscheinlichkeit, ein Stück hintereinander zu bekommen, abnahm, hinderte nichts das Spiel daran, zwei abwechselnde Stücke herauszugeben. Darüber hinaus war in dieser Version Dürre über mehr als 30 Zahlen eine häufige Situation. Eine Dürre kann für jede Art von Tetramino auftreten, aber Abbildung I ist wichtig für die Wertung in diesem Spiel, und die große Dürre kann das Endergebnis erheblich beeinflussen.

Auswendiglernen einer Geschichte 1 Figur in der Tiefe und mit 1 Wurf


 function* historyRandomizer() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; let history; while (true) { // First "roll" piece = pieces[Math.floor(Math.random() * pieces.length)]; // Roll is checked against the history if (piece === history) { piece = pieces[Math.floor(Math.random() * pieces.length)]; } history = piece; yield piece; } } 

Puzzle-Schwierigkeitsgrad: 5/5

Hochwasserschutz: 2/5

Dürreprävention: 0/5

Tetris: Der Großmeister (1998)


Obwohl Tetris für NES den Algorithmus im Vergleich zur Randomisierung ohne Verzerrung verbesserte, kam es immer noch häufig zu Dürren. Tetris: Der Großmeister ( TGM ) verwendete im Wesentlichen dasselbe System, jedoch mit einer längeren Geschichte und mehr Würfen.

Aufgrund des Anstiegs dieser Werte nahm nicht nur die Anzahl der Überschwemmungen ab, sondern auch die Situation mit Dürren verbesserte sich. In der Geschichte sind vier Figuren erhalten geblieben, und dies bedeutete, dass die Wahrscheinlichkeit, eine Figur zu erhalten, die lange Zeit nicht existiert hatte, zunahm. Trotzdem fehlte dem Spiel immer noch eine strenge Regel, um Dürren zu verhindern, und sie traten immer noch auf, wenn auch viel seltener als in Tetris für NES .

Eine Geschichte mit 4 Stücken und 4 Würfen auswendig lernen


 function* historyRandomizer() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; // First piece special conditions let piece = ['I', 'J', 'L', 'T'][Math.floor(Math.random() * 4)]; yield piece; let history = ['S', 'Z', 'S', piece]; while (true) { for (let roll = 0; roll < 4; ++roll) { piece = pieces[Math.floor(Math.random() * 7)]; if (history.includes(piece) === false) break; } history.shift(); history.push(piece); yield piece; } } 

Puzzle-Schwierigkeit: 4/5

Hochwasserschutz: 4/5

Dürreprävention: 2/5

Tetris Worlds et al. (2001)



Tetris Worlds führte die Massen in den Zufallsgenerator ein. Er ist jetzt der offizielle Randomizer in den meisten offiziellen Versionen des Spiels nach Tetris Worlds und wird bis heute verwendet.

Geschichtsbasierte Randomisierer halfen, die Überschwemmungen zu beseitigen (oder zumindest zu minimieren), stoppten jedoch nicht die Dürre. Unter bestimmten Umständen bestand immer noch die Möglichkeit, eine tödliche Zahlenfolge zu erhalten.

Der Zufallsgenerator (Zufallsgenerator) löst diese Probleme durch die Verwendung eines neuen Systems von "Beuteln" (Beuteln). In diesem System wird die Liste der Figuren in einen "Beutel" gelegt, wonach die Figuren nacheinander zufällig daraus extrahiert werden, bis der "Beutel" leer ist. Wenn es leer ist, kehren die Teile dorthin zurück und der Vorgang wird wiederholt. Random Generator hat einen "Beutel" der Größe 7 (7 Beutel), dh einen "Beutel", der mit jeweils 7 Tetraminos gefüllt ist. Andere Arten von "Beuteln" sind möglich, beispielsweise ein 14-Beutel, in den zwei Stücke jeder Art von Tetramino gelegt werden.

Aufgrund der fehlenden Geschichte der "Taschen" können an ihren Kreuzungen Überschwemmungen von 2 Figuren und "Schlangen" von 4 Figuren auftreten ( , usw.). Dies ist in gewissem Sinne ein Rückschritt im Vergleich zu herkömmlichem Tetris für NES .

Die Teile fallen stabil aus dem 7-Beutel heraus, was es vorhersehbarer macht. Es ist leicht zu verstehen, in welchem ​​Teil der „Tasche“ Sie sich befinden und wann die benötigte Figur kommen kann. Aufgrund der Vorhersagbarkeit dieses Zufallsgenerators kann das Spiel tatsächlich endlos gespielt werden . Im Allgemeinen ist dies ein sehr dummes System, und es ist unklar, wie es im Allgemeinen zu einem offiziellen Randomizer wurde.

7 Beutel


 function* randomGenerator() { let bag = []; while (true) { if (bag.length === 0) { bag = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; bag = shuffle(bag); } yield bag.pop(); } } 

Puzzle-Schwierigkeitsgrad: 3/5

Hochwasserschutz: 3/5

Dürreprävention: 4/5

Tetris: Der Großmeister 3 - Terror-Instinkt (2005)


TGM3 hat die Idee der Erzeugung von Zufälligkeit stark vorangetrieben. Dies ist ein einzigartiges System, das in keiner anderen Version zu finden ist.

Anstelle einer Tasche oder Geschichte verwendet der TGM3 einen Pool von Formen. Anfangs hat es 5 Figuren von jedem Typ, dh insgesamt 35 Figuren. Wenn eine Figur gezogen wird, wird sie nicht aus dem Pool entfernt, sondern durch die Figur mit der größten Dürre ersetzt (eine, die seit langem nicht mehr entfernt wurde). Allmählich wird der Pool zunehmend mit dieser Figur gefüllt, bis er schließlich herausgezogen wird. Dies löst die Probleme von "Beutel" -Systemen sowie von Systemen mit einer Geschichte; Sie holt das Beste aus beiden Arten der Randomisierung heraus.

Pool von 35 Figuren mit 6 Würfen


 function* tgm3Randomizer() { let pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; let order = []; // Create 35 pool. let pool = pieces.concat(pieces, pieces, pieces, pieces); // First piece special conditions const firstPiece = ['I', 'J', 'L', 'T'][Math.floor(Math.random() * 4)]; yield firstPiece; let history = ['S', 'Z', 'S', firstPiece]; while (true) { let roll; let i; let piece; // Roll For piece for (roll = 0; roll < 6; ++roll) { i = Math.floor(Math.random() * 35); piece = pool[i]; if (history.includes(piece) === false || roll === 5) { break; } if (order.length) pool[i] = order[0]; } // Update piece order if (order.includes(piece)) { order.splice(order.indexOf(piece), 1); } order.push(piece); pool[i] = order[0]; // Update history history.shift(); history[3] = piece; yield piece; } } 

Puzzle-Schwierigkeit: 4/5

Hochwasserschutz: 4/5

Dürreprävention: 4/5

Schlussfolgerungen


Es ist schwierig, ein bestimmtes Ergebnis zu erzielen. Der TGM3-Randomizer scheint für den Spieler vorhersehbarer und weniger komplex zu sein. Der ungeschickte 7-Beutel fühlt sich unnatürlich an, ermöglicht es Ihnen jedoch, viele tragfähige Gebäudestrategien zu entwickeln. Ein unfreundlicher Zufallsgenerator wie in Tetris für NES kann Ihr Spiel oder eher Ihre Spielstimmung ruinieren.

Können wir diese Systeme verbessern, indem wir sie zufälliger erscheinen lassen und Dürren und Überschwemmungen stark einschränken? Oder machen solch strenge Einschränkungen das Spiel nur vorhersehbarer?

Source: https://habr.com/ru/post/de466579/


All Articles