TetrisBattleAI: Make Tetris Great Again!

Ya-Liang Allen Chang
4 min readJan 10, 2019

--

Facebook Tetris Battle

還記得幾年前在Facebook風靡一時的Tetris Battle嗎?

Tetris Battle是一個多人對打俄羅斯方塊的遊戲,透過連續的消行(combo)來擊敗對手,相當吃技術和反應,想當年練留1、留2、留4…應該是不少人的童年回憶(?),我也是沉迷了好一陣子XD

這次就透過AI課程的 final project,就來做可以玩Tetris Battle的AI!!

我們自己刻的Tetris Battle GUI環境

Tetris Battle AI

當初選擇這個題目,其實是因為覺得它好像很好做,稍微搜尋一下就知道之前已經有很多人做過單人版的AI了,甚至有電機系的學長用rule-based的方法做Tetris Battle AI的,直接接到Facebook屌虐一波(可惜沒release code),感覺我們應該可以用DQN輕鬆完成。

原本的目標是放在learning-based的方法,希望能train一個model打敗現在所有的AI,只不過後來發現:

  • 沒有Python Tetris Battle的環境(只有找到C的和1-player的),最後只好自己刻…
  • Baseline在combo的表現其實不好
  • Tetris以Renforcement Learning (RL)來說reward非常sparse,不可能用隨機的方式消到任何一行,要combo就更sparse,極度難train
  • RL是個大坑….

所以最後我們只有做到打敗baseline,combo的表現沒有特別好,learning-based的方法應該還有發展空間。

Methods

我們試了很多方法:

  • Fixed-policy (baseline)
  • Genetic Algorithms (GA)
  • DQN
  • Policy Gradient
  • Actor-critic (AC)

其中baseline跟GA都是我們訂好評估action好壞的標準(落下方塊之後的總高度/空洞數/消行數…),agent每一步都執行分數最高的action,然後玩很多局,學這些標準之間的權重

DQN/Policy Gradient/Actor-critic則都是RL的方法,只給獎勵,讓agent自己去學規則,細節可以參考https://zhuanlan.zhihu.com/p/25239682https://flyyufelix.github.io/2017/10/12/dqn-vs-pg.html

RL的方法在Tetris其實非常難train,我們把每個action直接簡化成落下到最後的位置,train出來的表現還是不如預期,DQN/policy gradient更是直接失敗。最後多加上hold的選擇,才train出1-player不會死的model~

Results

Our GA vs baseline (GUI mode)

這是我們的GA對baseline,可以看出雖然動作很快,但其實效率都不是很好(line sent/cleared大概只有50%),還有很多改進的地方

Our actor-critic vs baseline (terminal mode)

AC對baseline則會把block持續維持在很低的位置,combo的效率更差,但是比較不容易被KO

上面這兩個model大概都只是稍微會玩的程度而已,跟專業玩家還差很多,未來還有很大的發展空間

結語

看電腦自己玩Tetris滿好玩的,但是要實做rule-based或train RL方法都有相當的難度。另外,很想看看加上bomb lines會變成什麼樣子,希望哪天有人能繼續做下去XD

大家也可以自己載來玩玩看~ Let’s make Tetris great again!

GitHub: https://github.com/amjltc295/TetrisBattleAI

--

--