当前位置: 首页 > news >正文

影刀Fun叉鸟-2048

文章目录


仅为自动化演示,实际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(url="https://shop.yingdao.com/2048/index.html",mode="chrome")sleep(2)  # 等待页面加载# 点击开始游戏按钮(如果有)start_btn = self.web_page.find_by_xpath('//a[@id="newgamebutton"]')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, dtype=int).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(keys=key_map[direction],send_key_delay=50,delay_after=1)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), dtype=int)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, dtype=int)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, dtype=int)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, dtype=int)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, dtype=int)new_row[-len(merged):] = mergednew_board[row, :] = new_rowreturn new_boarddef auto_play(self, max_moves=1000):"""自动玩游戏主循环"""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(f"AI决定移动方向: {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()

相关文章:

  • Python 包管理工具核心指令uvx解析
  • 有没有其他影视app可以像群晖video station一样可以被Windows的本地网络驱动器找到
  • 啤酒游戏与系统思考
  • 大模型如何助力数学可视化?
  • Supplemental Table 5FAM49B H-SCORE与其他临床特征的关系
  • uni-app使用大集
  • Python打卡训练营day28-类的定义与方法
  • Wireshark抓包分析小程序接口请求教程
  • 前端JavaScript-嵌套事件
  • C++ stack对象创建、入栈、获取栈顶
  • 深入学习LLM开发 第二四章:向量数据库说明
  • 项目优先级不清,如何合理分配资源?
  • ubuntu24.04+RTX5090D 显卡驱动安装
  • 风车聊天室nodejs环境即可无需数据库
  • Android开发——不同布局的定位属性 与 通用属性
  • 【机器学习基础】机器学习与深度学习概述 算法入门指南
  • 高噪声下扩展边缘检测算子对检测边缘的影响
  • Linux中进程控制(上)
  • cmd如何从C盘默认路径切换到D盘某指定目录
  • CVE-2018-1270源码分析与漏洞复现(spring-messaging 表达式注入)
  • asp.net做网站实例/如何推广一个平台
  • 企业大型网站开发需要多少钱/推广员网站
  • 在印度做视频网站/今日头条网页版入口
  • 网站和web系统的区别/昆山网站建设
  • 建设网站要先给钱才能做/今日微博热搜榜前十名
  • 网站做营销推广公司/做任务赚佣金一单10块