失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 利用Python编写一个AI脚本自动控制2048网页小游戏

利用Python编写一个AI脚本自动控制2048网页小游戏

时间:2022-09-09 23:05:53

相关推荐

利用Python编写一个AI脚本自动控制2048网页小游戏

前言

本文将使用python+selenium自动控制游戏运行。当然采用的是伪随机数进行键盘控制。只作为一个抛砖迎玉的参考,不涉及专业算法。

一、前期准备(必须有)

1、在安装好的pyCharm中导入相应的库

打开pyCharm,点击终端,依次输入:

pip install win32guipip install PyUserInputpip install PyKeyboardpip install selenium(注意要配合相应的webdriver驱动使用,webdriver的安装下载请自行到网上搜索学习)

2、新建一个python项目文件

3、下载准备好的2048小游戏将其解压到文件目录下

链接:/s/1y7Kosl20Fw1Xbu8tMI4-zw

提取码:aicg

–来自百度网盘超级会员V5的分享

文件的总体目录如下:

其中index.html就是2048小游戏html文件,双击之后可以运行。

二、使用步骤

1.引入库

代码如下(示例):

import randomimport timeimport osfrom pykeyboard import PyKeyboard # 键盘实例from selenium import webdriver # web驱动from selenium.webdriver import ActionChains # 鼠标模拟from mon.by import By

2.用相对路径来获取绝对路径

我们用driver.get(url)方法来跳转到游戏界面,但是url为本地资源的时候,只能通过绝对路径来打开(个人理解,因为本人直接用相对路径打开没有用),所以需要使用os里面的库函数来进行转化。代码片段如下(其中url就是绝对路径了):

# 通过相对路径来得到 绝对路径=os.path.abspath(相对路径)path = r'../2048Game/index.html'file_open = open(path, mode='r')# print(os.path.abspath(path))url = os.path.abspath(path)

3.获取webdriver驱动

# 获取webdriver驱动,这里用的是谷歌driver = webdriver.Chrome()# 用浏览器打开driver.get(url)# 设置隐式等待时间为3秒driver.implicitly_wait(3)

4.定义一些可能会有用的变量

# 定义一些变量now_number = [] # 存储现在的界面数字数组,在以后的算法之中可能会用到,当前可不写k = PyKeyboard() # 键盘对象

5.主要的函数代码块

# 获取当前页面的状态数组,返回的是一个一维列表def get_now_numbers(driver):global now_number # 声明使用的是全局变量now_number.clear() # 对列表进行清空,防止有脏数据for i in range(4):for j in range(4):# 用CSS选择器查找每一个小方格里面的数字,并且添加到数组中cell_span = driver.find_element(By.CSS_SELECTOR, '#number-cell-{}-{}'.format(i, j))num = cell_span.textif num == "":now_number.append(0)else:now_number.append(int(num))# 开始新游戏def new_game(driver):# 查找开始游戏按钮new_game_button = driver.find_element(By.CSS_SELECTOR, '#new_game_button')time.sleep(2)# 实例化鼠标方法actions = ActionChains(driver)# 开始一个新游戏actions.click(new_game_button)# 调用点击方法actions.perform()# 随机按键按键效果def press_key_r(num):if num == 0:# 按左移键k.tap_key(k.left_key)elif num == 1:# 按右移键k.tap_key(k.right_key)elif num == 2:# 按上移键k.tap_key(k.up_key)else:# 按下移键k.tap_key(k.down_key)

6.开始一局游戏,和结束游戏判断

# 开始新游戏new_game(driver=driver)# 获取初始游戏界面get_now_numbers(driver=driver)time.sleep(2)flag = 0 #游戏停止标志# 定义一个死循环一直按键while flag == 0:# 是否弹出gameover警告框# 因为alert是在js里面定义的,所以可以直接用driver.switch_to.alert获取try:alert = driver.switch_to.alertprint(alert.text)# 游戏结束if alert.text == "gameover!":alert.accept()flag = 1breakexcept Exception:# 产生一个随机数,随机上下左右移num = random.randint(0, 3)press_key_r(num)# print("继续操作...")time.sleep(0.2)# 获取分数score = driver.find_element(By.ID, "score").textprint("本次得分为:{}".format(score))

7.总体代码如下:

import randomimport timeimport osfrom pykeyboard import PyKeyboard # 键盘实例from selenium import webdriver # web驱动from selenium.webdriver import ActionChains # 鼠标模拟from mon.by import By# 通过相对路径来得到 绝对路径=os.path.abspath(相对路径)path = r'../2048Game/index.html'file_open = open(path, mode='r')# print(os.path.abspath(path))url = os.path.abspath(path)# 获取webdriver驱动,这里用的是谷歌driver = webdriver.Chrome()# 用浏览器打开driver.get(url)# 设置隐式等待时间为3秒driver.implicitly_wait(3)# 定义一些变量now_number = [] # 存储现在的界面数字数组,在以后的算法之中可能会用到,当前可不写k = PyKeyboard() # 键盘对象# 获取当前页面的状态数组,返回的是一个一维列表def get_now_numbers(driver):global now_number # 声明使用的是全局变量now_number.clear() # 对列表进行清空,防止有脏数据for i in range(4):for j in range(4):# 用CSS选择器查找每一个小方格里面的数字,并且添加到数组中cell_span = driver.find_element(By.CSS_SELECTOR, '#number-cell-{}-{}'.format(i, j))num = cell_span.textif num == "":now_number.append(0)else:now_number.append(int(num))# 开始新游戏def new_game(driver):# 查找开始游戏按钮new_game_button = driver.find_element(By.CSS_SELECTOR, '#new_game_button')time.sleep(2)# 实例化鼠标方法actions = ActionChains(driver)# 开始一个新游戏actions.click(new_game_button)# 调用点击方法actions.perform()# 随机按键按键效果def press_key_r(num):if num == 0:# 按左移键k.tap_key(k.left_key)elif num == 1:# 按右移键k.tap_key(k.right_key)elif num == 2:# 按上移键k.tap_key(k.up_key)else:# 按下移键k.tap_key(k.down_key)# 开始新游戏new_game(driver=driver)# 获取初始游戏界面get_now_numbers(driver=driver)time.sleep(2)flag = 0# 定义一个死循环一直按键while flag == 0:# 是否弹出gameover警告框# 因为alert是在js里面定义的,所以可以直接用driver.switch_to.alert获取try:alert = driver.switch_to.alertprint(alert.text)# 游戏结束if alert.text == "gameover!":alert.accept()flag = 1breakexcept Exception:# 产生一个随机数,随机上下左右移num = random.randint(0, 3)press_key_r(num)# print("继续操作...")time.sleep(0.2)# 获取分数score = driver.find_element(By.ID, "score").textprint("本次得分为:{}".format(score))

总结

以上就是本次项目的所有代码块,本次分享只是起一个抛砖引玉的作用,之后可能会增加一些算法来代替伪随机数进行游戏控制。可能的思路如下:

1、再设置四个变量来记录“上下左右”移动的权重,

2、每次移动之前先用get_now_numbers()函数来获取now_number数组,

3、然后再根据其数组计算出移动之后消去数字对最多的方向(权重最大),进行移动控制。

如果觉得《利用Python编写一个AI脚本自动控制2048网页小游戏》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。