这段时间老是“不务正业”的搞一些东西玩。之前的贪吃蛇,俄罗斯方块激发了我研究游戏算法的兴趣。经过1个星期的构思,连连看的连接算法终于出炉了。再过一段时间就基于这个算法使用JavaScript推出网页版的连连看。下面是说明及代码。
功能:为连连看游戏提供连接算法
说明:模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。
其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁
模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点
使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面
模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False
鸣谢:感谢我的同学asy668(http://hi.baidu.com/myasy)完善这个算法中createPoints,帮助我测试这个算法,并为这个算法写了一个用户交互界面。
-
-
-
-
importrandom
-
importtime
-
__author__="http://blog.csdn.net/anhulife"
-
__license__="python"
-
classPoint:
-
-
-
def__init__(self,x,y,value):
-
self.x=x
-
self.y=y
-
self.value=value
-
self.directs=None
-
self.changed=0
-
def__createDirect(self,pre,target):
-
-
-
self.directs=list()
-
stx=target.x-self.x
-
sty=target.y-self.y
-
ifstx>=0:
-
self.directs.append("right")
-
self.directs.append("left")
-
else:
-
self.directs.append("left")
-
self.directs.append("right")
-
ifsty>=0:
-
self.directs.insert(1,"up")
-
self.directs.append("down")
-
else:
-
self.directs.insert(1,"down")
-
self.directs.append("up")
-
ifpre==None:
-
return
-
spx=pre.x-self.x
-
spy=pre.y-self.y
-
ifspx==0:
-
ifspy==1:
-
self.directs.remove("up")
-
else:
-
self.directs.remove("down")
-
else:
-
ifspx==1:
-
self.directs.remove("right")
-
else:
-
self.directs.remove("left")
-
defforward(self,pre,target):
-
-
-
ifself.directs==None:
-
self.__createDirect(pre,target)
-
iflen(self.directs)==0:
-
returnNone
-
direct=None
-
while(True):
-
iflen(self.directs)==0:
-
break
-
tmpDirect=self.directs.pop(0)
-
iftmpDirect=="up":
-
x=self.x
-
y=self.y+1
-
eliftmpDirect=="down":
-
x=self.x
-
y=self.y-1
-
eliftmpDirect=="left":
-
x=self.x-1
-
y=self.y
-
eliftmpDirect=="right":
-
x=self.x+1
-
y=self.y
- p=points[x][y]
-
ifp.value>0andp!=target:
-
continue
-
else:
- direct=tmpDirect
-
ifpre==None:
-
self.changed=1
-
else:
-
if(pre.x-self.x)==0and(p.x-self.x)==0:
-
self.changed=0
-
else:
-
if(pre.y-self.y)==0and(p.y-self.y)==0:
-
self.changed=0
-
else:
-
self.changed=1
-
break
-
returndirect
-
def__eq__(self,p):
-
ifp==None:
-
returnFalse
-
ifself.x==p.xandself.y==p.y:
-
returnTrue
-
else:
-
returnFalse
- points=list()
- valuestack=list()
-
defcreatePoints(w,h):
-
-
- r=random.randint
- random.seed(time.time())
- Pointstack(w,h)
-
forxinrange(w):
- temp=list()
-
foryinrange(h):
-
ifx==0orx==(w-1)ory==0ory==(h-1):
-
temp.append(Point(x,y,9))
-
else:
-
ifx==1orx==(w-2)ory==1ory==(h-2):
-
temp.append(Point(x,y,0))
-
else:
- temp.append(Point(x,y,valuestack.pop()))
- points.append(temp)
-
defPointstack(w,h):
-
size=w*h-(w*4+h*4-16)
-
size=size/2
- random.seed(time.time())
-
foriinrange(size):
-
value=random.randint(1,8)
-
iflen(valuestack)==0:
- valuestack.append(value)
- valuestack.append(value)
-
else:
-
valuestack.insert(random.randint(1,len(valuestack)),value)
-
valuestack.insert(random.randint(1,len(valuestack)),value)
-
deflink(source,target):
-
-
-
ifsource==target:
-
returnFalse
-
ifsource.value==9orsource.value==0:
-
returnFalse
- path=list()
- fail=dict()
-
change=0
- current=source
-
tempPoint=None
-
whileTrue:
-
ifcurrent==targetandchange<4:
-
forpinpath:
-
p.directs=None
-
returnpath
-
ifchange==4:
-
current.directs=None
-
fail[str(current.x)+"_"+str(current.y)]=change
- current=path.pop()
- change=change-current.changed
-
continue
-
ifcurrent==source:
-
direct=current.forward(None,target)
-
else:
-
direct=current.forward(path[len(path)-1],target)
-
ifdirect!=None:
-
ifdirect=="up":
- x=current.x
-
y=current.y+1
-
elifdirect=="down":
- x=current.x
-
y=current.y-1
-
elifdirect=="left":
-
x=current.x-1
- y=current.y
-
elifdirect=="right":
-
x=current.x+1
- y=current.y
-
iffail.has_key(str(x)+"_"+str(y)):
-
ifchange>=fail.get(str(x)+"_"+str(y)):
-
continue
-
else:
-
fail.pop(str(x)+"_"+str(y))
- change=change+current.changed
- path.append(current)
- current=points[x][y]
-
else:
-
ifcurrent==source:
-
source.directs=None
-
returnFalse
-
else:
-
current.directs=None
-
fail[str(current.x)+"_"+str(current.y)]=change
- current=path.pop()
- change=change-current.changed
-
-
-
分享到:
相关推荐
在写过Python版和JavaScript版连连看的算法后,特为JavaScript版连连看算法写了一个图形交互界面。至此完整的连连看游戏出炉了。
计算机二级考试今年新出的python程序设计,使python一时成为烫手山芋,火得不要不要的。
微软等数据结构+算法面试100题最后20题第81-100题新鲜出炉 ---100题系列V0.1版完整公布 作者:July 时间:2010年12月5日 ============= 首先,非常感谢各位,对本微软面试100题系列前期工作的大力支持。 很多很多...
2021年1月浙江高考英语续写题源出处和相关视频新鲜出炉!.pdf2021年1月浙江高考英语续写题源出处和相关视频新鲜出炉!.pdf2021年1月浙江高考英语续写题源出处和相关视频新鲜出炉!.pdf2021年1月浙江高考英语续写题源...
原创 python国密算法SM2 + 加解密及签名验签 + 调用jar包demo 新鲜出炉,亲测可用。疑问可留言咨询。
swift官方文档中文版(新鲜出炉)
有道词典4.3正式版发布 网页版单词本新鲜出炉.docx
新鲜出炉:Ubuntu12
新鲜出炉校园招聘技术类笔试题 新鲜出炉校园招聘技术类笔试题
这时一个国外的VB爱好者朋友给我的新的号称VB6.5版本的程序。 安装方法:下载后解压缩到你的VB6.0安装的目录下,覆盖掉原先的两个文件:VB6.EXE和vb6ide.dll 为了保险起见,请在解压缩之前备份原始的VB程序文件。...
上海科目一考试总结,新鲜出炉
面条十大创意吃法新鲜出炉.doc
Oracle产品信息管理数据中心新鲜出炉.pdf
win8新鲜出炉的精品好应用.docx
Arcgis engine 9.3 中文环境 新鲜出炉 用AE9.3开发的程序,由于客户要求中文,我用了许多AE 中的很多bean(比如toolbarbean),发布后是英文的。 于是百度,Google,搜AE9.3 中文环境,找了一下午都没有找到。 ...
2015年新鲜出炉SCI期刊(剔除期刊)
世界财富报告新鲜出炉澳洲人最为土豪.doc
dhtmlxSuite是一个用JavaScript建立的富客户端开发框架。它是一个JavaScript UI库,用于建立一个完整的具有Ajax能力的前台组件。用户可以使用它建立一个企业级的跨浏览器Web应用和移动应用程序,它能提供优秀的性能...
2019年中国互联网企业100强新鲜出炉.pdf
房地产 -2022年海南房价地图新鲜出炉 .pdf