[閒聊] 寶石方塊(Bejeweled Blitz)機器人
: → sitos:倒是很希望可以跟其它有興趣寫 bot 的人交流一下
: 推 sitos:讀盤面進來判斷阿... 然後盡量多連一點? 目前還沒有作搜尋
: → sitos:不過讀點的顏色很容易誤判就是了... 這部份也還沒克服
: → sitos:不過其實判斷還滿複雜的... (為了高分)
: → sfwejfish:你跟我說用啥寫的 我有興趣(咦
: → sfwejfish:完全沒碰過模擬輸入 囧
: 推 sfwejfish:編譯程式的話 GWB QB TC BC VC VB VS2008(MFC) 囧
詢問了一下板主,看來「機器人」應該不算在板規十一這條規定的範圍之內。
▕ 十一、禁止討論惡意程式、作弊方式、BUG ▏
▕ ▏
▕ 禁止詢問、討論、分享或推廣任何竄改封包、修改記憶體或其 ▏
▕ 他足以影響遊戲公平性的惡意程式、作弊方式或 BUG 等資訊 ▏
▕ (含教學、心得、相關圖文、影片、關鍵字、分享或徵求程式 ▏
▕ 、詢問使用方式等,詳細說明請見 #1C2zNPjg。) ▏
▕ ▏
▕ 發文處分:視情況水桶一周以上、原文逕行刪除或劣退。 ▏
▕ 推文處分:視情況水桶一周以上,一行推文視為一案,得連續 ▏
▕ 處分。 ▏
▕ 累犯追加:水桶加倍。 ▏
因為「機器人」的運作原理上,並沒有竄改封包、修改記憶體,
而寶石方塊也不是對抗性的遊戲,所以比較沒有遊戲公平性的問題。
如果這篇文章以下的內容違反板規,請板主提醒,我會把文章刪掉。
進入正題之前,還是先提醒一下,這種靠反應和動作的遊戲,
「機器人」的能力遠勝過人手在玩是一定的。
作機器人並不是要顯示機器人比較厲害(因為這是早就知道的事),
而是想要知道:
1. 某些人手不可能達成的動作,做出來以後會是什麼樣的效果。
2. 遊戲進行的規則,例如倍數方塊出現的條件為何。
3. 在不破解遊戲的情況下,進行遊戲高分的可能性為何。
簡單來講,用手進行遊戲有用手進行的緊張感和樂趣,
而開發機器人,尋找高分的移動演算法,則有另外一番風趣。
各有各的樂趣,如果不喜歡機器人,對機器人沒興趣,請忽略這篇文章。
我的機器人是用 VC 2008 寫的,但我想其它 Windows 下的工具應該也可開發。
而我的對象程式則是用 chrome 開啟的 facebook 中的寶石方塊。
整個程式的流程大致如下:
[找尋寶石方塊程式 FindWindowEx]
v
[取得遊戲畫布 GetDC]
v
[讀取遊戲盤面 GetPixel] <--
|
v |
|
[決定移動] |
|
v |
|
[發出移動指令 SendMessage] --
目前在製作上的兩大困難主要是在「讀取盤面」和「決定移動」上面。
讀取盤面的困難在於 1. 方塊的顏色並不是固定的,例如十字爆炸和小黑,
方塊的顏色是隨時間改變的,因此辨認上較為困難。
2. 會有沒用的訊息出現在盤面中,例如一開始的「GO」,
還有一堆 Good, Excellent ... 以及分數等等
3. 遊戲進行中方塊是會動的,尤其是從上面掉下來的方塊,
A 顏色的方塊在掉的時候可能剛好符合 B 顏色的特徵。
這部份大概可以靠作苦工,慢慢把所有的例外修完,不曉得有沒有更好的辦法。
我有朋友建議我去讀記憶體,不過那有點作弊了,所以我就沒那樣去做。
決定移動的困難,其實主要可以分成兩個部份。
第一,怎樣的移動可以在寶石方塊這個遊戲當中取得高分,這取決於這個遊戲的規則。
先前我發的文章,也多是針對這個問題問的,當然也有一些心得。
我認為這是作機器人的樂趣之一,有興趣的人不妨自己動手調整,看看是否能更高分。
為了幹這件事,我好幾天整個晚上都坐在電腦前看機器人玩寶石方塊,
看到連閉上眼睛跟作夢,都會見到方塊合起來的影像。(有點太過火了)。
第二,怎樣達成前面觀察到的條件。例如是否只依目前盤面作決定,
或者要對可能的組合作最佳化。是不是要引入搜尋的概念等等。
這部份我目前都只有依目前盤面,甚至可以說依目前檢查到的這顆方塊來決定。
所以還有很大的進步空間,不過時間和動力不足,因為分數還沒有被超越。
我把一個簡化版的 source code 放在
http://sitos.myweb.hinet.net/Blitz-Simple.rar
裡面有我上面寫的基本流程的程式碼,基本上寫機器人需要用到的 API ,
裡面都有示範應該要怎麼樣使用。想要嘗試的人,可以用 chrome 開 fb 的寶石方塊,
為了確保它抓得到該視窗,請不要同時用 chrome 開啟其它的網頁,
先進入寶石方塊的開始畫面,然後啟動這個程式,再幫它點開始,它應該就會動了。
這個範例是一個閹割過的版本,不會判斷任何特殊方塊,
所以很容易自己跑一跑卡住,因為這個程式的目的只是讓有興趣的人,
可以以這個程式為基礎來開發自己的機器人。直接用這個程式,
是無法取得很高的分數的,因為幾乎該有的功能都沒有。
目前我的 Bot 在我這邊自己做到第四版,而這個程式是從第一版割出來的。
所以當然... 相當地弱。
最後附上目前我手上有的 replay 裡面最高分的紀錄。
無道具 http://sitos.dyndns.org/Blitz.html
有道具 http://sitos.dyndns.org/Blitz2.html
希望對開發機器人有興趣的人可以以此為起點享受不一樣的樂趣。
如果有人得到更高的分數,煩請分享一下 replay ,這會給我改進 bot 的動力。
也可以讓我觀摩一下不一樣的演算法怎麼樣得到更高的分數。 :)
--
我實實在在的告訴你們,一粒麥子不落在地裡死了,
仍舊是一粒,若是死了,就結出許多子粒來。
約翰福音 12:24
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.248.178.71
→
07/19 21:14, , 1F
07/19 21:14, 1F
→
07/19 21:14, , 2F
07/19 21:14, 2F
→
07/19 21:17, , 3F
07/19 21:17, 3F
→
07/19 21:18, , 4F
07/19 21:18, 4F
推
07/19 22:06, , 5F
07/19 22:06, 5F
推
07/19 22:49, , 6F
07/19 22:49, 6F
→
07/19 22:49, , 7F
07/19 22:49, 7F
→
07/19 22:50, , 8F
07/19 22:50, 8F
是的,這個我最早的版本就試驗過了,不行。
不過我也找到了可以拉在一起的規則。從上面的 replay 應該就看得出來了。 :)
推
07/19 23:47, , 9F
07/19 23:47, 9F
推
07/20 00:04, , 10F
07/20 00:04, 10F
→
07/20 06:37, , 11F
07/20 06:37, 11F
推
07/20 11:40, , 12F
07/20 11:40, 12F
→
07/20 11:40, , 13F
07/20 11:40, 13F
推
07/20 13:04, , 14F
07/20 13:04, 14F
實況先關了,很吃上傳。 :)
※ 編輯: sitos 來自: 60.248.178.71 (07/20 20:16)
推
07/20 20:17, , 15F
07/20 20:17, 15F
推
07/21 20:54, , 16F
07/21 20:54, 16F
推
07/25 16:42, , 17F
07/25 16:42, 17F
→
07/25 16:42, , 18F
07/25 16:42, 18F
→
07/25 16:43, , 19F
07/25 16:43, 19F
→
07/25 16:44, , 20F
07/25 16:44, 20F
→
07/25 16:45, , 21F
07/25 16:45, 21F
→
07/25 16:46, , 22F
07/25 16:46, 22F
→
07/25 16:48, , 23F
07/25 16:48, 23F
→
07/25 16:55, , 24F
07/25 16:55, 24F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 3 篇):