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 version 2.7 required, which was not found in the registry
Aug 26 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
Python网络爬虫实例讲解
Apr 28 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
PyCharm配置mongo插件的方法
Nov 30 Python
详解python算法之冒泡排序
Mar 05 Python
Django框架自定义session处理操作示例
May 27 Python
python django生成迁移文件的实例
Aug 31 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
用PHP制作的意见反馈表源码
2007/03/11 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
python实现哈希表
2014/02/07 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
如何让python的运行速度得到提升
2020/07/08 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
财务会计应届生求职信
2013/11/24 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
单位工作证明书格式
2014/10/04 职场文书
社区综治工作汇报
2014/10/27 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
Django使用redis配置缓存的方法
2021/06/01 Redis