如何讓AI教機器自己玩俄羅斯方塊?
作者 | Ahab
轉載自公眾號Ahab雜貨鋪(ID:PythonLearningCamp)
人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太 LOW,為什麼不對遊戲升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後,我用了兩天時間去搜集了大量資料,在電腦當機好多次之後終於將 AI 俄羅斯方塊實現了。
程式介紹
所謂讓機器自己去玩俄羅斯方塊,就是讓機器計算當前方塊的所有形態可放置的所有位置,然後根據統一的評價標準,計算出最優的位置進行放置。這個評價的標準簡單的來說就是:板塊放置的位置越靠下越好,方塊之間越緊密越好,自身對消除行的方塊貢獻數量越多越好,但是這裡還要注意的是不可為了追求消除行數,而去造成過多的空洞,這樣也是不合理的。
關於 AI 演算法主要有兩種:一種是經典的 Pierre Dellacherie 演算法,一種基於基於深度搜尋的演算法。深度搜尋需要優化的地方很多,假如計算的層數不夠、沒有高效剪枝,一不小心容易寫成人工智障,時間複雜度也不好。Pierre Dellacherie 演算法更加清晰,複雜度更低。但是該演算法只考慮當前,不對未來的情況進行計算,注重的是“不死性”,追求方塊的“密集”,有時就算可以一次性消除 3 行,卻會使全域性方塊更加“疏”,即過多的空洞。
程式碼由 Tetris.py、AI.py 和 Utils.py 三部分組成,遊戲的主要邏輯由 Tetis 控制,Utils 定義了方塊的樣式,AI 顧名思義實現了主要的 AI 演算法。
具體介紹
Pierre Dellacherie 演算法
只考慮當前方塊,不對未來的情況進行計算,注重的是“不死性”,演算法每次生成一個方塊,便窮舉該方塊所有旋轉的落點。一種方塊最多有 4 種旋轉,並且由於遊戲介面是 10*20 的,所以對於每個旋轉形狀,只需要考慮 10 種落點。演算法的核心是一個評估函式,對窮舉出的每一種下落情況,計算 6 個引數值,用評估函式加權求和得到一個值,該值最大的情況便是目前方塊的最優下落位置,六個引數分別是:
1. 下落高度(Landing Height)
當前方塊落下去之後,方塊中點距底部的方格數(事實上,不求中點也是可以的)。
2. 消行數(Rows eliminated)
消行層數與當前方塊貢獻出的方格數乘積。
3. 行變換(Row Transitions)
從左到右(或者反過來)檢測一行,當該行中某個方格從有方塊到無方塊(或無方塊到有方塊),視為一次變換。遊戲池邊界算作有方塊。行變換從一定程度上反映出一行的平整程度,越平整值越小;
該指標為所有行的變換數之和;
如圖:■ 表示有方塊,□ 表示空格(遊戲池邊界未畫出)
■■□□■■□□■■□□ 變換數為 6
□□□□□■□■□■□■ 變換數為 9
■■■■□□□□□□■■ 變換數為 2
■■■■■■■■■■■■ 變換數為 0
4. 列變換(Column Transitions)
大意同上,列變換從一定程度上反映出一列中空洞的集中程度,空洞越集中值越小。
5. 空洞數(Number of Holes)
6. 井的總和(Well Sums)
井指兩邊皆有方塊的空列。該指標為所有井的深度連加到 1 再求總和。
注意一列中可能有多個井,如圖:
■□□
■□■
■□■
■■■
■□■
■□■
■□■
中間一列為井,深度連加到一的和為 (2+1)+(3+2+1)=9
評估函式如下 (首字母簡寫):
關於方塊形態
這裡對 AI 俄羅斯方塊的形態做一下特別說明,各個方塊都是根據中心點的座標來生成的,以(0,0)為中心點,在 x、y 軸加減 1 則是其他方格的座標,這樣的好處就是隻要確定中心點座標,其他的方格位置就能隨即生成。
看圖就懂:
1# 每種塊包含的四個小方塊相對座標分佈
2 self.shapes_relative_coords = [
3 [[0, 0], [0, 0], [0, 0], [0, 0]],
4 [[0, -1], [0, 0], [0, 1], [0, 2]],
5 [[0, -1], [0, 0], [0, 1], [1, 1]],
6 [[0, -1], [0, 0], [0, 1], [-1, 1]],
7 [[0, -1], [0, 0], [0, 1], [1, 0]],
8 [[0, 0], [0, -1], [1, 0], [1, -1]],
9 [[0, 0], [0, -1], [-1, 0], [1, -1]],
10 [[0, 0], [0, -1], [1, 0], [-1, -1]]
11 ]
基於深度搜尋的方法暫不介紹。
收穫成果
以上,感興趣的同學可通過網盤獲取原始碼:https://pan.baidu.com/s/1gC6sF62Pz5D6rh6eicOZUw,提取碼: k17b。
(本文為AI科技大本營轉載文章,轉載請聯絡原作者)
推薦閱讀:
點選“閱讀原文”,開啟CSDN APP 閱讀更貼心。
相關文章
- 如何讓 Emacs 俄羅斯方塊變得更難Mac
- 自己寫的手機俄羅斯方塊軟體,誰幫忙測試!
- Tetris 俄羅斯方塊遊戲遊戲
- 俄羅斯方塊聯機小遊戲的實現遊戲
- 【Java遊戲】java俄羅斯方塊!Java遊戲
- canvas實現俄羅斯方塊Canvas
- Win32俄羅斯方塊Win32
- 俄羅斯方塊(JS+CSS)JSCSS
- 我的俄羅斯方塊程式
- Flutter Web 實戰 - 俄羅斯方塊FlutterWeb
- java控制檯版本 俄羅斯方塊Java
- 鵬躍俄羅斯方塊遊戲 1.0遊戲
- JavaScript 寫遊戲 : 俄羅斯方塊 (轉)JavaScript遊戲
- 請大家談談‘俄羅斯方塊程式
- JS編寫的俄羅斯方塊 (轉)JS
- 基於Flutter的俄羅斯方塊小遊戲Flutter遊戲
- 使用JavaScript實現一個俄羅斯方塊JavaScript
- 一個俄羅斯方塊的原始碼 (轉)原始碼
- 一個俄羅斯方塊遊戲源程式 (轉)遊戲
- 基於MonoGame重製《俄羅斯方塊》遊戲MonoGAM遊戲
- 讓王老菊也翻車的“俄羅斯方塊”+硬核策略遊戲,手機版終於發售!遊戲
- 我編寫的俄羅斯方塊原始碼,支援單機對戰,可定製方塊數,鍵盤等!!! (轉)原始碼
- 最新《 java實戰開發俄羅斯方塊教程》Java
- c#實現簡單的俄羅斯方塊C#
- Python 實戰開發俄羅斯方塊遊戲Python遊戲
- 如何讓win32對話方塊居中顯示Win32
- wxpython入門第十一步(俄羅斯方塊)Python
- 使用C#和MonoGame開發俄羅斯方塊遊戲C#MonoGAM遊戲
- win32-c語言實現俄羅斯方塊Win32C語言
- 初學者——Java之實現簡易俄羅斯方塊Java
- 一個javascript指令碼寫的俄羅斯方塊 (轉)JavaScript指令碼
- 用Qt設計自己的方塊遊戲QT遊戲
- 用React、Redux、Immutable做俄羅斯方塊 | 掘金技術徵文ReactRedux
- 趣味python程式設計之經典俄羅斯方塊Python程式設計
- 從俄羅斯方塊,邁向強化學習大門強化學習
- Swift實現俄羅斯方塊詳細思路及原始碼Swift原始碼
- 簡單演算法――新俄羅斯方塊 V1.00演算法
- 函數語言程式設計嘗試之俄羅斯方塊函數程式設計