Python 连连看连接算法
程序员文章站
2022-04-08 18:41:27
功能:为连连看游戏提供连接算法 说明:模块中包含一个point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。 其中x,y代表了该点的坐标,value代表...
功能:为连连看游戏提供连接算法
说明:模块中包含一个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
说明:模块中包含一个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
上一篇: 网页加载速度对排名有一定的影响
下一篇: C# 用户选择单个压缩-系统自带压缩