影刀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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3.5 企业级管理系统实战(二十):角色菜单

本篇聚焦于角色菜单权限分配功能的实现&#xff0c;围绕“给角色赋予菜单权限”这一核心场景&#xff0c;从接口设计、组件封装到页面集成展开完整技术方案的阐述。主要内容包括&#xff1a; 1. 角色权限接口开发&#xff1a;定义获取角色权限、分配权限等接口&#xff0c;规范…

go实现钉钉三方登录

钉钉的的官方开发文档中只给出了java实现三方登录的&#xff0c;我们准备用go语言来实现 实现网页方式登录应用&#xff08;登录第三方网站&#xff09; - 钉钉开放平台 首先就是按照文档进行操作&#xff0c;备注好网站的信息 获得应用凭证&#xff0c;我们后面会用到 之后…

一、OpenCV的基本操作

目录 1、OpenCV的模块 2、OpenCV的基础操作 2.1图像的IO操作 2.2绘制几何图形 2.3获取并修改图像中的像素点 2.4 获取图像的属性 2.5图像通道的拆分与合并 2.6色彩空间的改变 3、OpenCV的算数操作 3.1图像的加法 3.2图像的混合 3.3总结 1、OpenCV的模块 2、OpenCV的基…

虚拟机配置桥接,远程工具直接访问

虚拟机网络配置 前言windows下安装linux虚拟机配置网络1、设置虚拟机网络模式&#xff1a;桥接模式2、配置网络参数1、查看本机电脑连接的网络情况2、打开虚拟机&#xff0c;编辑配置文件3、编辑虚拟网络 3、测试连通性 前言 好不容易装上了虚拟机&#xff0c;输入命令时又发现…

RabbitMQ 概述与安装

MQ 作用与介绍 MQ 是什么 MQ (message queue),从字面意思看是一个队列, FIFO 先进先出,只不过里面存放的内容是 消息 消息 可以比较简单,比如只包含 文本字符串,JSON 等;也可以很复杂,比如 内嵌对象 等 MQ 多用于分布式系统之间进行通信 系统之间的调用通常有两种方式: 1…

如何在Vue中实现延迟刷新列表:以Element UI的el-switch为例

如何在Vue中实现延迟刷新列表&#xff1a;以Element UI的el-switch为例 在开发过程中&#xff0c;我们经常需要根据用户操作或接口响应结果来更新页面数据。本文将以Element UI中的el-switch组件为例&#xff0c;介绍如何在状态切换后延迟1秒钟再调用刷新列表的方法&#xff0…

CSS2相关知识点

CSS2相关知识点 CSS的编写位置样式种类样式表的优先级 CSS选择器CSS基本选择器通配选择器元素选择器类选择器ID选择器 复合选择器HTML元素间的关系交集选择器并集选择器后代选择器子代选择器兄弟选择器属性选择器伪类选择器伪元素选择器 颜色的表示表示方式一&#xff1a;颜色名…

centos yum源,docker源

yum源repo文件&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repodocker源repo文件&#xff1a; yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装docker和docker c…

深入探索AI模型工程:算法三大门派与监督学习的魅力

在当今人工智能蓬勃发展的时代&#xff0c;AI系统正逐渐渗透到我们生活的方方面面。从智能语音助手到自动驾驶汽车&#xff0c;从医疗影像诊断到金融风险预测&#xff0c;AI的应用场景无处不在。然而&#xff0c;构建一个高效、可靠的AI系统并非易事&#xff0c;它需要我们从宏…

[De1CTF 2019]SSRF Me

算是我第一次正儿八经的分析python代码了 from flask import Flask, request import socket import hashlib import urllib import sys import os import jsonreload(sys) sys.setdefaultencoding(latin1)app Flask(__name__) # 创建一个Flask应用实例 secret_key os.ura…

Halcon 图像预处理②

非线性图像分段变化&#xff1a; 先窗体打开图片 对数非线性变化&#xff1a; 结果图像的亮度/对比度显著增加 log_image(Image,LogImag1,e) 参数1&#xff1a;输入图像 参数2&#xff1a; 输出图像 参数3&#xff1a;底数 log_image(Image,LogImage2,0.1) 图像结果亮度和…

云原生安全之网络IP协议:从基础到实践指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 IP协议&#xff08;Internet Protocol&#xff09;是互联网通信的核心协议族之一&#xff0c;负责在设备间传递数据包。其核心特性包括&…

QML学习08Text

Text 1、颜色&#xff08;color&#xff09;2、获取宽度和高度&#xff08;contentWidth、contentHeight&#xff09;3、字体格式&#xff08;font&#xff09;4、文本样式&#xff08;textFormat&#xff09;5、超链接 1、颜色&#xff08;color&#xff09; //颜色Text {colo…

Python网络编程深度解析

目录 一、网络编程概述 二、TCP与UDP协议详解 1.TCP协议&#xff1a;可靠传输的基石 2.UDP协议&#xff1a;高效但不可靠的传输 3. TCP与UDP对比 三、Socket编程模型 1. Socket基础 2.TCP服务器实现详解 3. UDP服务器实现详解 四、进阶应用&#xff1a;简易聊天程序 …

ElasticSearch导读

ElasticSearch 简介&#xff1a;ElasticSearch简称ES是一个开源的分布式搜素和数据分析引擎。是使用Java开发并且是当前最流行的开源的企业级搜索引擎&#xff0c;能够达到近实时搜索&#xff0c;它专门设计用于处理大规模的文本数据和实现高性能的全文搜索。它基于 Apache Luc…

【后端高阶面经:数据库篇】18、分布式事务:如何在分库分表中实现高性能与一致性?

一、分布式事务核心挑战:分库分表下的一致性困境 在分布式系统架构中,分库分表通过将数据分散存储提升了扩展性和性能,但却打破了传统单库事务的边界,使得分布式事务成为保障数据一致性的核心难题。其挑战主要体现在以下三方面: 1.1 ACID特性的分布式撕裂 原子性(Atomi…

Tailwind css实战,基于Kooboo构建AI对话框页面(一)

在当今数字化时代&#xff0c;AI 助手已成为网站和应用不可或缺的一部分。本文将带你一步步使用 Tailwind CSS 和 Kooboo 构建一个现代化的 AI 对话界面框。 一、选择 Kooboo平台 的核心优势 智能提示&#xff1a;在输入 class 属性时&#xff0c;会自动触发 Tailwind CSS 规则…

python学习day2:进制+码制+逻辑运算符

进制 Python 中的进制表示与转换 进制的基本概念 二进制、八进制、十进制、十六进制的定义与特点不同进制在计算机科学中的应用场景 Python 中的进制表示 二进制表示&#xff1a;使用 0b 前缀八进制表示&#xff1a;使用 0o 前缀十六进制表示&#xff1a;使用 0x 前缀示例…

ROS2学习(11)------ROS2通信接口

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 ROS版本&#xff1a;2 ROS 2 提供了多种通信接口&#xff0c;用于节点之间的数据交换。这些接口主要包括话题&#xff08;Topics&#xff09;、服务&#xff08;Services&#xff09;、动作&…

STM32G0xx基于串口(UART)Ymodem协议实现OTA升级包括Bootloader、上位机、应用程序

STM32G0xx基于串口Ymodem协议实现OTA升级包括Bootloader、上位机、应用程序 例程说明一、串口相关的底层配置二、OTA相关的应用层三、Flash相关的操作四、Flash存储参数相关五、核心部分Ymodem相关六、其他宏配置七、主函数八、使用Python合并文件九、测试结果有疑问欢迎加交流…