问题
暗黑2,是《暗黑破坏神2》的简称,是美国暴雪娱乐研发的一款动作类角色扮演游戏,于2000年上市。
下文介绍如何使用python制作暗黑2建号器脚本,以代替重复与繁琐的手工操作。
注意:以下代码只作为学习使用,如产生法律后果与商业损失,后果自负。
步骤
步骤一、采集暗黑2游戏窗口数据
1、首先先设定平面坐标轴,蓝色区域为暗黑2窗口。
现在,笔记本或者台式机分辨率普遍比较高(例如:1920*1080),暗黑2窗口化后无法占满屏幕,呈现如下图所示情形。
设定屏幕左上角为原点(0,0),需要调用GetWindowRect()计算暗黑2窗口左上角(w_x,w_y)以及窗口的宽度(w_w)和高度(w_h)。
2、窗口采集函数需要输出四个参数,分别为w_x,w_y,w_w,w_h。
def get_d2_window_param():
a = u"D2Loader v1.11b - Build On Nov 11 2005"
#a = u"无标题 - 画图"
hwnd = win32gui.FindWindow(None, a)
print("句柄:", hwnd, "标题:", win32gui.GetWindowText(hwnd))
rect = win32gui.GetWindowRect(hwnd)
#win32gui.SetWindowText(hwnd, "A")
#win32gui.SetForegroundWindow(hwnd)
w = (rect[2] - rect[0])
h = (rect[3] - rect[1])
print("w = ", w)
print("h = ", h)
return rect[0], rect[1], w, h
步骤二、采集游戏界面关键控件的比例数据。
1、过场动画后,第一张游戏界面关键控件是【BATTLE.NET】按钮 和 【离开暗黑破坏神II】按钮。
使用抓图软件抓取游戏窗口,然后使用windows系统自带【画图】工具查看控件所在坐标。
控件 | x轴 | y轴 |
【BATTLE.NET】按钮 | 504 / 1008 = 0.5000 | 470 / 786 = 0.5979 |
【离开暗黑破坏神II】按钮 | 504 / 1008 = 0.5000 | 720 / 786 = 0.9160 |
表格内运算的结果表示:控件在游戏窗口内以左上角为原点的比例位置。
2、点击【BATTLE.NET】按钮后,进入第二张游戏界面。关键的控件有:【密码】编辑框 和【登录】按钮 。
控件 | x轴 | y轴 |
【密码】编辑框 | 504 / 1008 = 0.5000 | 520 / 786 = 0.6615 |
【登录】按钮 | 504 / 1008 = 0.5000 | 620 / 786 = 0.7888 |
3、点击【登录】按钮后,进入第三张角色管理界面,关键控件有:【创建新人物】按钮 和【离开】按钮 。
控件 | x轴 | y轴 |
【创建新人物】按钮 | 148 / 1008 = 0.1468 | 656 / 786 = 0.8346 |
【离开】按钮 | 125 / 1008 = 0.1240 | 726 / 786 = 0.9236 |
4、点击【创造新人物】后,进入第四张角色选择界面,关键控件:【资料片人物】单选框与【好】按钮。
控件 | x轴 | y轴 |
【资料片人物】单选框 | 410 / 1008 = 0.4067 | 696 / 786 = 0.8855 |
【好】按钮 | 868 / 1008 = 0.8611 | 728 / 786 = 0.9262 |
5、点击【好】按钮后,进入战网游戏大厅,关键控件:【结束】按钮。
控件 | x轴 | y轴 |
【结束】按钮 | 920 / 1008 = 0.9126 | 630 / 786 = 0.8015 |
步骤三、主要功能函数
主要功能函数包括:登录暗黑2游戏函数load_d2()、登录账号函数login_account()以及创建角色函数create_char()。
1、登录游戏。
def load_d2():
'''登录Diablo II游戏'''
print("Load Diablo II ...")
print(os.getcwd())
os.chdir("d:\Documents\Games\Diablo II")
#os.system(r'start 91D2Loader.exe -w -pdir -ns')
os.system(r'start 91D2Loader.exe -w -skiptobnet -ns')
#os.chdir('c:\windows\system32')
#os.system(r'start mspaint.exe')
#os.system(r'start notepad.exe')
time.sleep(3)
2、登录账号
def login_account(username, password='******'):
'''登录账户'''
print("Login Account ...")
#鼠标点击【BATTLE.NET】按钮
click_and_sleep(w_x+int(w_w*0.5000), w_y+int(w_h*0.5979), 2)
#鼠标点击【密码】编辑框,移动光标至【密码框】
click_and_sleep(w_x+int(w_w*0.5000), w_y+int(w_h*0.6615), 1)
#按tab键切换光标,移动光标至【账户名称】。如果有默认账户,则自动全选。
k.press_key(k.tab_key)
time.sleep(1)
#删除旧账户
k.press_key(k.backspace_key)
time.sleep(1)
#输入新账号
k.type_string(username)
time.sleep(1)
#移动光标至【密码框】
k.press_key(k.tab_key)
time.sleep(1)
#输入密码
k.type_string(password)
time.sleep(1)
#点击【登录】按钮
click_and_sleep(w_x+int(w_w*0.5000), w_y+int(w_h*0.7888), 1)
3、创建角色
def create_char(account_name):
print("Create char ...")
first_name = account_dict[account_name][0]
char_occupation = account_dict[account_name][1]
#for i in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']:
for i in ['a', 'b']:
click_and_sleep(w_x+int(w_w*0.1468), w_y+int(w_h*0.8346), 1)
click_and_sleep(w_x+char_dict[char_occupation][0]*int(w_w/8), w_y+int(w_h/2), 1)
char_name = 'zx_' + first_name + i
k.type_string(char_name)
time.sleep(1)
#去掉勾选【资料片任务】
click_and_sleep(w_x+int(w_w*0.4067), w_y+int(w_h*0.8855), 1)
#点击【好】按钮
click_and_sleep(w_x+int(w_w*0.8611), w_y+int(w_h*0.9262), 1)
#点击【退出】按钮
click_and_sleep(w_x+int(w_w*0.9126), w_y+int(w_h*0.8015), 1)
#点击【离开】按钮
click_and_sleep(w_x+int(w_w*0.1240), w_y+int(w_h*0.9236), 1)
4、鼠标点击后等待函数
def click_and_sleep(x, y, seconds):
'''点击并暂停'''
m.move(x, y)
m.click(x, y, 1)
time.sleep(seconds)
步骤四、主程序
# coding=utf-8
from pykeyboard import PyKeyboard
import win32api, win32con, win32gui
import time
import os
if __name__ == "__main__":
m = PyMouse()
k = PyKeyboard()
account_dict = {'acc01':('A', 'bar'), 'acc02':('B', 'sor'), }
#account_dict = {'acc01':('a', 'ama')}
char_dict = {'ama': (1, 4), 'ass': (2, 4), 'nec': (3, 4), 'bar': (4, 4), 'pal': (5, 4), 'sor': (6, 4), 'dru': (7, 4)}
#登录暗黑2
load_d2()
#获取窗口参数
w_x, w_y, w_w, w_h = get_d2_window_param()
for key in account_dict:
#登录账号
login_account(key)
#建号
create_char(key)
#点击【离开暗黑破坏神II】按钮
click_and_sleep(w_x+int(w_w*0.5000), w_y+int(w_h*0.9160), 1)
print("end ...")
参考博客:Python:批量创建暗黑2的RR小号