俄罗斯方块随机算法的历史

图片
1985年,Alexey Pajitnov和Vadim Gerasimov发行了《俄罗斯方块》。 这款引人入胜且令人上瘾的游戏要求玩家连接随机出现的棋子。 自那时以来,已经发布了150多种俄罗斯方块的许可版本。 它们在游戏模式,规则和实现上有所不同,它们的玩法略有不同(或非常不同)。 俄罗斯方块随机化程序是一种返回随机选择的形状的函数。 多年来,选择形状的规则不断发展,影响着游戏玩法和机会本身。 这些算法中的某些已被反向工程和记录。 我已经整理了一份我认为很重要的随机化器列表,并将在本文中展示俄罗斯方块的内部结构多年来如何变化。

俄罗斯方块 (大约1985年)


俄罗斯方块的第一个和原始版本具有没有偏见的随机化器。 没有什么影响下一个人物的选择,它只是被选择并显示给玩家。

当使用不带位移的随机数发生器时,会出现以下情况:玩家收到一个数字序列(称为“洪水”,洪水)或没有特定数字的序列(称为“干旱”,干旱)。 我们将看到不同版本的Tetris的设计人员如何尝试稍微解决此问题。

尽管没有偏见的随机化器会给玩家带来最大的谜题复杂性,但它不稳定且会导致无敌的序列(PDF) 。 但是,这在真实游戏中不会发生,因为计算机没有真正的随机数生成器。 伪随机数生成器(PRNG)试图模拟真正的随机性,但不具有可连续生成7万个数字Z的属性。

真正的伪随机性


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

拼图难度:4/5

防洪:0/5

干旱预防:0/5

任天堂Tetris (1989)


四年后,发行了非常流行的NES俄罗斯方块版本。

为了减少数字的泛滥(重复)次数,向随机数添加了历史检查。 这个简单的检查执行以下操作:

  1. 选择一个数字
  2. 检查数字是否与上一个数字匹配,
  3. 如果是这样,则该算法选择了一个新形状,但是只有一次,
  4. 不管结果如何,都将数字分配给玩家。

尽管连续获得一件的可能性降低了,但没有什么阻止游戏发行两件交替的作品。 此外,在此版本中,经常发生超过30位数的干旱。 任何一种丁胺酮都可能发生干旱,但是图I对于本场比赛的得分很重要,而其严重干旱会严重影响最终得分。

记住故事1个深度和1个数字


 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; } } 

拼图难度:5/5

防洪:2/5

干旱预防:0/5

俄罗斯方块:大师 (1998)


尽管与不带偏倚的随机化相比, 俄罗斯方块的Tetris改进了算法,但干旱仍然很频繁。 俄罗斯方块:大师TGM )本质上使用相同的系统,但是历史更长,投掷次数更多。

由于这些值的增加,不仅洪水数量减少了,干旱情况也有所改善。 历史上保存了四个数字,这意味着获得一个很长时间不存在的数字的可能性增加了。 尽管如此,该游戏仍然缺乏严格的规则来防止干旱,而且干旱的发生仍然发生,尽管发生频率比《 俄罗斯方块》中的NES发生频率要低得多。

用4个零分和4个掷球记一个故事


 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; } } 

拼图难度:4/5

防洪:4/5

干旱预防:2/5

俄罗斯方块世界等(2001)



《俄罗斯方块世界》向大众介绍了随机生成器。 在俄罗斯方块世界之后的大多数官方游戏版本中,他现在都是官方的随机分配器 ,直到今天,他一直在使用。

基于历史的随机分配器帮助摆脱了洪水(或至少使洪水最小化),但并未阻止干旱。 在某些条件下,仍然有可能获得致命的数字序列。

随机生成器(Random Generator)通过使用新的“袋子”(bags)系统解决了这些问题。 在该系统中,将图形列表放置在“袋子”中,然后从图形列表中一次又一次地随机抽取图形,直到“袋子”为空。 当它是空的时,碎片返回它并且重复该过程。 随机数生成器有一个大小为7的“袋子”(7个袋子),也就是说,一个“袋子”中装有7个四丁胺。 其他类型的“袋”也是可能的,例如14袋,其中每种类型的四氨基都放置了两片。

由于缺乏“包”的历史记录,在其交界处可能会发生2个数字的洪水和4个数字的“蛇行”( 等)。 也就是说,从某种意义上说,这比传统的NES俄罗斯方块要落后了一步。

这些碎片稳定地从7袋中掉出,这使其更可预测。 很容易理解您所处“包”的哪个部分,以及何时需要您的身材。 由于该随机性生成器的可预测性,因此实际上可以无休止地进行游戏。 总的来说,这是一个非常愚蠢的系统,目前尚不清楚它通常如何成为正式的随机发生器。

7袋


 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/5

防洪:3/5

干旱预防:4/5

俄罗斯方块:大师3-恐怖本能 (2005)


TGM3大大提高了产生随机性的想法。 这是在任何其他版本中都找不到的独特系统。

TGM3代替了书包或故事,而是使用形状库。 最初,每种类型都有5个数字,即总共35个数字。 绘制图形时,它不会从池中移除,而是被干旱最大的图形所取代(长时间未移除)。 逐渐地,池中逐渐充满了这个数字,直到最终将其拔出。 这解决了“袋”系统以及具有历史的系统的问题; 她从两种随机类型中都取得了最佳成绩。

35个数字池,包含6个抛出


 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; } } 

拼图难度:4/5

防洪:4/5

干旱预防:4/5

结论


很难得出任何确定的结果。 对于玩家而言,TGM3随机化器似乎更具可预测性,并且不太复杂。 笨拙的7袋感觉不自然,但可以让您制定许多稳定可行的建筑策略。 诸如Tetris for NES等不友好的随机化器可能会破坏您的游戏,或者更有可能破坏您的游戏心情。

我们是否可以通过使它们看起来更加随机并对干旱和洪水设置严格的限制来改善这些系统? 还是如此严格的限制仅仅是使游戏更具可预测性?

Source: https://habr.com/ru/post/zh-CN466579/


All Articles