用Python玩連連看是什么效果?別霍霍別人了

2020
07
22
今天距2021年162天
這是ITester軟件測試小棧第144次推文

點擊上方藍字“ITester軟件測試小棧“關(guān)注我,每周一、三、五早上?07:30準時推送。
微信公眾號后臺回復“資源”、“測試工具包”領(lǐng)取測試資源。
本文5294字,閱讀約需14分鐘
作者:Laziji
源自:https://laboo.top/2018/11/07/lianliankan/
前言
連連看游戲縱覽全局,掃到能夠相連的相同圖片,就用鼠標去點,先點第一個,再點第二個,隨著“撕拉”一道閃電相連方塊隨即爆炸,爽的不要不要。
Python大法好,Java下這個代碼大概需要2000行左右,而python算上注釋也才300行而已。以下用Python 實現(xiàn)的qq連連看輔助, 僅用于學習, 請在練習模式下使用, 不要拿去傷害玩家們。
基本環(huán)境配置
版本:Python3.6
系統(tǒng):Windows 7
相關(guān)模塊
import?PIL.ImageGrab
import?pyautogui
import?win32api
import?win32gui
import?win32con
import?time
import?random
使用方法
開始游戲后運行就行了, 再次提示,?在練習模式中使用, 否則可能會被其他玩家舉報。

效果圖

代碼實現(xiàn)
游戲重點:
生成成對的圖片元素;
將圖片元素打亂排布;
定義什么才算“相連”(兩張圖片的連線不多于3跟直線,或者說轉(zhuǎn)角不超過2個);
實現(xiàn)“相連”判斷算法;
消除圖片元素并判斷是否消除完畢;
import?PIL.ImageGrab
import?pyautogui
import?win32api
import?win32gui
import?win32con
import?time
import?random
def?color_hash(color):
????value?=?""
????for?i?in?range(5):
????????value?+=?"%d,%d,%d,"?%?(color[0],?color[1],?color[2])
????return?hash(value)
def?image_hash(img):
????value?=?""
????for?i?in?range(5):
????????c?=?img.getpixel((i?*?3,?i?*?3))
????????value?+=?"%d,%d,%d,"?%?(c[0],?c[1],?c[2])
????return?hash(value)
def?game_area_image_to_matrix():
????pos_to_image?=?{}
????for?row?in?range(ROW_NUM):
????????pos_to_image[row]?=?{}
????????for?col?in?range(COL_NUM):
????????????grid_left?=?col?*?grid_width
????????????grid_top?=?row?*?grid_height
????????????grid_right?=?grid_left?+?grid_width
????????????grid_bottom?=?grid_top?+?grid_height
????????????grid_image?=?game_area_image.crop((grid_left,?grid_top,?grid_right,?grid_bottom))
????????????pos_to_image[row][col]?=?grid_image
????pos_to_type_id?=?{}
????image_map?=?{}
????empty_hash?=?color_hash((48,?76,?112))
????for?row?in?range(ROW_NUM):
????????pos_to_type_id[row]?=?{}
????????for?col?in?range(COL_NUM):
????????????this_image?=?pos_to_image[row][col]
????????????this_image_hash?=?image_hash(this_image)
????????????if?this_image_hash?==?empty_hash:
????????????????pos_to_type_id[row][col]?=?0
????????????????continue
????????????image_map.setdefault(this_image_hash,?len(image_map)?+?1)
????????????pos_to_type_id[row][col]?=?image_map.get(this_image_hash)
????return?pos_to_type_id
def?solve_matrix_one_step():
????for?key?in?map:
????????arr?=?map[key]
????????arr_len?=?len(arr)
????????for?index1?in?range(arr_len?-?1):
????????????point1?=?arr[index1]
????????????x1?=?point1[0]
????????????y1?=?point1[1]
????????????for?index2?in?range(index1?+?1,?arr_len):
????????????????point2?=?arr[index2]
????????????????x2?=?point2[0]
????????????????y2?=?point2[1]
????????????????if?verifying_connectivity(x1,?y1,?x2,?y2):
????????????????????arr.remove(point1)
????????????????????arr.remove(point2)
????????????????????matrix[y1][x1]?=?0
????????????????????matrix[y2][x2]?=?0
????????????????????if?arr_len?==?2:
????????????????????????map.pop(key)
????????????????????return?y1,?x1,?y2,?x2
def?verifying_connectivity(x1,?y1,?x2,?y2):
????max_y1?=?y1
????while?max_y1?+?1?and?matrix[max_y1?+?1][x1]?==?0:
????????max_y1?+=?1
????min_y1?=?y1
????while?min_y1?-?1?>=?0?and?matrix[min_y1?-?1][x1]?==?0:
????????min_y1?-=?1
????max_y2?=?y2
????while?max_y2?+?1?and?matrix[max_y2?+?1][x2]?==?0:
????????max_y2?+=?1
????min_y2?=?y2
????while?min_y2?-?1?>=?0?and?matrix[min_y2?-?1][x2]?==?0:
????????min_y2?-=?1
????rg_min_y?=?max(min_y1,?min_y2)
????rg_max_y?=?min(max_y1,?max_y2)
????if?rg_max_y?>=?rg_min_y:
????????for?index_y?in?range(rg_min_y,?rg_max_y?+?1):
????????????min_x?=?min(x1,?x2)
????????????max_x?=?max(x1,?x2)
????????????flag?=?True
????????????for?index_x?in?range(min_x?+?1,?max_x):
????????????????if?matrix[index_y][index_x]?!=?0:
????????????????????flag?=?False
????????????????????break
????????????if?flag:
????????????????return?True
????max_x1?=?x1
????while?max_x1?+?1?and?matrix[y1][max_x1?+?1]?==?0:
????????max_x1?+=?1
????min_x1?=?x1
????while?min_x1?-?1?>=?0?and?matrix[y1][min_x1?-?1]?==?0:
????????min_x1?-=?1
????max_x2?=?x2
????while?max_x2?+?1?and?matrix[y2][max_x2?+?1]?==?0:
????????max_x2?+=?1
????min_x2?=?x2
????while?min_x2?-?1?>=?0?and?matrix[y2][min_x2?-?1]?==?0:
????????min_x2?-=?1
????rg_min_x?=?max(min_x1,?min_x2)
????rg_max_x?=?min(max_x1,?max_x2)
????if?rg_max_x?>=?rg_min_x:
????????for?index_x?in?range(rg_min_x,?rg_max_x?+?1):
????????????min_y?=?min(y1,?y2)
????????????max_y?=?max(y1,?y2)
????????????flag?=?True
????????????for?index_y?in?range(min_y?+?1,?max_y):
????????????????if?matrix[index_y][index_x]?!=?0:
????????????????????flag?=?False
????????????????????break
????????????if?flag:
????????????????return?True
????return?False
def?execute_one_step(one_step):
????from_row,?from_col,?to_row,?to_col?=?one_step
????from_x?=?game_area_left?+?(from_col?+?0.5)?*?grid_width
????from_y?=?game_area_top?+?(from_row?+?0.5)?*?grid_height
????to_x?=?game_area_left?+?(to_col?+?0.5)?*?grid_width
????to_y?=?game_area_top?+?(to_row?+?0.5)?*?grid_height
????pyautogui.moveTo(from_x,?from_y)
????pyautogui.click()
????pyautogui.moveTo(to_x,?to_y)
????pyautogui.click()
if?__name__?==?'__main__':
????COL_NUM?=?19
????ROW_NUM?=?11
????screen_width?=?win32api.GetSystemMetrics(0)
????screen_height?=?win32api.GetSystemMetrics(1)
????hwnd?=?win32gui.FindWindow(win32con.NULL,?'QQ游戲?-?連連看角色版')
????if?hwnd?==?0:
????????exit(-1)
????win32gui.ShowWindow(hwnd,?win32con.SW_RESTORE)
????win32gui.SetForegroundWindow(hwnd)
????window_left,?window_top,?window_right,?window_bottom?=?win32gui.GetWindowRect(hwnd)
????if?min(window_left,?window_top)?0?or?window_right?>?screen_width?or?window_bottom?>?screen_height:
????????exit(-1)
????window_width?=?window_right?-?window_left
????window_height?=?window_bottom?-?window_top
????game_area_left?=?window_left?+?14.0?/?800.0?*?window_width
????game_area_top?=?window_top?+?181.0?/?600.0?*?window_height
????game_area_right?=?window_left?+?603?/?800.0?*?window_width
????game_area_bottom?=?window_top?+?566?/?600.0?*?window_height
????game_area_width?=?game_area_right?-?game_area_left
????game_area_height?=?game_area_bottom?-?game_area_top
????grid_width?=?game_area_width?/?COL_NUM
????grid_height?=?game_area_height?/?ROW_NUM
????game_area_image?=?PIL.ImageGrab.grab((game_area_left,?game_area_top,?game_area_right,?game_area_bottom))
????matrix?=?game_area_image_to_matrix()
????map?=?{}
????for?y?in?range(ROW_NUM):
????????for?x?in?range(COL_NUM):
????????????grid_id?=?matrix[y][x]
????????????if?grid_id?==?0:
????????????????continue
????????????map.setdefault(grid_id,?[])
????????????arr?=?map[grid_id]
????????????arr.append([x,?y])
????pyautogui.PAUSE?=?0
????while?True:
????????one_step?=?solve_matrix_one_step()
????????if?not?one_step:
????????????exit(0)
????????execute_one_step(one_step)
????????time.sleep(random.randint(0,0)/1000)
主要思路就是利用pywin32獲取連連看游戲句柄, 獲取游戲界面的圖片, 對方塊進行切割, 對每個方塊取幾個點的顏色進行比對, 均相同則認為是同一個方塊,然后模擬鼠標去消除, 代碼的最后一行是每次點擊的間隔。
如需獲取Python實現(xiàn)連連看源代碼,請在后臺回復“連連看”即可。


測試交流Q群:727998947

評論
圖片
表情
