连连看消除算法.docxVIP

  • 20
  • 0
  • 约2.4千字
  • 约 4页
  • 2024-03-06 发布于上海
  • 举报

连连看消除算法

说明:本算法为个人意愿,意在实现功能,并非最优,便于大家理解连连看游戏的实质。游戏规则:

连连看游戏的消除规则玩过了应该挺容易理解,就是两点之间只能用水平或者竖直线段连接,最多不能超过2个拐点。

所以分成了4种情况,

1、直接相连 3、Z型相连

2、转一次弯相连 4、U型相连

下面开始提出一种直观的算法:

我们来判断两个物体能否消除。

1、我们从一个物体出发,沿十字向外搜集直接相连点,遇到其他物体就终止当前方向搜索。对两个待判断的物体都进行十字点收集。

2、我们定义一下直接相连:两个点处于水平或者竖直位置,并且中间没有任何其他物体阻挡。

A、如果是处于消除情况1(直接相连)的情况,那么第二个点应该在第一个的十字搜集点上(直接连)

B、如果是处于消除情况2(转一次弯)的情况,那么物体1十字线上的某点肯

定能够和2直接相连

C、如果是处于消除情况3或者4,那么物体1十字线上的某点肯定能够和物体2

十字线上的某点直接相连

D、边界问题我们单独考虑,有的游戏规则中可以边界外走线,有的则不可以,这个对我们算法没有影响。

所以整个程序实现就简单了,伪代码:

函数A,判断两点是否可以直接消除

函数B,收集指定点十字方向全部直接相连点如果两点可直连则可消除

遍历2的直连点如果点1和点2十字中某点可直连则可消除遍历1,2的直连点如果有可直连点则可消除

给出一个没完成的python代码供参考:

Description:linklinkgameautosolveralgorithm.Author:winxos

Date:2011-05-18

importrandomsize=10

m=[[0forxinrange(size)]foryinrange(size)]defcreatemap():

defcreatepos():

return[random.randint(0,size-1),random.randint(0,size-1)]deffillpair(n):

a=createpos()whilem[a[0]][a[1]]!=0:

a=createpos()b=createpos()

whilem[b[0]][b[1]]!=0orb==a:

b=createpos()m[a[0]][a[1]]=n

m[b[0]][b[1]]=n

foriinrange(20):fillpair(random.randint(1,9))pass

defisdirectlink(a,b):#a,bispoint

#return1meanscanlinkdirectly

ifa[0]==b[0]anda[1]==b[1]:#samepointreturnfalsereturn0

ifa[0]==b[0]:#Vertical

ifa[0]==0ora[0]==size-1:#boundislinkablereturn1

sa=a[1]sb=b[1]

ifsbsa:#fieldfromsatosb,sasbsa=b[1]

sb=a[1]

foriinrange(sa+1,sb-1):

ifm[a[0]][i]!=0:

return0

return1

ifa[1]==b[1]:#Horizon

ifa[1]==0ora[1]==size-1:#boundislinkablereturn1

sa=a[0]sb=b[0]

ifsbsa:#fieldfromsatosb,sasbsa=b[0]

sb=a[0]

foriinrange(sa+1,sb-1):

ifm[i][a[1]]!=0:

return0

return1passreturn0

defonelinepoint(a):#returnthecrossdirectlylinkablepoints.r=[]

i=a[0]-1

whilem[i][a[1]]==0andi0:r.append([i,a[1]])

i-=1

i=a[0]+1

whilem[i][a[1]]==0andisize:r.append([i,a[1]])

i+=1j=a[1]-1

whilem[a[0]][j]==0andj0:r.append([a[0],j])

j-=1

j=a[1]+1

whilem[a[0]][j]==0andjsize:

r.append([a[0],j])

j+=

文档评论(0)

1亿VIP精品文档

相关文档