亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

厲害了,用Python實(shí)現(xiàn)自動(dòng)掃雷

系統(tǒng) 1836 0

來(lái)源: chestnut-egg??

鏈接: https://www.cnblogs.com/chestnut-egg/p/9302238.html

厲害了,用Python實(shí)現(xiàn)自動(dòng)掃雷_第1張圖片

自動(dòng)掃雷一般分為兩種,一種是讀取內(nèi)存數(shù)據(jù),而另一種是通過(guò)分析圖片獲得數(shù)據(jù),并通過(guò)模擬鼠標(biāo)操作,這里我用的是第二種方式。

代碼已上傳至GitHub

一、準(zhǔn)備工作

1.掃雷游戲

我是win10,沒(méi)有默認(rèn)的掃雷,所以去掃雷網(wǎng)下載

http://www.saolei.net/BBS/

2.python 3

我的版本是 python 3.6.1

3.python的第三方庫(kù)

我給出我的第三方庫(kù)和版本僅供參考

二、關(guān)鍵代碼組成

1.找到游戲窗口與坐標(biāo)

              
                #掃雷游戲窗口
class_name?=?"TMain"
title_name?=?"Minesweeper?Arbiter?"
hwnd?=?win32gui.FindWindow(class_name,?title_name)

#窗口坐標(biāo)
left?=?0
top?=?0
right?=?0
bottom?=?0

if?hwnd:
????print("找到窗口")
????left,?top,?right,?bottom?=?win32gui.GetWindowRect(hwnd)
????#win32gui.SetForegroundWindow(hwnd)
????print("窗口坐標(biāo):")
????print(str(left)+'?'+str(right)+'?'+str(top)+'?'+str(bottom))
else:
????print("未找到窗口")

              
            

2.鎖定并抓取雷區(qū)圖像

              
                #鎖定雷區(qū)坐標(biāo)
#去除周?chē)δ馨粹o以及多余的界面
#具體的像素值是通過(guò)QQ的截圖來(lái)判斷的
left?+=?15
top?+=?101
right?-=?15
bottom?-=?42

#抓取雷區(qū)圖像
rect?=?(left,?top,?right,?bottom)
img?=?ImageGrab.grab().crop(rect)

              
            

3.各圖像的RGBA值

              
                #數(shù)字1-8?周?chē)讛?shù)
#0?未被打開(kāi)
#ed?被打開(kāi)?空白
#hongqi?紅旗
#boom?普通雷
#boom_red?踩中的雷
rgba_ed?=?[(225,?(192,?192,?192)),?(31,?(128,?128,?128))]
rgba_hongqi?=?[(54,?(255,?255,?255)),?(17,?(255,?0,?0)),?(109,?(192,?192,?192)),?(54,?(128,?128,?128)),?(22,?(0,?0,?0))]
rgba_0?=?[(54,?(255,?255,?255)),?(148,?(192,?192,?192)),?(54,?(128,?128,?128))]
rgba_1?=?[(185,?(192,?192,?192)),?(31,?(128,?128,?128)),?(40,?(0,?0,?255))]
rgba_2?=?[(160,?(192,?192,?192)),?(31,?(128,?128,?128)),?(65,?(0,?128,?0))]
rgba_3?=?[(62,?(255,?0,?0)),?(163,?(192,?192,?192)),?(31,?(128,?128,?128))]
rgba_4?=?[(169,?(192,?192,?192)),?(31,?(128,?128,?128)),?(56,?(0,?0,?128))]
rgba_5?=?[(70,?(128,?0,?0)),?(155,?(192,?192,?192)),?(31,?(128,?128,?128))]
rgba_6?=?[(153,?(192,?192,?192)),?(31,?(128,?128,?128)),?(72,?(0,?128,?128))]
rgba_8?=?[(149,?(192,?192,?192)),?(107,?(128,?128,?128))]
rgba_boom?=?[(4,?(255,?255,?255)),?(144,?(192,?192,?192)),?(31,?(128,?128,?128)),?(77,?(0,?0,?0))]
rgba_boom_red?=?[(4,?(255,?255,?255)),?(144,?(255,?0,?0)),?(31,?(128,?128,?128)),?(77,?(0,?0,?0))]

              
            

4.掃描雷區(qū)圖像保存至一個(gè)二維數(shù)組map

              
                #掃描雷區(qū)圖像
def?showmap():
????img?=?ImageGrab.grab().crop(rect)
????for?y?in?range(blocks_y):
????????for?x?in?range(blocks_x):
????????????this_image?=?img.crop((x?*?block_width,?y?*?block_height,?(x?+?1)?*?block_width,?(y?+?1)?*?block_height))
????????????if?this_image.getcolors()?==?rgba_0:
????????????????map[y][x]?=?0
????????????elif?this_image.getcolors()?==?rgba_1:
????????????????map[y][x]?=?1
????????????elif?this_image.getcolors()?==?rgba_2:
????????????????map[y][x]?=?2
????????????elif?this_image.getcolors()?==?rgba_3:
????????????????map[y][x]?=?3
????????????elif?this_image.getcolors()?==?rgba_4:
????????????????map[y][x]?=?4
????????????elif?this_image.getcolors()?==?rgba_5:
????????????????map[y][x]?=?5
????????????elif?this_image.getcolors()?==?rgba_6:
????????????????map[y][x]?=?6
????????????elif?this_image.getcolors()?==?rgba_8:
????????????????map[y][x]?=?8
????????????elif?this_image.getcolors()?==?rgba_ed:
????????????????map[y][x]?=?-1
????????????elif?this_image.getcolors()?==?rgba_hongqi:
????????????????map[y][x]?=?-4
????????????elif?this_image.getcolors()?==?rgba_boom?or?this_image.getcolors()?==?rgba_boom_red:
????????????????global?gameover
????????????????gameover?=?1
????????????????break
????????????????#sys.exit(0)
????????????else:
????????????????print("無(wú)法識(shí)別圖像")
????????????????print("坐標(biāo)")
????????????????print((y,x))
????????????????print("顏色")
????????????????print(this_image.getcolors())
????????????????sys.exit(0)
????#print(map)

              
            

5.掃雷算法

這里我采用的最基礎(chǔ)的算法

1.首先點(diǎn)出一個(gè)點(diǎn)

2.掃描所有數(shù)字,如果周?chē)瞻?插旗==數(shù)字,則空白均有雷,右鍵點(diǎn)擊空白插旗

3.掃描所有數(shù)字,如果周?chē)迤?=數(shù)字,則空白均沒(méi)有雷,左鍵點(diǎn)擊空白

4.循環(huán)2、3,如果沒(méi)有符合條件的,則隨機(jī)點(diǎn)擊一個(gè)白塊

              
                #插旗
def?banner():
????showmap()
????for?y?in?range(blocks_y):
????????for?x?in?range(blocks_x):
????????????if?1?<=?map[y][x]?and?map[y][x]?<=?5:
????????????????boom_number?=?map[y][x]
????????????????block_white?=?0
????????????????block_qi?=?0
????????????????for?yy?in?range(y-1,y+2):
????????????????????for?xx?in?range(x-1,x+2):
????????????????????????if?0?<=?yy?and?0?<=?xx?and?yy?<?blocks_y?and?xx?<?blocks_x:
????????????????????????????if?not?(yy?==?y?and?xx?==?x):if?map[yy][xx]?==?0:
????????????????????????????????????block_white?+=?1
????????????????????????????????elif?map[yy][xx]?==?-4:
????????????????????????????????????block_qi?+=?1if?boom_number?==?block_white?+?block_qi:for?yy?in?range(y?-?1,?y?+?2):
????????????????????????for?xx?in?range(x?-?1,?x?+?2):
????????????????????????????if?0?<=?yy?and?0?<=?xx?and?yy?<?blocks_y?and?xx?<?blocks_x:
????????????????????????????????if?not?(yy?==?y?and?xx?==?x):
????????????????????????????????????if?map[yy][xx]?==?0:
????????????????????????????????????????win32api.SetCursorPos([left+xx*block_width,?top+yy*block_height])
????????????????????????????????????????win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN,?0,?0,?0,?0)
????????????????????????????????????????win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP,?0,?0,?0,?0)
????????????????????????????????????????showmap()

#點(diǎn)擊白塊
def?dig():
????showmap()
????iscluck?=?0
????for?y?in?range(blocks_y):
????????for?x?in?range(blocks_x):
????????????if?1?<=?map[y][x]?and?map[y][x]?<=?5:
????????????????boom_number?=?map[y][x]
????????????????block_white?=?0
????????????????block_qi?=?0
????????????????for?yy?in?range(y?-?1,?y?+?2):
????????????????????for?xx?in?range(x?-?1,?x?+?2):
????????????????????????if?0?<=?yy?and?0?<=?xx?and?yy?<?blocks_y?and?xx?<?blocks_x:
????????????????????????????if?not?(yy?==?y?and?xx?==?x):
????????????????????????????????if?map[yy][xx]?==?0:
????????????????????????????????????block_white?+=?1
????????????????????????????????elif?map[yy][xx]?==?-4:
????????????????????????????????????block_qi?+=?1if?boom_number?==?block_qi?and?block_white?>?0:for?yy?in?range(y?-?1,?y?+?2):
????????????????????????for?xx?in?range(x?-?1,?x?+?2):
????????????????????????????if?0?<=?yy?and?0?<=?xx?and?yy?<?blocks_y?and?xx?<?blocks_x:
????????????????????????????????if?not(yy?==?y?and?xx?==?x):
????????????????????????????????????if?map[yy][xx]?==?0:
????????????????????????????????????????win32api.SetCursorPos([left?+?xx?*?block_width,?top?+?yy?*?block_height])
????????????????????????????????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)
????????????????????????????????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)
????????????????????????????????????????iscluck?=?1
????if?iscluck?==?0:
????????luck()

#隨機(jī)點(diǎn)擊
def?luck():
????fl?=?1
????while(fl):
????????random_x?=?random.randint(0,?blocks_x?-?1)
????????random_y?=?random.randint(0,?blocks_y?-?1)
????????if(map[random_y][random_x]?==?0):
????????????win32api.SetCursorPos([left?+?random_x?*?block_width,?top?+?random_y?*?block_height])
????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)
????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)
????????????fl?=?0

def?gogo():
????win32api.SetCursorPos([left,?top])
????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)
????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)
????showmap()
????global?gameover
????while(1):
????????if(gameover?==?0):
????????????banner()
????????????banner()
????????????dig()
????????else:
????????????gameover?=?0
????????????win32api.keybd_event(113,?0,?0,?0)
????????????win32api.SetCursorPos([left,?top])
????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)
????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)
????????????showmap()

              
            

這個(gè)算法在初級(jí)和中級(jí)通過(guò)率都不錯(cuò),但是在高級(jí)成功率慘不忍睹,主要是沒(méi)有考慮邏輯組合以及白塊是雷的概率問(wèn)題,可以對(duì)這兩個(gè)點(diǎn)進(jìn)行改進(jìn),提高成功率。

歡迎加入免費(fèi)星球,獲取最前沿認(rèn)知和精英理念

厲害了,用Python實(shí)現(xiàn)自動(dòng)掃雷_第2張圖片

掃碼領(lǐng)取資料

厲害了,用Python實(shí)現(xiàn)自動(dòng)掃雷_第3張圖片


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 综合视频网 | 在线看片a | 爽爽影院免费观看视频 | 国产高清视频在线免费观看 | 加勒比精品久久一区二区三区 | 日韩99精品| 成人综合婷婷国产精品久久免费 | 日欧毛片 | 波多野结衣中文字幕一区二区 | 九九视频网站 | 九九精品影院 | 久青草国产手机视频免费观看 | 国产天堂 | 视频一区二区三区在线 | 夜夜欢视频| 久久99精品久久久久久青青日本 | 我不卡老子影院午夜伦我不卡四虎 | 色综合中文字幕天天在线 | 一级毛片免费在线播放 | 亚洲国产大片 | 日本一区二区三区高清在线观看 | 色天天综合久久久久综合片 | 亚州精品一区二区三区 | 国产精品久久国产精麻豆99网站 | 久久久国产乱子伦精品 | 国产剧情自拍 | 亚洲精品国产福利 | 久久综合精品国产一区二区三区无 | 国产成人精品2021欧美日韩 | 亚洲精品mv在线观看 | 国产操女人| 亚洲欧美日韩在线一区 | 我想看一级播放片一级的 | 中文国产成人精品久久无广告 | 欧美一级毛片免费看视频 | 丁香色婷婷| 亚洲欧美日韩综合在线 | 不卡一级aaa全黄毛片 | 久久精品视频6 | 欧美一级毛片一免费 | 免费的涩涩视频在线播放 |