TC官方合作论坛

 找回密码
 立即注册
查看: 1201|回复: 3

[已解决] 连连看的算法与思路

[复制链接]
发表于 2016-8-23 21:59:03 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
谁有连连看的算法思路给个呗 亲!
回复

使用道具 举报

发表于 2016-8-24 07:36:33 | 显示全部楼层
我这还有源码呢 不过是在去年、也是学俩月后做的,日子久了连我自己都看不懂了---关键也没心情了。
  1. 功能 连连看()
  2.     启动=2
  3.     变量 待消=1
  4.     循环(待消>0)
  5.         变量 初步搜索=dm.FindPicEx(0,0,1000,1000,图片串集,"0c0c0c",0.9,0)
  6.         如果(字符串长度(初步搜索)>2)
  7.             遍历(变量 i = 0; i < 20; i++)
  8.                 变量 单图集=数组(),单图组,连成=0,mx,my,nx,ny,zhm,zhn
  9.                 变量 单图串=dm.FindPicEx(0,0,1000,1000,图片集[i],"0c0c0c",0.9,0)
  10.                 变量 dts=字符串分割(单图串,"|",单图组)
  11.                 如果(dts>1)
  12.                     遍历(变量 u = 0; u < dts; u++)
  13.                         变量 单组
  14.                         字符串分割(单图组[u],",",单组)
  15.                         数组增加元素(单图集,单组,null)
  16.                     结束
  17.                     遍历(变量 u = 0; u < dts; u++)
  18.                         遍历(变量 v = 0; v < dts; v++)
  19.                             如果(u!=v)
  20.                                 mx=取整(单图集[u][1])
  21.                                 my=取整(单图集[u][2])
  22.                                 nx=取整(单图集[v][1])
  23.                                 ny=取整(单图集[v][2])
  24.                                 如果((数学绝对值(mx-nx)<2&&数学绝对值(my-ny)<40)||(数学绝对值(mx-nx)<40&&数学绝对值(my-ny)<2))
  25.                                     连成=1
  26.                                     跳出
  27.                                 结束
  28.                                 zhm=纵横分析(mx,my)
  29.                                 zhn=纵横分析(nx,ny)
  30.                                 如果(线性判断(zhm,zhn))
  31.                                     连成=1
  32.                                     跳出
  33.                                 结束
  34.                             结束
  35.                         结束
  36.                         如果(连成==1)
  37.                             跳出
  38.                         结束
  39.                     结束
  40.                 结束
  41.                 如果(连成==1)
  42.                     dm.MoveTo((mx+15),(my+15))
  43.                     dm.LeftClick()
  44.                     等待(600)
  45.                     dm.MoveTo((nx+15),(ny+15))
  46.                     dm.LeftClick()
  47.                     等待(400)
  48.                     跳出
  49.                 否则如果(连成==0&&i==19)
  50.                     待消=0
  51.                     调试输出("没有可用图形")
  52.                 结束
  53.             结束
  54.         否则
  55.             调试输出("没发现适用图形")
  56.             跳出
  57.         结束
  58.     结束
  59.     启动=0
  60. 结束

  61. 功能 纵横分析(m,n)
  62.     变量 方位=数组("","","",""),图位=数组(-1,-1,-1,-1)
  63.     方位[0]=dm.FindPicEx(0,(n-1),m,(n+32),图片串集,"0c0c0c",0.9,0)//左空
  64.     方位[1]=dm.FindPicEx((m+30),(n-1),1000,(n+32),图片串集,"0c0c0c",0.9,0)//右空
  65.     方位[2]=dm.FindPicEx((m-1),0,(m+32),n,图片串集,"0c0c0c",0.9,0)//上空
  66.     方位[3]=dm.FindPicEx((m-1),(n+30),(m+32),1000,图片串集,"0c0c0c",0.9,0)//下空
  67.     遍历(变量 i = 0; i < 4; i++)
  68.         如果(字符串长度(方位[i])>2)
  69.             变量 lt=dm.FindNearestPos(方位[i],0,m,n)
  70.             变量 tz
  71.             字符串分割(lt,",",tz)
  72.             选择(i)
  73.                 条件 0
  74.                 图位[i]=取整(tz[1])+31
  75.                 条件 1
  76.                 图位[i]=取整(tz[1])-1
  77.                 条件 2
  78.                 图位[i]=取整(tz[2])+31
  79.                 条件 3
  80.                 图位[i]=取整(tz[2])-1
  81.             结束
  82.         否则
  83.             如果(i==0||i==2)
  84.                 图位[i]=0
  85.             否则
  86.                 图位[i]=1000
  87.             结束
  88.         结束
  89.     结束
  90.     返回 图位
  91. 结束

  92. 功能 线性判断(m,n)
  93.     如果(数学绝对值(m[0]-n[0])<5&&数学绝对值(m[1]-n[1])<5&&(m[3]+5)>n[2]&&(n[3]+5)>m[2])
  94.         返回 真
  95.     否则如果(数学绝对值(m[2]-n[2])<5&&数学绝对值(m[3]-n[3])<5&&(m[1]+5)>n[0]&&(n[1]+5)>m[0])   
  96.         返回 真
  97.     否则
  98.         返回 假
  99.     结束
  100. 结束
复制代码

(插句广告:结账后为啥不给打款?我心里一直有你、你难道早已忘记我了吗? 说谁谁知道...)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-23 21:59:12 | 显示全部楼层
沙发
回复

使用道具 举报

发表于 2016-8-24 00:46:36 | 显示全部楼层
想做连连看,首先第一步是你要获取棋盘数据。这一步不难吧?图色的话,相对位置找图或者找色 一般都能解决。
其次就是算法问题,这个是重点
第一种情况:x轴或y轴 相同 且2个目标点之间没有障碍物的。这种判断简单。(直连)
第二种情况:x轴 y轴不同。这种情况分支判断比较多一点。
重点说一下第二种情况。 image079.png
如上图。
有2种分支。一种是只转一个弯的,一种是转两个弯。
其实我想说的是,看似2种分支,其实转两个弯是在转一个弯的基础上在转一次而已。条件就是没到达目标点的相同轴数(比如x相同或y相同。)时 有障碍物。这时候就需要转2个弯。。你只需要判断转一个弯有没有障碍物堵路,和转两个弯有没有障碍物堵路就可以了。
第三种情况:相同轴,但是中间有障碍物。第二种情况的延伸。
这种情况出现的话 你需要往反轴去走。比如是x轴相同的话,你需要往y轴去走。 这时候还有2种方向,如果你2个目标点不在顶部或底部的时候。你需要以你当前2个点的Y轴去做两种方向计算。正方向和反方向。基本上大概就是如下图
无标题.png

总结一下,就是 往目标方向走(x轴和y轴),如果没遇到障碍物就走到相同坐标(x轴和y轴)为止,有遇到障碍物就转弯(第一次转弯) 然后再走到相同坐标或遇到障碍物就可以pass了。这时候还需要一条直连(第二次转弯)。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-6-10 07:54 , Processed in 0.048773 second(s), 26 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表