brython | 笨办法写个连连看-1.核心功能实现

前端大佬们不要笑话,运维小弟献丑了。

前段时间在码上掘金看见大佬用【文言文】写了一个连连看,于是乎突发奇想,能不能用brython也实现一个连连看呢? 顺便复习下python基础,于是乎,你们就看到了这个码上掘金项目 和 这篇文章了,但是不得不说,brython是真的没啥人用。

code.juejin.cn/pen/7159814…

关于【码上掘金】如何编写brython

这个在以前文章中就有讲述过初始化brython,本地和码上掘金的都有,这里不再啰嗦,如果有需要的话,可以翻看以下文章:

或者直接Fork下小弟初始化后的项目: code.juejin.cn/pen/7155678…

连连看定义的规则

连连看作为一个类似于棋牌游戏,其最终目的是将棋盘上的对象都清除掉。其规则简单来说,可以定义如下:

  • 一次只能选择2个点进行相连。

  • 相连的2点内容需要一致。

  • 2点之间的路径不能超过3条直线。

  • 2点连接成功后,则对其消除。

最终,将棋盘上的对象全部清除后,则赢得胜利。

查看规则后,我们知晓,第1点 、 第2点 以及 最后一点,都不是很复杂,第三点才是连连看的核心点,那么接下来,我们分析下第三点。

所谓的不超过3条直线,例如,我们想让蓝色框框的点相连

我们可以通过3条线相连,具体如下:

如下这样,是不行的。

因为想让蓝色的点相连,至少需要4条线,即:

笨办法判断2点是否相连

你可能在别的文章中看到,连连看判断是否能够相连,有几种方法,比如: 2点事垂直的或者是平行的、2点可以通过单拐实现、2点必须通过双拐实现。

本篇文章不会介绍如上方法,我们采取一个最笨办法,即:判断2点的延长线是否相交。

若相交了,则代表可以相连,这种情况一般出现在2点为直线或者是单拐的情况,若不相交,我们则需要判断下是否能够双拐实现。具体的,我们可以看如下案例:

相交的点

例如,我们想判断蓝色的点是否能够相连

我们将点位延长一下,只要是空格,都可以延长

延长后,我们找到了交点,则判断为可以相连。

再比如,平行的2个点

假设想对蓝色的2个点进行相连

将2个点都延长一下,我们发现了交点,则可以相连。

不相交的点

不想交的点,来判断能否相连,是最复杂的。但是使用相交法则,也有方法,例如如下2个点想连接,但是延长线后没有交点。

我们将2个点都给延长一下,发现并没有交点

在没有交点的情况下,我们可以尝试找下平行点是否相连,例如,这2个平行点可以相连

若平衡点都不相连的话,则无法进行连接,例如:

因为这2个点的相交点无法直接连接,且相交延长线的平行点也无法正常连接,即:

所以这2个点无法连接。

连连看核心编码实现

上述段落,我们已经分析了,2点能否相连,但是没有用代码实现,本段落,我们使用代码来模拟一下2点能否相连。

再次之前,我们需要模拟出如下的二维数组,来标定2点是否相连。

为此,我们使用python定义的列表如下:

maps = [
  [0,3,0,0,0,0,0],
  [0,9,0,0,0,0,0],
  [3,9,0,0,0,0,0],
  [5,0,0,0,5,6,0],
  [0,0,0,0,0,0,0],
  [0,0,8,9,7,0,0],
  [7,0,6,4,0,0,0]
]

其中0,代表空格,其他点位则是一一对应的。

收集点位信息,这里展示收集向上坐标的代码:

# 收集点位向上坐标的点位信息
def collecUp(x,y):
  # 定义空列表,用于收集值
  positions = []

  # 将点位向上移一格
  x = x - 1
  # 循环判断点位是否为0,直至到表格边界处
  while (x >= 0) and (x <= len(maps)-1) and (maps[x][y] == 0):
    positions.append([x,y])
    # 将点位向上移一格
    x = x - 1
  
  # 返回列表
  return positions

关于其他方位,可以通过本段落的【码上掘金】链接进行查看

我们来测试一下5,4点位周围的空格区域有哪些,我们修改程序函数如下:

collecPositions(5,4)

代码执行后,结果如下:

这个demo已经写好了,且放到了【码上掘金】中。

code.juejin.cn/pen/7163216…

如上,我们已经确定了某个点的点位信息,那么如何判断2个点是否相交呢? 我们仅需将点位给收集起来,而后判断一下是否有2个点点位信息一样就可以了,这段代码相对于较为简单,这里截图如下:

我们执行后,效果如下:

这个demo我也放到了【码上掘金】了,链接如下:

code.juejin.cn/pen/7163227…

若2个点,没有相交点,则我们就要判断2个点是否有平行点 或者是 垂直点了,这里也比较简单,直接给代码吧。

代码我也放到了【码上掘金】中,链接如下:

code.juejin.cn/pen/7163230…

最后我们测试的相连的点为:

  • 值为3,点位为:(0,1) 和 (2,0)
  • 值为5,点位为:(3,0) 和 (3,4)
  • 值为7,点位为:(6,0) 和 (5,4)
  • 值为6,点位为:(6,2) 和 (3,5)

效果如下:

总结

小弟在写相关项目的时候,一直坚持的思想是面向核心编程,什么意思呢? 就拿连连看举例来说,核心思想是判断2个点是否能够相连,所以我们一开始就写demo来判断2个点是否能够相连,将这个问题解决了其他外围问题不是迎刃而解了么? 害怕的是我们将外围写的花里胡哨,然而核心功能实现不了,岂不是功亏一篑。

好了,就这样吧,怎么样,觉得连连看有意思吧? 快动动你的小手指试试吧,此外,项目代码有注释哦,可以看看咯!

本文正在参加「金石计划 . 瓜分6万现金大奖」

posted @ 2022-11-07 22:09  pdudos  阅读(0)  评论(0编辑  收藏  举报  来源