テトリスの歴史を「ブロックが落ちるルール」の進化から学ぶ
By torley
1985年にテトリスが誕生して以来、150種類以上のテトリスゲームがリリースされました。数十年の歴史の中で改良が重ねられたテトリスは、プログラマーたちの手によってブロックをランダムに出現させるプログラムが進化していきました。中でも代表的なテトリスは、資料としてプログラムが文書化されています。その中からいくつかリストアップし、テトリスが長年にわたってどのように変化したかを、テトリスを独自に研究するサイモン・ラロッシュ氏が紹介しています。
The history of Tetris randomizers - Simon Laroche
https://simon.lc/the-history-of-tetris-randomizers
目次:
◆テトリス(1985年)
◆テトリス/任天堂(1989年)
◆テトリス ザ・グランドマスター/アーケード(1998年)
◆テトリスワールド/ゲームボーイアドバンス(2001年)
◆テトリス ザ・グランドマスター3 -Terror Instinct-/アーケード(2005年)
◆テトリス(1985年)
最も古いオリジナルのテトリスは、純粋なランダム性で次に現れるブロックを選択していました。つまり、何度も同じブロックが続いたり、特定のブロックが全く出てこなかったりという完全な運ゲーになってしまうというわけです。
プログラムでは、各ブロックは['I', 'J', 'L', 'O', 'S', 'T', 'Z']という名前で表されています。それぞれがどのブロックを表しているかは以下の画像の通り。
純粋なランダム性だけで設計されたプログラムは不安定なので、SブロックやZブロックしか出ない(PDFファイル)無敵のコンボが発生する可能性があるとラロッシュ氏は述べています。実際に無敵のコンボを再現してしまったゲームもあります。
一番イヤなブロックが絶えず無慈悲に落ち続けるテトリス「HATETRIS」 - GIGAZINE
1985年のテトリスで使用されたプログラムは以下のようになっています。
function* random() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; while (true) { yield pieces[Math.floor(Math.random() * pieces.length)]; } }
◆テトリス/任天堂(1989年)
本家テトリスの誕生から4年後、海外版ファミリーコンピュータであるNintendo Entertainment System(NES)版のテトリスが任天堂から登場しました。このNES版テトリスは、数あるテトリスの中でも特に人気の高いゲームボーイ版テトリスの原型となります。任天堂のテトリスは同じブロックが連続で出現するのを避けるため、ブロックの履歴をチェックする機能が追加されています。
まず、ランダムにブロックを選び、ブロックが直前に出現したブロックと同じかチェックします。直前に出現したブロックと同じ場合、もう一度ランダムにブロックを選び直すという手順を繰り返します。この手順により、同じブロックが2回連続で表れる可能性は減るのですが、2種類のブロックが交互に現れ続けるという現象を避けることはできません。
1989年のテトリスで使用されたプログラムは以下のようになっています。 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; } }
◆テトリス ザ・グランドマスター/アーケード(1998年)
1988年にセガが開発したアーケード版テトリスをベースにした「テトリス ザ・グランドマスター(TGM)」は、1989年に登場した任天堂のテトリスと比べて履歴をチェックする機能が進化しています。
1989年のテトリスは履歴を1つだけチェックしていましたが、TGMは履歴を4つチェックします。つまり、同じブロックを出現させるには少なくとも4回ブロックをやり過ごさないといけないということ。このプログラムにより、同じブロックが連続で現れる可能性は低くなりました。しかし、まだまだ全てのブロックをバランスよく出せるプログラムというにはほど遠いものだったとラロッシュ氏は語っています。
TGMで使用されたプログラムは以下のようになっています。
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; } }
◆テトリスワールド/ゲームボーイアドバンス(2001年)
「テトリスワールド」は、ゲームボーイアドバンス、ニンテンドーゲームキューブ、Xboxで発売されました。2019年の時点で、テトリスワールドのプログラムは2001年以降に作成されたほとんどのテトリスで採用されるシステムとなっています。
履歴のチェックによるプログラムの改善は、同じブロックの連続を防ぐ効果はありましたが、特定のブロックが出てこないという状況を防ぐには不十分でした。テトリスワールドのプログラムは「bags」と呼ばれるシステムを使用して履歴チェック方式の問題を改善しています。
bagsでは、まずブロックを7種類セットにしたリストのようなものが作成され、リストが空になるまでブロックをランダムに選択します。リストが空になると、新たに7種類セットにしたブロックのリストが作成されるというプロセスが繰り返されます。つまり、7回のブロック出現を1サイクルとして、1サイクル中に出現するブロックは全て違うブロックになるというわけ。
欠点として、ブロック出現の法則が分かりやすいため、次に何のブロックが来るのかをプレイヤーが予測できるようになってしまいました。きちんと法則を理解すれば永遠にテトリスをプレイし続けることも可能で、以下の記事では実際にこの仕様を応用したテクニックが紹介されています。
テトリスを永遠にプレイし続ける方法 - GIGAZINE
By Jared Cherup
テトリスワールドで使用されたプログラムは以下のようになっています。
function* randomGenerator() { let bag = []; while (true) { if (bag.length === 0) { bag = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; bag = shuffle(bag); } yield bag.pop(); } }
◆テトリス ザ・グランドマスター3 -Terror Instinct-/アーケード(2005年)
「テトリス ザ・グランドマスター3 -Terror Instinct-(TGM3)」は、過去のテトリスにはない独特なシステムを取り入れ、テトリスのシステムをさらに進化させました。
履歴チェックやbagsの代わりに、TGM3は「プール」と呼ばれるブロックのグループを使用します。まず7種類のブロック5セット分、合計35個ブロックが入ったプールを作り、その中からランダムでブロックを選んで出現させます。プールの中のブロックが減ったら、プールの中で最も数が少ない種類のブロックを補充します。このシステムは同じブロックの連続や特定のブロックが出現しないという問題を解決し、ブロックの出現を予測するのも難しいため、これまでのシステムにあった欠点を解決する優れたプログラムであると言われています。
TGM3で使用されたプログラムは以下のようになっています。
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; } }
TGM3のプログラムは優れていますが、テトリスワールドのように次のブロックが予測できる仕様でも戦略を練ってテトリスを楽しむことができるため、欠点があるからといってゲームとして優れていないわけではないとラロッシュ氏は語っています。
・関連記事
「技術的負債とはどういうものなのか?」をテトリスに例えるとこうなる - GIGAZINE
世界の大定番ゲーム「テトリス」には不安とストレスを軽減する効果があると判明 - GIGAZINE
「テトリス」32周年、その裏にはライセンスを巡る泥沼劇があった - GIGAZINE
テトリス誕生から30周年、これまでの変化をムービーでまとめるとこんな感じ - GIGAZINE
テトリスを永遠にプレイし続ける方法 - GIGAZINE
・関連コンテンツ