Python操纵网盘客户端批量离线下载小电影,教你用Python轻松制作半即时制手游外挂

by admin on 2019年4月21日

前言

每一次玩半即时制游戏的时候,当断不断的平常职责令人不胜其烦

玩问道的时候,我们愿意可以活动刷道,玩梦幻希望能自行做师门、捉鬼等等

今天小编就用Python教我们做二个有关半即时制游戏的本子,该脚本只好模拟鼠标键盘操作,并不可能改改游戏数量。

作者:`Rest探路者`
源自:`

假如您须要二个理想的读书沟通条件,那么你能够设想Python学习调换群:548377875;

借使你须求一份系统的上学材质,那么你能够设想Python学习沟通群:548377875。

引入:

历次玩半即时制游戏的时候,狐疑不决的平凡职分令人不胜其烦

玩问道的时候,我们希望能够活动刷道,玩梦幻希望能半自动做师门、捉鬼等等

上回(Python实现电影排名榜活动网盘下载(四)Cookies免登陆+抓包下载)提起,壹段时间内能开始展览多少次离线下载或然受限于验证码的输入。
在此有八个减轻方案,

前言

 

说明:

该外挂只可以模拟鼠标键盘操作,并不可能修改游戏数量

自家那边运用的python二.七

开荒工具是PyCharm

  • 见招拆招 通过GUI优化验证码输入
    正是有验证码,在用户平昔输入验证码的动静下也是连忙的。而且能够借此读书Python是什么样做出GUI程序的,学起来也会是很有价值的,参考
    实验楼
    给Python三爬虫做2个分界面
    以往有时机也许会写点类似的实验案例。
  • 选用网盘客户端
    本条化解方案的助益便是从未有过!验!证!码!缺点正是丰硕的速度视能源而定,倘若违法资源较多,恐怕会促成频仍重启;再有实际那便是个按钮脚本,选取模拟鼠标、键盘等操作,以为相比脑残…

自行扫雷一般分为二种,一种是读取内存数据,而另壹种是因此分析图片获得数据,并通过模拟鼠标操作,那里作者用的是第三种艺术。

支出条件准备

Python2.7 + Windows

模块:autopy,可pip install autopy

最初知识计划:

率先下载autopy包,小编那边PyCharm能够一直导入autopy包

或然用利用pip实行安装:pip install autopy

那篇文章记录了自身第三种方法的试验进程,最后测试了多少个磁力链接的丰盛速度,大概是如此的:

一、准备干活

鼠标移动

bf88必发唯一官网 1

 

会意识鼠标弹指间移动到坐标(一,壹)的岗位,小编的微管理器是一9一陆*1080的,最右下角的坐标正是(一九一六,1080)。

Python操纵网盘客户端批量离线下载小电影,教你用Python轻松制作半即时制手游外挂。将move换成smooth_move,会开掘鼠标渐渐地运动到内定坐标

鼠标移动

复制如下代码,运营

#coding=utf-8import time import autopy#quick moveautopy.mouse.move(1,1) #smooth move#autopy.mouse.smooth_move(1370,120)

会发掘鼠标须臾间活动到坐标的职责,笔者的微型Computer是一九一6*1080的,最右下角的坐标就是(一九一6,十80)。

将move换成smooth_move,会意识鼠标慢慢地移动到钦命坐标

官方文书档案的解释:

autopy.mouse.move(x: float, y: float)

Moves the mouse to the given coordinate.

Exceptions:

ValueError is thrown if the point is out of index.

autopy.mouse.smooth_move(x: float, y: float)

Smoothly moves the mouse to the given coordinate in a straight line.

Python操纵网盘客户端批量离线下载小电影,教你用Python轻松制作半即时制手游外挂。Exceptions:

ValueError is thrown if the point is out of index.

坐标当先分辨率会报至极

bf88必发唯一官网 2

一.扫雷游戏

鼠标点击

运维代码,发掘脚下地点发生了点击操作

bf88必发唯一官网 3

 

鼠标点击

运作代码,发掘脚下任务发生了点击操作

#coding=utf-8import autopyautopy.mouse.click() # 单击

演示

本身是win10,没有私下认可的扫雷,所以去扫雷网下载

键盘操作

广大的键值码和键的照拂:

bf88必发唯一官网 4

 

此地供给win3二api包

调用win32api的keybd_event方法,用过要自由开关

bf88必发唯一官网 5

 

能够观察,达成了切换窗口的操作,也就是大家按alt+tab,然后回车进入

键盘操作

上面时部分科学普及的键值码和键的相应:

字母和数字键 数字小键盘的键  效能键    别的键
键 键码 键 键码 键 键码 键 键码
A 65 0 96 F1112 Backspace 8
B 66 1 97 F2113 Tab 9
C 67 2 98 F3114 Clear 12
D 68 3 99 F4115 Enter 13
E 69 4 100 F5 116 Shift 16
F 70 5 101 F6 117 Control 17
G 71 6 102 F7 118 Alt 18
H 72 7 103 F8 119 Caps Lock 20
I 73 8 104 F9 120 Esc 27
J 74 9 105 F10121 Spacebar 32
K 75 * 106 F11 122 Page Up 33
L 76 + 107 F12 123 Page Down 34
M 77 Enter 108 End 35
N 78 – 109 Home 36
O 79 . 110 Left Arrow 37
P 80 / 111 Up Arrow38
Q 81 RightArrow 39
R 82 DownArrow 40
S 83 Insert 45
T 84 Delete 46
U 85 Help 47
V 86 NumLock 144
W87
X88
Y89
Z90
048
149
250
351
4 52
553
654
755
856
9 57

复制代码,运行,那里供给win3二api包

调用win32api的keybd_event方法,用过要释放开关

#coding=utf-8import timeimport win32api win32api.keybd_event(18,0,0,0)  #alt键位码是18win32api.keybd_event(9,0,0,0)  #tab键位码是9time.sleep(0.5)win32api.keybd_event(13,0,0,0)  #enter键位码是13 win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) #释放按键win32api.keybd_event(9,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)time.sleep(2)

能够见见,达成了切换窗口的操作,相当于大家按alt+tab,然后回车进入

bf88必发唯一官网 6

先河创设游戏脚本

此间以问道手机游戏为例(半即时制手机游戏类似)

亟待夜神模拟器,并在模拟器上设置问道

笔者试过蓝叠和MuMu模拟器,作者用autopy移动鼠标到模拟器时鼠标就流失了,无法做到后续的活动操作,后来百度了

说有的模拟器不受win窗口的决定。不管那么多,大家先用夜神模拟器吧!

bf88必发唯一官网 7

 

进去游玩,展开”活动”

bf88必发唯一官网 8

 

大家以”竞赛场”活动比方表达

bf88必发唯一官网 9

 

此处我们要用到截图工具,作者用的是PicPick

个人用户不收费,小编第二用它来度量坐标

bf88必发唯一官网 10

 

笔录下比赛场前往的坐标(135八,50四)

bf88必发唯一官网 11

 

笔录下比赛场开关的坐标(133二,650)

制造回合制脚本首先得要熟习职务流程

下一场点击竞赛场,走完那么些任务流程,依次记录开关的坐标

竞赛场职务一天能够做陆遍,我们对手续循环四次

交火岁月大家需求协和来计时,不一致门派,土豪也许平民游戏者时间都不平等

作者是全体成员游戏者,大致耗费时间60s,点击过挑衅让代码延迟60s再继续试行

bf88必发唯一官网 12

 

开端制作外挂:

那里以问道手游为例

内需夜神模拟器,并在模拟器上安装问道

本人试过蓝叠和MuMu模拟器,笔者用autopy移动鼠标到模拟器时鼠标就流失了,不可能完结后续的机动操作,后来百度了

说有的模拟器不受win窗口的调节。不管那么多,大家先用夜神模拟器吧!

bf88必发唯一官网 13

跻身娱乐,展开“活动”

bf88必发唯一官网 14

我们以“竞赛场”活动例如表明

bf88必发唯一官网 15

此地大家要用到截图工具,笔者用的是PicPick

个人用户免费,笔者首要用它来衡量坐标

bf88必发唯一官网 16

笔录下比赛场前往的坐标

bf88必发唯一官网 17

笔录下比赛场开关的坐标

制作半即时制脚本首先得要熟识职责流程

然后点击竞赛场,走完这么些职责流程,依次记录按键的坐标

竞技场任务一天可以做八遍,我们对手续循环四遍

应战岁月我们必要团结来计时,不一样门派,土豪恐怕平民游戏发烧友时间都不雷同

自身是全体成员游戏用户,差不离耗费时间60s,点击过挑战让代码延迟60s再继续试行

bf88必发唯一官网 18

复制代码,运维

#coding=utf-8import autopyimport timeimport win32apiimport win32con#竞技场win32api.keybd_event(18,0,0,0)  #alt键位码是18win32api.keybd_event(9,0,0,0)  #tab键位码是9time.sleep(0.5)win32api.keybd_event(13,0,0,0)  #enter键位码是13 win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) #释放按键win32api.keybd_event(9,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)time.sleep(2) def mousemove_click:    autopy.mouse.smooth_move    autopy.mouse.click() mousemove_click(771, 203)  # 活动的坐标 mousemove_click(1358,504)  # 竞技场"前往"的坐标 time.sleep(20)#从天墉城城中心/其他地图走到竞技使者花费20s mousemove_click(1334, 650)  # 竞技使者对话框中的竞技场的坐标  #挑战完毕会出现对话窗口for i in range(1,6,1):    mousemove_click(664,706) #挑战试炼童子     mousemove_click(1082,578) #确认     mousemove_click(1530, 794)  # 战斗自动     time.sleep(60)#挑战试炼童子预计60s

进程大约是每分钟十个,要是再慢的话从速度上可能率先种方案会是相比较好的接纳。

bf88必发唯一官网 19

代码

bf88必发唯一官网 20

 

功能如下:

bf88必发唯一官网 21

下1集将介绍怎样落到实处队长方式刷道(自动组成代表队,自动跑环接任务)

Pywinauto

先看看简单介绍吧。pywinauto is a set of python modules to automate the
Microsoft Windows GUI. At it’s simplest it allows you to send mouse
and keyboard actions
bf88必发唯一官网, to windows dialogs and controls.
嗯,是个Windows的自动化操作工具。
帮助文书档案
要点八个开关,首先要理解怎么找这几个按键吧?在此间他的2个演示是关于记事本的,学习了一下,大约是因而窗口类名标题来找的部件,谈起这里就要用到Spy++(只怕Spy++Lite)

bf88必发唯一官网 22

百度网盘的演示

就这么拖一下就搜索来了。
嘿嘿,初次用这些Pywinauto感觉还挺厉害的,不过作者把她用到网盘上的时候…小编就蒙蔽了-
-,那个离线下载的开关在Spy++Lite中找不到,换了别的各样找元件的工具都查不出来,Pywinauto输出这几个主窗口包含的部件也不论用。互连网查了一晃那是干什么,大概是以此开关他丫的就不是个职业的按键!那该咋办呢?

2.python 3

有关按键的魔难

那壹段着实是瞎折腾,最初的主张并未中标,最终选拔了鼠标模拟,发上来给大家参考参考吧,大家有指正或许好的改正措施快来告诉自个儿啊~(故而大致那段能够跳过了?(划掉)
英特网看看别的一个方案——窗口收到了怎么音讯,就模仿怎么着新闻;收到了鼠标按下按钮那些消息,就仿照这一个音信。
于是又在Spy++里面瞎折腾,先展开百度云主窗口,然后在Spy++里面著录它接受的新闻,找到了如此一条

bf88必发唯一官网 23

找到了按下离线下载之后的窗口的句柄

bf88必发唯一官网 24

就是其1音信用到了作者们要求的句柄

离线下载这几个开关的意义就是激活这几个新建的窗口,这咱们获得那个句柄(也正是窗口的身份)来激活,不就不要管那几个按键了吗?然则本条句柄是何等爆发的啊?它毕竟是在按下按键的一弹指发生的,依旧在按下此前就存的有呢?在Spy++中从按下鼠标之后收获到的音讯并从未回到这么些句柄,呵呵,作者就天真地暂定它是事先就存的有吗。固然你存的有,那又该怎么找呢?嘿嘿,笔者想开了CheatEngine来搜求。

bf88必发唯一官网 25

新建离线下载窗口的句柄

哇,那不是有规律嘛!第陆位每一次+一!
可是当下作者又被打脸了…开个其余窗口再来开它,嗯……(手动再见)

bf88必发唯一官网 26

好吧…笔者低头了…就根据按钮脚本来写吧…

本人的版本是 python 三.陆.1

后台鼠标音信

好了,未来始于试着写按钮脚本…大概主见正是获得主窗口的句柄,用坐标的法子得到按键的地方,然后模拟点击。这里大概用开关Smart的抓抓会相比较便宜。

bf88必发唯一官网 27

拖动到窗口内“离线下载”开关上

bf88必发唯一官网 28

在按钮Smart中测试 主窗口句柄为13324八

在那边需求专注开关Smart抓出来的句柄是10进制的。
测试成功啦,看来可以用那个点子,那就1通写出来啊。

bf88必发唯一官网 29

发送文书

那边难点正是离线下载的地方填不进入!它就这么默默地望着你,严守原地!

bf88必发唯一官网 30

开关Smart不行,试试Pywinauto?

三.python的第一方库

移植到Python

……别试了,Pywinauto发送文书也非常。它们用的相应都以WIN
API,所以理应换个思路了。在此间作者的主张是模拟人操作,把地址Ctrl+C一下,然后到文本框Ctrl+V一下。在这里就算Pywinauto有Ctrl+V,但却并未有Ctrl+C(卧槽那是怎么操作啊啊啊)照旧用win
api吧。注意那些SetClipboardData波及了一句,

不能够不用NULL结束字符串。使用此格式为ANSI文本。

于是大家在地点前面加上一句

.encode('ansi')

否则粘贴过去便是如此的

bf88必发唯一官网 31

别的文本框还有三个坑,像上面那样查询链接退步以来地址就留在那里了,所以应当是Ctrl+A
Ctrl+V。而文本框发送Ctrl+A
Ctrl+V有的时候会Ctrl莫名奇妙失效,多出去3个a,粘贴过去是amagnet,所以在那边简直都遵从存在文字的景观管理,发送A
Ctrl+A Ctrl+V
下2个窗口。

bf88必发唯一官网 32

马到功成升级!

虽说能够遵照偏移点击的措施消除,但还要作者发觉能够因而Tab Tab
Enter的艺术产生下载,也许未来境遇坐标偏移量是变化的时候能够品味那种艺术?
各类用鼠标点击钦点坐标的点子到了最后3个窗口了,关掉那几个窗口,便是本子的一个循环啦。

bf88必发唯一官网 33

关掉那几个窗口

win32api,win32gui,win32con,Pillow,numpy,opencv

总结

一齐头自己并不知道Pywinauto有后台鼠标讯息,于是写了三个用winapi模拟点击的本子,也放上来吧。

from pywinauto import application
import win32api
import win32gui
import win32con
import win32ui
main_handle=win32ui.FindWindow('BaseGui','欢迎使用百度网盘').GetSafeHwnd()
client_pos=(516,118)
tmp = win32api.MAKELONG(client_pos[0], client_pos[1])
win32gui.SendMessage(main_handle, win32con.WM_ACTIVATE, win32con.WA_ACTIVE, 0)
win32api.SendMessage(main_handle, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, tmp)
win32api.SendMessage(main_handle, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, tmp)

此次试验还是有繁多主题材料,包含Python落成电影排名榜活动网盘下载(三)Selenium离线下载无差距于出现的心急吃不了热豆腐,所以最终代码中投入了wait_until;还有下载一定次数之后查询磁力链接没反应,重启客户端可化解;以及各类查询战败、离线下载错误……不问可见,应对错误的逻辑还有待改善,在此地只是简短的设定为add_task出现难点以往一向重启客户端,即查询不了下载音讯就重启。还有别的景况未有拍卖,包含下载进程为0%,那种任务多了会提醒离线下载任务过多,供给手动清理,倘若违规能源较多,或许引致重启频仍,影响过程。代码的话可能必要基于实际运市价况修改超时时间。由于速度过快经常轻松查不到句柄啥的,就都用try
except括起来了,以为非常丑却很不得已,献丑啦:

import pywinauto
import time
import win32clipboard as w
import win32con
from pywinauto.timings import *
from pywinauto.application import Application
class baidudisk:

    def boot(self):
        path=r'C:\Users\Administrator\AppData\Roaming\Baidu\BaiduNetdisk\BaiduNetdisk.exe'
        #Python3 中Application要加()
        self.baiduapp=Application().start(path)
        try:
            #规定时间内等待程序启动
            wait_until(10,0.25,self.getmainui,True)
        except Exception as e:
            print('Get Main Window ')
            print(e)

    def kill(self):
        self.baiduapp.kill()
    def download(self,url):
        #剪切板函数要求数据类型为ANSI
        self.url=url.encode('ansi')
        try:
            wait_until(1,0.25,self.click_newtask,True)
        except Exception as e:
            print('Download button ')
            print(e)
        try:
            wait_until(1,0.25,self.query_newtask,True)
        except Exception as e:
            print('Query')
            print(e)
        try:
            wait_until(4,0.25,self.add_newtask,True)
        except Exception as e:
            print('Add task')
            print(e)
            print('Rebooting...')
            self.baiduapp.kill()
            self.boot()
        try:
            wait_until(3,0.25,self.close_state,True)
        except Exception as e:
            print('State Window')
            print(e)

    def click_newtask(self):
        try:
            self.main_ui.click(coords=(516,118))
            return (True)
        except Exception as e:
            print(e)
            return (False)

    def query_newtask(self):
        try:
                newtask_handle=pywinauto.findwindows.find_window(class_name="BaseGui",title= "新建离线下载任务窗口")
                newtask_ui=pywinauto.controls.hwndwrapper.DialogWrapper(newtask_handle)
                url_ui=newtask_ui.descendants()[0]
                # url_ui.set_keyboard_focus()
                w.OpenClipboard()
                w.EmptyClipboard()
                w.SetClipboardData(win32con.CF_TEXT, self.url)
                w.CloseClipboard()
                url_ui.send_keystrokes('a^a^v')
                # print(url_ui.element_info)
                # print(url_ui.get_properties())
                #添加磁力链接后下载
                newtask_ui.click(coords=(470,255))
                return (True)
        except Exception as e:
            print(e)
            return (False)


    def add_newtask(self):
        try:
            download_handle=pywinauto.findwindows.find_window(class_name="BaseGui",title= '新建离线BT任务')
            download_ui=pywinauto.controls.hwndwrapper.DialogWrapper(download_handle)
            download_ui.click(coords=(400,470))
            #可能出现离线下载错误时该窗口不会正常关闭的情况 所以使用try
            try:
                download_ui.close()
            except:
                pass
            return (True)

        except Exception as e:
            print(e)
            return (False)

    def close_state(self):
        try:
            state_handle=pywinauto.findwindows.find_window(class_name="BaseGui",title= '离线下载任务列表')
            state_ui=pywinauto.controls.hwndwrapper.DialogWrapper(state_handle)
            state_ui.close()
            return (True)
        except Exception as e:
            print(e)
            return (False)

    def getmainui(self):
        try:
            #返回窗口句柄
            self.baidudisk_handle=pywinauto.findwindows.find_window(class_name='BaseGui',title='欢迎使用百度网盘')
            #根据窗口句柄查询对话框
            self.main_ui=pywinauto.controls.hwndwrapper.DialogWrapper(self.baidudisk_handle)
            return (True)
        except Exception as e:
            print(e)
            return (False)






if __name__=='__main__':
    bdtest=baidudisk()
    bdtest.boot()
    #正常与违规的链接均进行测试
    magnets=[
        'magnet:?xt=urn:btih:583bed331c32889897f69b114191c44732bb7aa2',
        'magnet:?xt=urn:btih:FD351CACF9692E1833388B3B5A568C6A115E4672&xl=546661540&dn=[%E6%A5%9A%E9%97%A8%E7%9A%84%E4%B8%96%E7%95%8C].rmvb',
        'magnet:?xt=urn:btih:F77F5133B209D29126812CFAC9B0FE2508DC52A9&xl=584113510&dn=%E9%9C%B8%E7%8E%8B%E5%88%AB%E5%A7%AC.rmvb',
        'magnet:?xt=urn:btih:E2A87A1922139C5C44965B77F5EC21F1442C97A4&xl=1073579448&dn=#_IBW118',
        'magnet:?xt=urn:btih:CC2711AE1A5CCB8CB5FB3E6F900F404BD4792517&xl=1367609104&dn=%E9%98%BF%E7%94%98%E6%AD%A3%E4%BC%A0.[1024%E5%88%86%E8%BE%A8%E7%8E%87].rmvb'
    ]
    for i in range(20):
        bdtest.download(magnets[i%5])

至于怎样批量拿走磁力链接地址可参看往期壹类别小说:
Python完成电影排名榜活动网盘下载(4)Cookies免登入+抓包下载
Python落成电影排名榜活动网盘下载(三)Selenium离线下载
Python完结电影排名榜活动网盘下载(二)Scrapy深入“打包员”“特快专递员”
Python达成电影排名榜活动网盘下载(一)Scrapy爬虫框架
Python落成电影排名榜活动网盘下载(0)简要介绍
搜狐云乐评抓取实验(一)接口获取

可经过 pip install –upgrade SomePackage 来张开设置

注意:一对版本是下载pywin3贰,可是部分要把pywin3二升官到最高并机关下载了pypiwin32,具体意况每种python版本大概都略有差异

本人付出作者的第一方库和本子仅供参考

bf88必发唯一官网 34 

二、关键代码组成

一.找到游戏窗口与坐标

#扫雷游戏窗口
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的截图来判断的
left += 15
top += 101
right -= 15
bottom -= 42

#抓取雷区图像
rect = (left, top, right, bottom)
img = ImageGrab.grab().crop(rect)

三.各图像的中华VGBA值

#数字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))]

四.扫描雷区图像保存至二个贰维数组map

#扫描雷区图像
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)

伍.扫雷算法

这里我动用的最基础的算法

一.率先点出一个点

二.围观全体数字,借使周围空白+插旗==数字,则空手均有雷,右键点击空白插旗

三.围观全部数字,假使附近插旗==数字,则空手均没有雷,左键点击空白

四.循环2、叁,假使未有符合条件的,则随机点击叁个白块

#插旗
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()

其一算法在初级和高级中学级通过率都毋庸置疑,不过在高端成功率惨不忍睹,主假使从没有过设想逻辑组合以及白块是雷的票房价值难题,可以对那五个点进展立异,升高成功率

总结

以上正是那篇作品的全体内容了,希望本文的剧情对我们的就学大概干活富有一定的参阅学习价值,要是有疑点大家能够留言交换,多谢我们对台本之家的支撑。

您恐怕感兴趣的小说:

  • 基于Python达成的扫雷游戏实例代码
  • Python自动扫雷达成格局
  • 用python写扫雷游戏实例代码分享

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图