Python 连连看连接算法


Posted in Python onNovember 22, 2008

功能:为连连看游戏提供连接算法
说明:模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。
其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁
模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点
使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面
模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False

#-*-coding:utf-8-*- 
"""连连看连接算法 为连连看游戏提供连接算法 
模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。 
其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁 
模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点 
使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面 
模块中核心的方法是link,通过提供源点和终点,可尝试连接两点,如果可以连接则返回保存路径的path列表,否则返回False 
""" 
import random 
__author__ ="http://blog.csdn.net/anhulife" 
__license__ ="python" 
class Point: 
"""Point类 
Point类是游戏中基本单元:“点” 
""" 
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): 
"""构造点的方向集 
每个点在连接的过程中都持有一个方向集,这个方向集中保存着该点的前进方向选择的优先级 
优先级:指向目标点的方向级别最高,在同等级别并且遵循x方向优先于y方向 
""" 
self.directs = list() 
stx = target.x - self.x 
sty = target.y - self.y 
if stx >= 0 : 
self.directs.append("right") 
self.directs.append("left") 
else: 
self.directs.append("left") 
self.directs.append("right") 
if sty >= 0 : 
self.directs.insert(1,"up") 
self.directs.append("down") 
else: 
self.directs.insert(1,"down") 
self.directs.append("up") 
if pre == None : 
return 
spx = pre.x - self.x 
spy = pre.y - self.y 
if spx == 0 : 
if spy == 1: 
self.directs.remove("up") 
else: 
self.directs.remove("down") 
else : 
if spx == 1: 
self.directs.remove("right") 
else: 
self.directs.remove("left") 
def forward(self,pre,target): 
"""点的前进动作 
点的前进即是依次从方向集中取出优先级高的方向,并判断该方向上的下一个点是否被填充 
如果没有被填充则说明该方向可通,并返回该方向。否则试探下一个方向,如果方向集中没有方向可用了,则返回None 
""" 
if self.directs == None : 
self.__createDirect(pre,target) 
if len(self.directs) == 0 : 
return None 
direct = None 
while(True): 
if len(self.directs) == 0 : 
break 
tmpDirect = self.directs.pop(0) 
if tmpDirect == "up" : 
x = self.x 
y = self.y + 1 
elif tmpDirect == "down": 
x = self.x 
y = self.y - 1 
elif tmpDirect == "left": 
x = self.x - 1 
y = self.y 
elif tmpDirect == "right": 
x = self.x + 1 
y = self.y 
p = points[x][y] 
if p.value > 0 and p != target: 
continue 
else : 
direct = tmpDirect 
if pre == None: 
self.changed = 1 
else: 
if (pre.x - self.x) == 0 and (p.x - self.x) == 0: 
self.changed = 0 
else: 
if (pre.y - self.y) == 0 and (p.y - self.y) == 0: 
self.changed = 0 
else : 
self.changed = 1 
break 
return direct 
def isChanged(self): 
"""判断方向变化 
返回在该点前进时,是否带来了方向的变化,即方向不同于原方向 
""" 
return self.changed 
def __eq__(self,p): 
if p == None : 
return False 
if self.x == p.x and self.y == p.y : 
return True 
else: 
return False 
points = list() 
def createPoints(w,h): 
"""构造游戏界面的点 
初始化界面中的所有的点,并且规则如下: 
最外一层是“墙壁”点,接下来的一层是没有被填充的点,被包裹的是填充的点 
""" 
r = random.randint 
for x in range(w): 
temp = list() 
for y in range(h): 
if x == 0 or x == (w-1) or y == 0 or y == (h-1): 
temp.append(Point(x,y,9)) 
else: 
if x == 1 or x == (w-2) or y == 1 or y == (h-2): 
temp.append(Point(x,y,0)) 
else: 
temp.append(Point(x,y,r(1,8))) 
points.append(temp) 
def link(source,target): 
"""点的连接 
连接方法的思想:针对源点的每个方向尝试前进,如果可以前进,则将针对该方向上的下个点的每个方向尝试前进 
当一个点的可选方向都不能前进的时候,则返回到已有前进路径中的前一个点,尝试该点其他可选方向。当回源点 
的每个方向都走不通或是路径的方向变化等于4的时候,连接失败返回False。否则当路径连接到目标点而且路径的方向变化小 
于4的时候,连接成功返回路径 
""" 
if source == target: 
return False 
path = list() 
change = 0 
current = source 
while True: 
if current==target and change < 4: 
for p in path: 
p.directs = None 
return path 
if change == 4: 
current.directs = None 
current = path.pop(len(path)-1) 
change = change - current.isChanged() 
continue 
if change == 0: 
direct = current.forward(None,target) 
else: 
direct = current.forward(path[len(path)-1],target) 
if direct != None: 
change = change + current.isChanged() 
if direct == "up" : 
x = current.x 
y = current.y + 1 
elif direct == "down": 
x = current.x 
y = current.y - 1 
elif direct == "left": 
x = current.x - 1 
y = current.y 
elif direct == "right": 
x = current.x + 1 
y = current.y 
print x,y 
path.append(current) 
current = points[x][y] 
else: 
if change == 0: 
return False 
else: 
current.directs = None 
current = path.pop(len(path)-1) 
change = change - current.isChanged() 
createPoints(8,8) 
p = link(points[2][2],points[5][2]) 
print p
Python 相关文章推荐
Python实现简易端口扫描器代码实例
Mar 15 Python
Python打印输出数组中全部元素
Mar 13 Python
基于python OpenCV实现动态人脸检测
May 25 Python
python3去掉string中的标点符号方法
Jan 22 Python
Puppeteer使用示例详解
Jun 20 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
python3 logging日志封装实例
Apr 08 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
Python进行统计建模
Aug 10 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
python sqlobject(mysql)中文乱码解决方法
Nov 14 #Python
Python转码问题的解决方法
Oct 07 #Python
Python函数学习笔记
Oct 07 #Python
Python日期操作学习笔记
Oct 07 #Python
wxPython 入门教程
Oct 07 #Python
新手该如何学python怎么学好python?
Oct 07 #Python
Python 调用VC++的动态链接库(DLL)
Sep 06 #Python
You might like
PHP session常见问题集锦及解决办法总结
2007/03/18 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
Python冲顶大会 快来答题!
2018/01/17 Python
django中静态文件配置static的方法
2018/05/20 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python模拟斗地主发牌
2020/04/22 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
材料工程专业毕业生求职信
2014/03/04 职场文书
党员承诺书内容
2014/03/26 职场文书
志愿者事迹材料
2014/12/26 职场文书
给医院的感谢信
2015/01/21 职场文书
学术会议邀请函
2015/01/30 职场文书
介绍信如何写
2015/01/31 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书