企业网站网址举例,搭建网站是什么专业,西安公司企业网站建设,网站建设维护培训文章目录 仅为自动化演示#xff0c;实际2048判定逻辑需要更加严谨 参考代码
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能#xff0c;如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作… 文章目录 仅为自动化演示实际2048判定逻辑需要更加严谨 参考代码
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过调用模块的指令使用此模块import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import numpy as np
import random
from xbot import win32class Game2048:def __init__(self):初始化2048游戏自动化self.web_page Noneself.board_size 4self.directions [up, down, left, right]def start_game(self):启动游戏并初始化try:# 打开2048游戏网页self.web_page xbot.web.create(urlhttps://shop.yingdao.com/2048/index.html,modechrome)sleep(2) # 等待页面加载# 点击开始游戏按钮如果有start_btn self.web_page.find_by_xpath(//a[idnewgamebutton])if start_btn:start_btn.click()sleep(1)return Trueexcept Exception as e:print(f启动游戏失败: {e})return Falsedef get_board_state(self):获取当前游戏棋盘状态 try:# 查找所有数字单元格number_cells self.web_page.find_all_by_xpath(//div[contains(class,number-cell)])number_arr [int(item.get_text()) if item.get_text().strip() else 0 for item in number_cells]board np.array(number_arr, dtypeint).reshape(self.board_size, self.board_size)return boardexcept Exception as e:print(f获取棋盘状态失败: {e})return Nonedef make_move(self, direction):执行移动操作try:# 映射方向到键盘按键key_map {up: {UP},down: {DOWN},left: {LEFT},right: {RIGHT}}# 发送键盘事件win32.send_keys(keyskey_map[direction],send_key_delay50,delay_after1)sleep(0.3) # 等待动画效果return Trueexcept Exception as e:print(f执行移动失败: {e})return Falsedef simple_ai_move(self, board):简单AI策略决定下一步移动# 这里可以实现更复杂的AI算法# 示例随机选择一个有效方向valid_moves []for direction in self.directions:# 模拟移动看是否有效new_board self.simulate_move(board.copy(), direction)if not np.array_equal(new_board, board):valid_moves.append(direction)return random.choice(valid_moves) if valid_moves else Nonedef simulate_move(self, board, direction):模拟2048移动后的棋盘状态包含合并逻辑new_board np.zeros((self.board_size, self.board_size), dtypeint)if direction up:for col in range(self.board_size):column board[:, col]non_zero column[column ! 0] # 获取非零数字if len(non_zero) 0: # 如果全零直接跳过new_board[:, col] columncontinue# 合并相邻相同数字merged []i 0while i len(non_zero):if i 1 len(non_zero) and non_zero[i] non_zero[i 1]:merged.append(non_zero[i] * 2) # 合并i 2 # 跳过下一个数字已合并else:merged.append(non_zero[i])i 1# 填充到新列new_column np.zeros(self.board_size, dtypeint)new_column[:len(merged)] mergednew_board[:, col] new_columnelif direction down:for col in range(self.board_size):column board[:, col]non_zero column[column ! 0]if len(non_zero) 0: # 如果全零直接跳过new_board[:, col] columncontinue# 从下往上合并merged []i len(non_zero) - 1while i 0:if i - 1 0 and non_zero[i] non_zero[i - 1]:merged.insert(0, non_zero[i] * 2) # 合并i - 2else:merged.insert(0, non_zero[i])i - 1new_column np.zeros(self.board_size, dtypeint)new_column[-len(merged):] mergednew_board[:, col] new_columnelif direction left:for row in range(self.board_size):row_data board[row, :]non_zero row_data[row_data ! 0]if len(non_zero) 0: # 如果全零直接跳过new_board[row, :] row_datacontinue# 从左往右合并merged []i 0while i len(non_zero):if i 1 len(non_zero) and non_zero[i] non_zero[i 1]:merged.append(non_zero[i] * 2)i 2else:merged.append(non_zero[i])i 1new_row np.zeros(self.board_size, dtypeint)new_row[:len(merged)] mergednew_board[row, :] new_rowelif direction right:for row in range(self.board_size):row_data board[row, :]non_zero row_data[row_data ! 0]if len(non_zero) 0: # 如果全零直接跳过new_board[row, :] row_datacontinue# 从右往左合并merged []i len(non_zero) - 1while i 0:if i - 1 0 and non_zero[i] non_zero[i - 1]:merged.insert(0, non_zero[i] * 2)i - 2else:merged.insert(0, non_zero[i])i - 1new_row np.zeros(self.board_size, dtypeint)new_row[-len(merged):] mergednew_board[row, :] new_rowreturn new_boarddef auto_play(self, max_moves1000):自动玩游戏主循环if not self.start_game():returnmove_count 0while move_count max_moves:try: # 获取当前棋盘状态board self.get_board_state() print(board,board)if board is None:print(无法获取棋盘状态)breakprint(f当前棋盘状态移动{move_count}次:)print(board)# 决定下一步移动direction self.simple_ai_move(board)print(direction,direction)if not direction:print(没有有效移动游戏可能结束)breakprint(fAI决定移动方向: {direction})# 执行移动self.make_move(direction)move_count 1# 短暂暂停sleep(0.1)except KeyboardInterrupt:print(用户中断自动游戏)breakexcept Exception as e:print(f游戏过程中出错: {e})breakprint(自动游戏结束)def main(args):game Game2048()game.auto_play()