连连看(三)

article/2025/1/16 13:51:09

Python3 实现QQ游戏连连看游戏辅助

  • 连连看(零)—— 前记
  • 连连看(一)—— 你看,这是截图啊
  • 连连看(二)—— 哦吼,PIL + CV2 + Numpy 假图像识别构建矩阵
  • 连连看(三)—— 拐了拐了啊,卖拐啦(连线规则)
  • 连连看(四)—— 你看我这鼠标比用户还真(Pymouse 的替身)
  • 连连看(五)—— 后记 + 成果展示

目录

Python3 实现QQ游戏连连看游戏辅助

0、本片前言 

1、水平方向

2、垂直方向

3、一个拐角

4、两个拐角

5、判断是否可以连接


 0、本片前言

从这里开始,我们可以按照上一篇文章中介绍的方法,手动赋值一个矩阵和 total ,不用每次调试运行都打开游戏、截图、保存、构建矩阵了。

本文使用的是这个矩阵,total = 32

       [ [1,  2,  3,  4,  5,  1,  1,  6,  7,  8,   9, 10, 11, 12, 13, 14, 15,  9,  7],[16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  3],[17, -1, 18, 19, 20, 21, 22,  2,  9, 12,  4,  7, 16, 12, 23, 17,  6, -1,  5],[18, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  8, -1,  5],[25, -1,  2, -1, 22, 20, 16, 19, 26, 23,  4,  1, 27,  8, -1, -1, 14, -1,  6],[16, -1, 28, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, 17],[ 3, -1, 19, -1, 15,  3, 21, 24, 11,  5, 18, 28, 27, 30, 25, 22, 10, -1, 27],[17, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19],[11, -1, 31, 29, 20, 13,  4, 13, 14, 11, 10, 24,  7, 18, 14, 12, 30,  8, 28],[31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],[ 9,  6, 10, 24, 27, 26,  2, 25, 28, 20, 23, 29, 22, 29, 31, 31, 13, 21, 25]])

 每写完一个函数都可以进行测试,方法就是 print 看结果

# 使用保存的矩阵和 total 初始化
linkup = game()# 随心所欲的想要测试的两点坐标带入即可
print(linkup.vertical(3, 1, 4, 1))
print(linkup.two_corner(r1, c1, r2, c2))

1、水平方向

首先判断是否在同一行,然后根据进行扫描两点之间是否存在非空(非 -1)的点。

第一次写的时候发现测试 (0, 5) 和 (0, 6) 这两点的时候,发现明明是可以连接的,但是返回的却是 False。

因为有两种特殊情况:

1、如果两点相连接,导致在 for 循环一次都不运行。(使用 Pycharm 的 Debug 模式发现)

      解决方案就是判断同一行的两点是否纵坐标相邻。如果两个坐标点所对应的矩阵中的值相同,可以连线。但这就引起了第二个特殊情况:其中一个点是 -1,另一个点为大于零的数字。

2、其中一个点是 -1,另一个点为大于零的数字。(主要是为了后面的拐点连线判断做铺垫)

    解决方案是用或操作对两个点进行判断,若其中一个为 -1,可以连线。

# 判断水平方向def horizon(self, row1: int, col1: int, row2: int, col2: int) -> bool:if row1 == row2:for i in range(min(col1, col2) + 1, max(col1, col2)):# print(self.game_map[row1, i])if self.game_map[row1, i] != -1:return False# 解决 conjunctionif min(col1, col2) + 1 == max(col1, col2):if (self.game_map[row1, col1] == -1) or (self.game_map[row2, col2] == -1):return Trueif self.game_map[row1, col1] == self.game_map[row2, col2]:return Truereturn Truereturn False

 

2、垂直方向

与水平方向相同,举一反三,不再赘述。

    # 判断垂直方向def vertical(self, row1: int, col1: int, row2: int, col2: int) -> bool:if col1 == col2:for i in range(min(row1, row2) + 1, max(row1, row2)):# print(self.game_map[i, col1])if self.game_map[i, col1] != -1:return False# 解决 conjunctionif min(row1, row2) + 1 == max(row1, row2):if (self.game_map[row1, col1] == -1) or (self.game_map[row2, col2] == -1):return Trueif self.game_map[row1, col1] == self.game_map[row2, col2]:return Truereturn Truereturn False

 

3、一个拐角

 增加两个拐点 (cor_one_row, cor_one_col) = (row1, col2) 和 (cor_two_row, cor_two_col) = (row2, col1) 作为辅助,不用担心两个点的位置关系,因为在水平和垂直的判断中,我们都使用了 max 和 min 函数进行修正。

那么思路就是判断:

1、point1 与 cor_one 之间是否可以水平连接,point2 与 cor_one 之间是否可以垂直连接。

2、point2 与 cor_two 之间是否可以水平连接,point1 与 cor_two 之间是否可以垂直连接。

其中一个可行,那么 point1 与 point2 之间可以连线。

# 判断一个拐点
def one_corner(self, row1: int, col1: int, row2: int, col2: int) -> bool:cor_one_row, cor_one_col = row1, col2cor_two_row, cor_two_col = row2, col1if self.game_map[cor_one_row, cor_one_col] == -1:if self.horizon(cor_one_row, cor_one_col, row1, col1) & self.vertical(cor_one_row, cor_one_col, row2, col2):return Trueif self.game_map[cor_two_row, cor_two_col] == -1:if self.horizon(cor_two_row, cor_two_col, row2, col2) & self.vertical(cor_two_row, cor_two_col, row1, col1):return Truereturn False

 

4、两个拐角

详细分析:

1、在 point1 的水平或垂直连线上任意一点可以与 point2 经过一个拐点的连线连接,即两点间可以经过两个拐点链接

2、在 point2 的水平或垂直连线上任意一点可以与 point1 经过一个拐点的连线连接,即两点间可以经过两个拐点链接

辅助函数:用于获取两目标点所在水平和垂直方向上的空白点(-1)

ps:此函数可以优化,大家可以自行修改优化,欢迎评论私信。

# 收集水平、垂直方向可行点
def collect_points(self, row: int, col: int) -> list:points = []# 向右方搜索for i in range(col + 1, 19):try:if self.game_map[row, i] == -1:points.append((row, i))else:breakexcept IndexError as err:# print("Ignore col error.")continue# 向左方搜索for i in range(col - 1, -1, -1):try:if self.game_map[row, i] == -1:points.append((row, i))else:breakexcept IndexError as err:# print("Ignore col error.")continue# 向上方搜索for i in range(row - 1, -1, -1):try:if self.game_map[i, col] == -1:points.append((i, col))else:breakexcept IndexError as err:# print("Ignore row error.")continue# 向下方搜索for i in range(row + 1, 19):try:if self.game_map[i, col] == -1:points.append((i, col))else:breakexcept IndexError as err:# print("Ignore row error.")continuereturn points

然后拿着这些点进行遍历,看看是否存在可以经过一个拐点和另一个目标点连接的。存在,则可以两拐点链接。

最终判断两个拐点的完整代码: 

# 判断两个拐点
def two_corner(self, row1: int, col1: int, row2: int, col2: int) -> bool:for item in self.collect_points(row1, col1):if self.one_corner(item[0], item[1], row2, col2):return Truefor item in self.collect_points(row2, col2):if self.one_corner(item[0], item[1], row1, col1):return Truereturn False

 

5、判断是否可以连接

符合任意一种连接方式即可认定为可以连接。

# 判断是否可以连接
def erasable(self, row1: int, col1: int, row2: int, col2: int) -> bool:flag_no_corner = (self.horizon(row1, col1, row2, col2)) or (self.vertical(row1, col1, row2, col2))flag_corner = (self.one_corner(row1, col1, row2, col2)) or (self.two_corner(row1, col1, row2, col2))return flag_no_corner or flag_corner

【本片完】

【下一篇:连连看(四)—— 你看我这鼠标比用户还真(Pymouse 的替身)】

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/mOWsVYeN.shtml

相关文章

连点成线

做技术和做产品都需要沉心深研。做技术侧重对物性的理解,突破原有限制,创造新的领域; 做产品侧重对人性的理解,善于使用技术,创造简单易用的服务。技术需要落地于产品,展示其威力; 产品需要新技术的引擎&am…

图解计算机基础网站上线了

大家好,我是小林。 就在昨天 4 点半,我收到了工信部的短信,通知了我的域名备案完成了! 足足等待了一周,域名终于备案完了,久等了各位!心急的小伙伴,可以到末尾见直接看网站域名。 …

股票K线几种线型基本规则

1.经典蜡烛图&#xff1a; K线颜色&#xff1a; 如果收盘价格 > 开盘价格则是涨色&#xff1b; 如果收盘价格 < 开盘价格则是跌色&#xff1b; 如果收盘价格 开盘价格&#xff0c;则判断收盘价格 > 昨收价格是涨色反之是跌色。 K线形状&#xff1a; 中间垂直线…

5.1、【 K线图的练习】

有经验的股民都知道K线基本功的重要性。在早些时候不依靠其他的一些量化指标&#xff0c;仅凭老股民对K线的理解&#xff0c;就可以做到不错的收益率。 各种k线组合&#xff0c;比如黄昏星、启明星&#xff0c;多方炮&#xff0c;乌云盖顶。。。几十种最基本的经典k线信号&…

如何看k线图的图解法

K线图是黄金白银投资分析的基础手段&#xff0c;我们建议大家认真理解关于k线图的基础知识&#xff0c;掌握好如何看k线图图解的方式&#xff0c;如果能将相关知识融会贯通&#xff0c;日后的投资就等于成功了一大半。   K线图直观、立体感强、信息丰富的特点&#xff0c;通过…

一步一步教你写股票走势图——K线图四(高亮联动一)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

连连看(五)

Python3 实现QQ游戏连连看游戏辅助 连连看&#xff08;零&#xff09;—— 前记连连看&#xff08;一&#xff09;—— 你看&#xff0c;这是截图啊连连看&#xff08;二&#xff09;—— 哦吼&#xff0c;PIL CV2 Numpy 假图像识别构建矩阵连连看&#xff08;三&#xff09…

如何看k线图图解

K线图是贵金属投资者进行技术分析的基础手段&#xff0c;建议刚刚接触朋友认真理解关于k线图的基础知识&#xff0c;如果能掌握好K线&#xff0c;日后的学习看盘和技术分析就会容易得多。 K线图直观、立体感强&#xff0c;而且信息丰富&#xff0c;是金融投资分析中最常用和最基…

【数据结构和算法】超多图解,超详细,堆详解

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊! 🎈 关注专栏:图解数据结构和算法 (优质好文持续更新中……)🚀 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬 目录

图中的十字链表

转载于:https://www.cnblogs.com/qxym2016/p/7434591.html

2021韩顺平图解linux_狗剩学习笔记

韩顺平图解Linux全面升级 https://www.bilibili.com/video/BV1Sv411r7vd 27 小时 、153 讲&#xff0c; 2021 韩顺平 一周学会Linux 简介 目录 P001_韩顺平图解Linux全面升级_课程内容 20:37 P002_韩顺平图解Linux全面升级_应用领域 05:05 P003_韩顺平图解Linux全面升级…

中点画线完整算法c语言,中点画线算法

在网上看中点画线算法&#xff0c;很多说法是中点画线类似于Breshehanm画线。 但是助教说的中点画线是寻找直线两端点的中点进行画点&#xff0c;然后分别递归左右半段直线。 当年不好好学习&#xff0c;递归掌握的不好&#xff0c;现在自己试了试&#xff0c;可谓小费时。 代码…

图文详解超五类网线的接法

如何做网线&#xff1f;如何检测网线是否做好&#xff1f;详见网线及网络水晶头接法图解网线如五类&#xff0c;超五类网线和六类被广泛用于企业网络、数据中心网络或者家庭网络中&#xff0c;越来越多的网线类型正逐渐被发明出来&#xff0c;它们可以支持不同的传输距离和应用…

地图制图小技巧_点匹配线方向

目录 目的 实现步骤 功能介绍 功能入口 关键参数 结果 问题延伸 目的 我们在配图的时候&#xff0c;会遇到一种特定的需求&#xff1a;需要对点设置一个风格&#xff0c;并且符号风格自动跟相连或者相交的线保持垂直。 这种是否能够在SuperMap iDesktopX中自动实现呢&#xff0…

4.点与线

点与线 常用方法 glBegin与glEnd OpenGL的图元绘制放在函数glBegin和glEnd之间&#xff0c;由函数glBegin的参数指定绘制图元的类型。 结构类似于: glBegin(XXXXXX);xxxxxxxxxxxxxxglEnd();其中&#xff0c;glBegin后可填参数&#xff0c;来确定要绘制的图元类型 模式图元类…

图解24种经典k线图

相信不少国内的老股民心中都藏着一份经典的K线图图解&#xff0c;当中也许有6种、12种或24种能揭示行情方向转变的“K线脸谱”&#xff0c;借由它们的对行情的预知作用&#xff0c;股民度过一次又一次的熊牛更替。其实只要善于变通&#xff0c;它们同样适用于贵金属投资&#x…

直线绘制算法-中点画线法

之前讲过用数值积分法(DDA)进行直线逼近&#xff0c;通过向下取整获取目标像素点。计算过程中每一次都需要加0.5这一浮点数&#xff0c;浮点数运算效率相比整数运算效率低的多&#xff0c;因此需要对此进行改进。 一.中点画线法 直线方程式通过一般式表示&#xff1a;&#x…

3分钟看懂五日均线图!最实用的五日均线图解教程!

3分钟看懂五日均线图&#xff01;最实用的五日均线图解教程&#xff01; 均线并不是技术环境分析的全部内容&#xff0c;但无疑是技术环境中不可或缺的重要组成部分。均线代表的是市场平均成本运行趋势&#xff0c;其重要性在于反映现行价格得到支撑或受到压制的情况&#xff…

连连看(四)

Python3 实现QQ游戏连连看游戏辅助 连连看&#xff08;零&#xff09;—— 前记连连看&#xff08;一&#xff09;—— 你看&#xff0c;这是截图啊连连看&#xff08;二&#xff09;—— 哦吼&#xff0c;PIL CV2 Numpy 假图像识别构建矩阵连连看&#xff08;三&#xff09…

java基础2

1、mysql语句执行顺序 from on join where group by having select distinct union order by 我们看到on是在join和where前面的 如果两张表的数据量都比较大的话&#xff0c;那样就会占用很大的内存空间这显然是不合理的。所以&#xff0c;我们在进行表连接查询的时候一般都会…