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 相关文章推荐
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
python简单实现获取当前时间
Aug 27 Python
python游戏地图最短路径求解
Jan 16 Python
详解Python循环作用域与闭包
Mar 21 Python
提升Python程序性能的7个习惯
Apr 14 Python
OpenCV图像颜色反转算法详解
May 13 Python
python字符串替换第一个字符串的方法
Jun 26 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
python TCP包注入方式
May 05 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 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实现文件下载断点续传详解
2014/10/15 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
jquery常用操作小结
2014/07/21 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
python issubclass 和 isinstance函数
2019/07/25 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python实现简单井字棋游戏
2020/03/04 Python
python的Jenkins接口调用方式
2020/05/12 Python
python三引号如何输入
2020/07/06 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
求职者简历中的自我评价
2013/10/20 职场文书
xxx同志考察材料
2014/02/07 职场文书
政风行风整改报告
2014/11/06 职场文书
医生个人年度总结
2015/02/28 职场文书
党员转正大会主持词
2015/07/02 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
nginx容器方式反向代理实战
2022/04/18 Servers