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 信息同时输出到控制台与文件的实例讲解
May 11 Python
python3.5基于TCP实现文件传输
Mar 20 Python
python存储16bit和32bit图像的实例
Dec 05 Python
详解Python正则表达式re模块
Mar 19 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
flask 实现token机制的示例代码
Nov 07 Python
Python实现ATM系统
Feb 17 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
Django restful framework生成API文档过程详解
Nov 12 Python
Python 虚拟环境工作原理解析
Dec 24 Python
Python绘制分类图的方法
Apr 20 Python
Python实现简单的猜单词
Jun 15 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模板引擎SMARTY
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
python斐波那契数列的计算方法
2018/09/27 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
python 整数越界问题详解
2019/06/27 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
机械工程系毕业生求职信
2013/09/27 职场文书
家长写给孩子的评语
2014/04/18 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
单位委托书
2014/10/15 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript