indows的掃雷是Windows系統上的經典游戲,考驗的是手速、邏輯推理、反應力。Windows8之前,掃雷還是掃雷,到了Windows10,Windows引入Windowsstore之后,掃雷游戲實際上變成了掃瓢蟲,游戲規則沒變,只是界面更加炫酷了。另外還加入了其他的模式。可玩性更強。對于老玩家,還是喜歡經典的簡單的玩法,對于將掃雷和關卡相結合的模式不是太感冒。以下我還是以Windows10的掃瓢蟲為例介紹教程。
1、安裝
Windows10默認沒有安裝掃雷,需要我們自己從Windows的應用市場下載,開始-Windowsstore-搜索minesweeper,選擇第一個,點擊獲取,安裝提示操作即可。等到下載并安裝完成。
2、初級教程
掃雷目標:在最短的時間內翻開所有空方塊,避免地雷方塊。翻開所有空方塊為勝,觸發地雷則失敗。
掃雷玩法:方塊內的數字代表了該方塊周圍的地雷數量。使用該信息可以推斷臨近方塊哪些是可以翻開的安全方塊,哪些是雷。
計數器顯示未標記仍隱藏的地雷數量,定時器顯示掃雷的用時。
基本操作:左鍵單擊——翻轉方塊
右鍵單擊——標記旗子
右鍵雙擊——標記問好
左鍵雙擊、中鍵單擊、左右鍵同時單擊——批量翻轉
形式一:數字1 在對角位,數字1對應的方塊肯定是類,右擊標記小旗子。
形式二:雙數字1型,因為兩個數字1邊上肯亞有一個雷,所以第三個方塊肯定不是雷,可以放心翻開。
形式三:1-2-1型。1對應的方格肯定是雷,2 對應的不是雷。因為數字2旁邊三塊方塊的雷的分布只能是雷雷空、空雷雷、雷空雷,其中只有雷空雷滿足數字1旁邊一顆雷的要求。
形式四:形如下,可以很容易推導出數字邊上的肯定都是雷
熟悉了以上的幾種形式并結合游戲的規則,合理進行邏輯推導,就可以解決百分之九十九的初級(簡單)和中級(中等)掃雷問題了。
3、高級教程
如下面的盤局,基本無雷可掃,如何突破?
我們注意到如下的這塊數字區域,數字3右邊三塊方塊有兩顆雷,數字2右邊有一顆。數字3右邊從上至下雷的分布只有為雷雷空或者雷空雷時,才能既滿足數字3又滿足數字2,所以數字3右側最上方的肯定是雷,而數字2右側最下方的不是雷。這里突破之后,就可以推出其他的了。
4、終極奧義:如下圖,基本能掃的雷都出來了就剩下了5個雷了,分布在所示區域內,其中1號為肯定不是雷,是數字5。其他的5顆雷的分布又多種形式且均能滿足要求,
或者如下圖,一開始就懵逼,
這個時候該怎么辦呢?這個時候就需要拿出掃雷的終極奧義進行破解了。
終極奧義
軟紙牌(Microsoft Solitaire)是一款數字版紙牌游戲,自 1990 年發布 3.0 版以來,幾乎每個 Windows 版本都包含了這款游戲。然而,微軟在 1990 年推出的另一款休閑游戲,雖然不在 Windows 系統內,卻同樣大受歡迎。
我們說的是"微軟掃雷",大多數人都簡稱它為"掃雷"。這款游戲玩法簡單,但也像大多數優秀的、令人上癮的電子游戲一樣很難掌握。游戲的玩法簡單到極致。你可以在游戲界面中看到由按鈕組成的方格矩陣,有的方格里有地雷。游戲的目的是點擊每一個沒有地雷的方格,有些點開的方格上有數字,顯示該方格附近有多少地雷。
GameSetWatch 稱,雖然在 1998 年之前發布的一些簡單的游戲在玩法上與掃雷相似,但微軟公司的羅伯特-多納和科特-約翰遜兩人的作品才是我們今天所熟知和喜愛的游戲。約翰遜曾說,他和唐納在設計掃雷游戲時受到了另一款游戲的啟發,但他聲稱自己已經忘記了那款游戲到底是什么。
"掃雷"游戲簡單的設計,加上利用邏輯推理來避免觸雷,都是最完美的消磨時間的游戲。1990 年,這款游戲被收錄到《Microsoft Entertainment Pack 1》的游戲軟件合集中,其中還包括微軟Windows版的俄羅斯方塊。不過,直到 1992 年,微軟在每份 Windows 3.1 版本中都加入了掃雷游戲,這款游戲才在 PC 用戶中大受歡迎。
據 Business Insider 報道,微軟聯合創始人、時任首席執行官的比爾-蓋茨很快就迷上了掃雷游戲。微軟產品經理布魯斯-瑞安(Bruce Ryan)說,蓋茨甚至曾從自己的電腦上卸載過這款游戲,因為玩這款游戲占用了他太多的時間。
瑞安說,有一次,他的團隊為掃雷游戲創建了一個宏,點擊游戲網格的一個角,然后重新加載游戲。這個宏一直這樣做,直到找到一種只需點擊一下就能解決游戲的方法。
據報道,瑞安隨后給蓋茨發了一封電子郵件,稱"對不起,你被一個宏打敗了"。蓋茨回信說:"當機器做事情的速度比人還快的時候,我們還能保留人類的尊嚴嗎?我們不禁要問,隨著人工智能的崛起,他是否還這樣認為。"
隨著掃雷游戲在 Windows 3.1 中的加入,以及其他幾個 Windows 版本的發布,這款游戲繼續大受歡迎。這款游戲也因其名稱而引發了一些爭議。據 The Cutting Room Floor 報道,1999 年,意大利的一個團體聚集在一起抗議這款游戲,認為它冒犯了真正的雷區受害者。微軟為意大利版的 Windows 2000、Me 和 XP 重新命名了"Flower Fields"(花田)游戲,現在人們揭開的不再是地雷,而是鮮花。
在為 Windows Vista 發布的掃雷版本中,微軟決定將游戲的開發工作交給第三方團隊 Oberon Media。Windows 8 是第一個沒有捆綁掃雷游戲的操作系統版本。取而代之的是作為一個可下載的應用程序的免費版掃雷游戲,一直沿用至今。它不僅包括"經典"游戲,還包括一個以故事為主題的"冒險模式"以及其他功能,不幸的是,還有一些廣告,除非你付費消除它們。
也許有一天,微軟會在未來的 Windows 版本中重新加入沒有廣告的經典版掃雷和紙牌游戲。
我是win10,沒有默認的掃雷,所以去掃雷網下載
http://www.saolei.net/BBS/
我的版本是 python 3.6.1
win32api,win32gui,win32con,Pillow,numpy,opencv
可通過 pip install --upgrade SomePackage 來進行安裝
注意:有的版本是下載pywin32,但是有的要把pywin32升級到最高并自動下載了pypiwin32,具體情況每個python版本可能都略有不同
我給出我的第三方庫和版本僅供參考
#掃雷游戲窗口
class_name="TMain"
title_name="Minesweeper Arbiter "
hwnd=win32gui.FindWindow(class_name, title_name)
#窗口坐標
left=0
top=0
right=0
bottom=0
if hwnd:
print("找到窗口")
left, top, right, bottom=win32gui.GetWindowRect(hwnd)
#win32gui.SetForegroundWindow(hwnd)
print("窗口坐標:")
print(str(left)+' '+str(right)+' '+str(top)+' '+str(bottom))
else:
print("未找到窗口")
#鎖定雷區坐標
#去除周圍功能按鈕以及多余的界面
#具體的像素值是通過QQ的截圖來判斷的
#更多Python視頻、源碼、資料加群857662006免費獲取
left +=15
top +=101
right -=15
bottom -=42
#抓取雷區圖像
rect=(left, top, right, bottom)
img=ImageGrab.grab().crop(rect)
#數字1-8 周圍雷數
#0 未被打開
#ed 被打開 空白
#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))]
#掃描雷區圖像
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("無法識別圖像")
print("坐標")
print((y,x))
print("顏色")
print(this_image.getcolors())
sys.exit(0)
#print(map)
這里我采用的最基礎的算法
1.首先點出一個點
2.掃描所有數字,如果周圍空白+插旗==數字,則空白均有雷,右鍵點擊空白插旗
3.掃描所有數字,如果周圍插旗==數字,則空白均沒有雷,左鍵點擊空白
4.循環2、3,如果沒有符合條件的,則隨機點擊一個白塊
#插旗
#更多Python視頻、源碼、資料加群857662006免費獲取
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()
#點擊白塊
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()
#隨機點擊
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()
這個算法在初級和中級通過率都不錯,但是在高級成功率慘不忍睹,主要是沒有考慮邏輯組合以及白塊是雷的概率問題,可以對這兩個點進行改進,提高成功率