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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
Python随机生成一个6位的验证码代码分享
Mar 24 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
浅谈Python在pycharm中的调试(debug)
Nov 29 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
python实现用户名密码校验
Mar 18 Python
python属于跨平台语言码
Jun 09 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
python中使用asyncio实现异步IO实例分析
Feb 26 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
php通过字符串调用函数示例
2014/03/02 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
一个简单的javascript类定义例子
2009/09/12 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
python实现快递价格查询系统
2020/03/03 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
高一政治教学反思
2014/01/28 职场文书
银行办公室岗位职责
2014/03/10 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
预备党员综合考察材料
2014/05/31 职场文书
个人委托书
2014/07/31 职场文书
婚庆司仪开场白
2015/05/29 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
MySQL分区以及建索引的方法总结
2022/04/13 MySQL
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android