日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python如何实现简单DNF脚本

發布時間:2024/8/1 python 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python如何实现简单DNF脚本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 效果
    • 代碼過程
    • 前言
    • 使用環境
    • 實現
      • 鍵盤模擬
      • 圖像分析
        • 屏幕快照
        • 相對位置移動

效果


GIF大小限制沒錄太多,過程中加入了操作延遲*2來保障穩定
(判斷速度過快會導致當前位置判斷出錯導致走過頭,細節沒有去做判斷,就直接雙倍延遲處理了)

代碼過程

1.每隔0.1-0.2秒獲取一次窗口句柄截圖 掃描后得到人物坐標X1,Y1及左上角開始的第一個物品的坐標X2,Y2;
優先級(錢>道具>裝備)
2.判斷坐標差計算出大致按鍵時間
1)if(兩者距離像素>5) 跳轉回第一步繼續獲取坐標
2)if(兩者距離像素>5) 跳轉至第三步
3.執行模擬按鍵X進行道具拾取,如果數據還存在,則偏移量-1或者+1重新進行2(此步驟是防止某些物品的名稱過長)

P:如果是要做自動打怪的腳本的話,可以先對怪進行貼圖處理,然后獲取人與怪的坐標,對每個技能維護一個按鍵->(范圍x,范圍y,冷卻時間)的key->map對象
判斷怪在范圍內就按技能打怪,沒怪就執行撿道具,沒道具就執行過圖

emmmm,應該可以實現全自動…吧?

此處就不多做討論了哈,這個只是一時興起,以游戲為例實現這一類的思路。

前言

在此聲明,本博客僅作學習交流使用,不可用于任何商業途徑與任何違法途徑。如有侵權,請聯系刪除。
本博客只是從一個實現思路聊聊,而不會整體的貼代碼,所以想要完整腳本的請右轉,想要不勞而獲的請右轉,想要借此謀利的請右轉,不要浪費您寶貴的時間在我無聊的博客上面。

從小到大我就很喜歡玩游戲,所以閑下來也就想能不能用編程來做一點輔助程序?于是就網上一點點摸索資料去一步步實現。
做這樣一個簡單的Demo腳本只是因為生起了一點點興趣,想通過編程切切實實地做一些有幫助的東西,順便也能增長一些技術,興趣使人進步。

使用環境

語言:Python
用到的包:PIL、Win32、WinIO
環境:WinIO只能模擬PS/2鍵盤,就是最早的那種圓口接口的鍵盤,筆記本一般是PS/2,臺式外接的我看過了我自己的電腦沒有PS/2的接口所以做不了。

實現

鍵盤模擬

第一層想到的要能到操作游戲的層面肯定是要模擬鼠標鍵盤的輸入了。一開始用java調用JNA來使用一些winapi來進行模擬,在游戲外能完美實現鍵盤的操作,但是游戲內部通常采用了一些機制來防止這些虛擬按鍵的生效,于是在查閱了許多資料后找到了WinIO的方式來進行驅動級的按鍵模擬。

一開始用java模擬WinIO并不順利,java在腳本以及一些底層方法的調用上總是存在問題,比如Use32獲取句柄能獲取到一般的窗口但是獲取不到DNF的界面句柄,又比如在使用WinIO的API時鍵盤模擬總是會丟失或者延遲,百度查詢未果,可能是緩存數據丟失或者沖突。
重復輸入abcdefg結果如下

abcdefg abcdef abcefg aefg abcdefg abcdf abcdefg acde abcdeg acdefg

棄用Java轉用Python后句柄能正常獲取并且鍵盤模擬沒有出現過任何丟失情況,Python中的包為rabird.winio可查閱資料。
WinIO驅動級模擬是給驅動發送指令,主要是兩個端口,
KBC_KEY_CMD=0x64命令端口
KBC_KEY_DATA=0x60數據端口
完整的按鍵模擬方法包引用自網絡,以下為發送鍵盤按下的一段。

def key_down(scancode):winio = __get_winio()wait_for_buffer_empty();winio.set_port_byte(KBC_KEY_CMD, 0xd2);wait_for_buffer_empty();winio.set_port_byte(KBC_KEY_DATA, getScanCode(scancode))

scancode為鍵盤掃描碼。
參考自

https://blog.csdn.net/qq_37232329/article/details/79926440

圖像分析

當成功通過程序完成鍵盤模擬后我就知道我可以用編程來實現一些簡單的東西了,那如果要實現它的自動化就需要獲取一些數據進行分析,比如人物和怪物的坐標位置,掉落道具的坐標位置,最直觀的方式當然是讀取內存獲取,我也沒傻乎乎的去讀一個游戲的內存獲取修改免得封號,不如采取一些取巧的方式比如說大圖找小圖?

查閱了大量的資料,通過相似度等方式比較兩張大小像素都不相同的圖片似乎都不可取,我又想到了能不能通過文字識別的方式,把人物的貼圖換成一個字,以識別字的方式來讀取文字的坐標,當真正做了之后發現,雪崩般的效率加馬賽克般的識別率!

于是手寫了一個大圖中找小圖的Demo,其實就是強行比較像素點,當找到小圖左上角第一個相同的像素點時進行一輪四個角的比較,再取中間N個隨機點進行比較,如果匹配度有90以上則記錄坐標,簡單的測試了一下發現效率還可以,從屏幕快照中尋找一個小截圖,成功率基本是100%并且時間也只耗費0.5秒就能記錄下坐標。

關鍵性的問題馬上就出現了,DNF的圖像,只要你一動,圖片肉眼看上去長的是一樣的,但是!!!!他的內部像素點就出現了一些波動,比如同樣是金色,但是RGB在某一個范圍內都是金色…大圖找小圖來定位坐標的想法破滅。

于是直接就改用了大圖找某一像素的方式,一張圖內如果出現某一個像素就直接定位該坐標,而這個像素,可以通過補丁插件強行用畫圖軟件點一個點上去,圖像分析是可以定位出像素點的。

屏幕快照

于是制約效率的方式馬上就暴露在了屏幕快照上,如果你電腦3秒鐘截圖一次,那還做什么個腳本呢?正巧Python有一個window的API能在0.2秒左右完成界面的截圖,而我需要的只是DNF的界面,這個時間就壓縮到了0.05-0.1秒。
快速截圖方式如下

def window_capture(filename):hwnd = win32gui.FindWindow(None, "地下城與勇士")# 根據窗口句柄獲取窗口的設備上下文DC(Divice Context)hwndDC = win32gui.GetWindowDC(hwnd)win32gui.SetForegroundWindow(hwnd)# 根據窗口的DC獲取mfcDCmfcDC = win32ui.CreateDCFromHandle(hwndDC)# mfcDC創建可兼容的DCsaveDC = mfcDC.CreateCompatibleDC()# 創建bigmap準備保存圖片saveBitMap = win32ui.CreateBitmap()# 獲取監控器信息left, top, right, bottom = win32gui.GetWindowRect(hwnd)width = right - leftheight = bottom - top# MoniterDev = win32api.EnumDisplayMonitors(None, None)# w = MoniterDev[0][2][2]# h = MoniterDev[0][2][3]# print w,h   #圖片大小# 為bitmap開辟空間saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)# 高度saveDC,將截圖保存到saveBitmap中saveDC.SelectObject(saveBitMap)# 截取從左上角(0,0)長寬為(w,h)的圖片saveDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY)saveBitMap.SaveBitmapFile(saveDC, filename)return width, height

在0.05-0.1秒內獲取到圖片后就可以通過圖片分析找到像素并定位直接返回,也不需要對整張圖片的像素進行分析,于是坐標獲取就是0.2秒一次

相對位置移動

按這種獲取坐標的方式效率,完全可以采取循環來一直獲取坐標
根據獲取到的人物位置與相對位置來進行按鍵模擬并執行打怪或拾取的動作,直到地圖上沒有怪物及道具的坐標循環結束,過多的代碼我就不貼了,完結。

總結

以上是生活随笔為你收集整理的Python如何实现简单DNF脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。