python 图像识别实现四川麻将回放牌面数据
? ? ? ?python?圖像識(shí)別?自動(dòng)獲取麻將APP實(shí)時(shí)牌面數(shù)據(jù)?
? ? ? ? ? ? 前面寫了一篇文章,深度學(xué)習(xí)圖像識(shí)別麻將APP數(shù)據(jù),然后結(jié)合自己的算法實(shí)現(xiàn)自動(dòng)打麻將demo!很多朋友感興趣。最開始做這個(gè)也只是為了研究學(xué)習(xí)圖像識(shí)別這一塊,很多朋友來問算法是怎么實(shí)現(xiàn)的,算法就是一個(gè)最簡(jiǎn)單的快速最大幾率胡牌算法,能實(shí)現(xiàn)簡(jiǎn)單的定缺,下叫胡牌算法。要達(dá)到真正的打贏真實(shí)玩家是幾乎不可能的。我們做這個(gè)也是為了研究學(xué)習(xí),如果你有想靠這個(gè)算法來打贏真實(shí)玩家的朋友就別來咨詢了。我們可以一起來研究技術(shù),算法。
? ? ? ? ? ?最近網(wǎng)上看到一篇文章,微軟已經(jīng)研究出來一套日本麻將,基本上能完全打贏真實(shí)的人類玩家,據(jù)說已經(jīng)達(dá)到95%以上的勝率,如果你對(duì)這個(gè)感興趣可以百度一下。大概看了一下文章的介紹,明白了基本的原理。簡(jiǎn)單來說就是? 先通過大量的高質(zhì)量數(shù)據(jù)來訓(xùn)練一個(gè)深度學(xué)習(xí)的模型。然后在通過強(qiáng)化學(xué)習(xí)來優(yōu)化出牌的算法。這個(gè)確實(shí),因?yàn)锳I在一直不斷的自我學(xué)習(xí),不斷的自我提高。最后才能達(dá)到打贏玩家的情況。微軟這個(gè)是基于日本天鳳平臺(tái)的日本麻將來研究得。因?yàn)樘禅P平臺(tái)的麻將牌局?jǐn)?shù)據(jù)一直都是開源的,需要研究得朋友可以免費(fèi)下載來使用。國(guó)內(nèi)就沒有這個(gè)環(huán)境,你如果要研究一種麻將算法,沒有任何地方可以下載到完整的麻將牌面數(shù)據(jù)。我們知道深度學(xué)習(xí)?前期需要大量的高質(zhì)量麻將數(shù)據(jù)?來訓(xùn)練模型,才能達(dá)到一個(gè)基本和玩家水平持平的模型,然后在加以強(qiáng)化學(xué)習(xí),就能達(dá)到最終的目的。當(dāng)然所有的東西都是?說起來簡(jiǎn)單,做起來很困難。如果真正通過自己的研究,達(dá)到微軟的水平?可能還有很多很多的路要走,大家一起研究,一起學(xué)習(xí)!所有技術(shù)人共勉,大家有什么好的想法?思路可以留言學(xué)習(xí)!
? ? ? ? ?說了這么多廢話,下面我們開始進(jìn)入今天的重點(diǎn),如果通過圖像識(shí)別來抓取?完整的牌面信息。前面有一篇文章,通過那面文章你可以了解?如果圖像識(shí)別來識(shí)別APP里面的牌。
? ? ? ? 現(xiàn)在我們已經(jīng)能夠識(shí)別出來所有的牌,接下來我們只要通過方位來獲取每個(gè)玩家出的牌,然后串聯(lián)起來就是完整的牌局信息。
? ? ? ?我們探討的麻將是基于西南片區(qū)這面比較流行的:四川麻將??
? ? ? 四川麻將規(guī)則:所有玩家缺一門?才能胡牌? 一家胡牌游戲繼續(xù)? 直到有3個(gè)玩家胡牌游戲結(jié)束? 或者牌面上的牌摸完游戲結(jié)束
? ? ? 游戲平臺(tái):基于某貓麻將APP,為了方便識(shí)別,動(dòng)態(tài)修改了某些圖片,只供研究學(xué)習(xí)使用!
? ? ? 游戲玩法:支持換三張或者不換三張游戲。
? ? ? ? 這點(diǎn)我們定義幾個(gè)數(shù)據(jù):
? ? ? ?條----0? ?萬-----1? 筒-------2? ?1條到9條:1---9? ? 1萬到9萬:11-------19? 1筒到9筒:21-------29
? ? ? ? 玩家的座位索引:最下方為0?順時(shí)針旋轉(zhuǎn)?依次為 1 2 3?
? ? ? ?來來來來? 我們開始一步一步來? 首先游戲一開始? 我們肯定是先獲取所有玩家的初始手牌和所有玩家的定缺:
? ? ? ? 初始手牌比較的簡(jiǎn)單? 莊家14張?所有不是莊家的玩家13張
? ? ? ?游戲開始的標(biāo)志,4個(gè)玩家都已經(jīng)定缺完成,牌面上沒有任何一個(gè)玩家出過牌。這個(gè)我們定位游戲開始標(biāo)志,我們可以通過識(shí)別來很好的識(shí)別出來!請(qǐng)看下圖。
首先游戲開始?我們獲取所有玩家的手牌,并獲取當(dāng)前的定缺信息
0 [1, 1, 2, 2, 6, 8, 9, 21, 21, 21, 22, 24, 29] 1
1 [11, 11, 12, 13, 14, 15, 15, 18, 23, 24, 24, 28, 28] 3
2 [4, 5, 6, 11, 11, 14, 14, 14, 15, 15, 16, 17, 23] 2
3 [1, 3, 3, 5, 7, 7, 13, 22, 22, 23, 25, 26, 26, 29] 1
所有玩家的手牌?我們獲取到了?現(xiàn)在游戲真正的開始了!首先由莊家先出牌。
首先我們分別劃分區(qū)域來管理所有玩家的牌面信息!手牌區(qū)域?yàn)槲覀冏钪匾囊粋€(gè)區(qū)域,所有的變化都是通過手牌區(qū)域來區(qū)分的
如何識(shí)別摸牌:上一次牌面信息為別人打牌,并且打出來之后再出牌區(qū)域沒有減少。某一個(gè)手牌區(qū)域多了一張牌,則視為某個(gè)玩家摸牌。3 摸牌 [13]
如何識(shí)別打牌:前一次某個(gè)手牌區(qū)域多了一張牌,下一次掃描發(fā)現(xiàn)少了一張牌,這個(gè)視為某一個(gè)玩家摸牌。0 打牌 [5]
玩家的操作:胡?碰?杠?牌面上都有不同的標(biāo)志來區(qū)分。0 碰 [21,21,21] 21 1
所有的過操作:當(dāng)某一個(gè)玩家摸牌之后,掃描一下上一次打的牌,別人是否能碰,能杠,能胡,有?我們則視為玩家過了這一個(gè)操作。我們用pass來表示。2 pass [13,13] [peng] 3
我們每次掃描牌面發(fā)生的變化,再結(jié)合以上的情況判斷?我們就能識(shí)別出來整個(gè)牌局的流程信息!
最后還有一個(gè)難點(diǎn)就是,108張的問題,當(dāng)初做這個(gè)也廢了很大的功夫!
講講最后的實(shí)現(xiàn)方法。
牌局結(jié)束的標(biāo)志,掃描固定區(qū)域是否有胡標(biāo)志,固定區(qū)域是否有分?jǐn)?shù)的標(biāo)志。如果都滿足我們視為游戲結(jié)束。
因?yàn)樽詈笠粡埮拼虺鰜碇?#xff0c;畫面快速跳轉(zhuǎn)到結(jié)算界面,所有通過正常的流程我們不能抓到最后一張的信息。我們只能通過記錄上一次的操作?來區(qū)分。
通過記錄最后一次摸牌玩家的手牌,和最后結(jié)算畫面對(duì)比,我們就知道最后摸牌玩家出的是什么牌。
如果最后摸牌玩家后面有胡的標(biāo)志,則摸牌玩家自摸。
如果摸牌玩家后面沒有胡的標(biāo)志,最后打的牌就是?少的那張牌
?
區(qū)分別人是否胡了最后一張:
前面我們通過胡牌的標(biāo)志,我們能很好的計(jì)算出來那些玩家前面是胡了。
如果前面沒有胡牌的標(biāo)志,最后結(jié)算畫面玩家有胡的標(biāo)志,則視為玩家胡了最后一張,反之則沒有胡。
?
通過我這個(gè)不太清楚的描述?不知道你現(xiàn)在是否清楚了?整個(gè)項(xiàng)目的實(shí)現(xiàn)流程。下面給出最后的視頻呈現(xiàn)!!!!
?
日志文件的部分截圖,完整日志和視頻放在最下方鏈接里面下載!!!!!
戰(zhàn)績(jī)回放demo視頻
下載地址
?如果對(duì)于項(xiàng)目你有什么好的建議,我們一起交流,一起促進(jìn)社會(huì)的進(jìn)步,早日實(shí)現(xiàn)?世界和平!
總結(jié)
以上是生活随笔為你收集整理的python 图像识别实现四川麻将回放牌面数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Lync Online与MSN联系人
- 下一篇: 2021-06-11警告: 多个不同应用