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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
Python单例模式实例详解
Mar 01 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
24式加速你的Python(小结)
Jun 13 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
解决Pycharm 运行后没有输出的问题
Feb 05 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
一个典型的PHP分页实例代码分享
2011/07/28 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python实现汉诺塔算法
2021/03/01 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
客房主管岗位职责
2013/12/09 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
元旦晚会主持词
2014/03/24 职场文书
团日活动总结书
2014/05/08 职场文书
责任心演讲稿
2014/05/14 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
Python实现照片卡通化
2021/12/06 Python
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电