#-*-coding:utf-8-*-
"""連連看連線演算法
為連連看遊戲提供連線演算法
模組中包含乙個point類,該類是遊戲的基本單元「點」,該類包含屬性:x,y,value。
其中x,y代表了該點的座標,value代表該點的特徵:0代表沒有被填充,1-8代表被填充為遊戲圖案,9代表被填充為牆壁
模組中還包含乙個名為points的point列表,其中儲存著整個遊戲介面中的每個點
使用模組的時候應首先呼叫createpoints方法,初始化遊戲介面中每個點,然後可通過points訪問到每個點,繼而初始化介面
模組中核心的方法是link,通過提供源點和終點,可嘗試連線兩點,如果可以連線則返回儲存路徑的path列表,否則返回false
import random
__author__ =""
__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 :
else:
if sty >= 0 :
self.directs.insert(1,"up")
else:
self.directs.insert(1,"down")
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):
else:
if x == 1 or x == (w-2) or y == 1 or y == (h-2):
else:
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
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 連連看連線演算法
功能 為連連看遊戲提供連線演算法 說明 模組中包含乙個point類,該類是遊戲的基本單元 點 該類包含屬性 x,y,value。其中x,y代表了該點的座標,value代表該點的特徵 0代表沒有被填充,1 8代表被填充為遊戲圖案,9代表被填充為牆壁 模組中還包含乙個名為points的point列表,其...
連連看演算法
前幾天看了下a 演算法,發現並不能實現連連看。a 演算法是尋找最短路徑的一種高效率的演算法,而連連看的路徑並不一定是最短的。連連看的路徑最多只能轉折3次,因此判斷兩點的可延伸點是否有重複的,如果有,折為0或1 可消除,如果沒有,再判斷每個延伸點的延伸點與目標點的延伸點是否有重複的,有則表示可以消除並...
妙語連連看
我拿出一枚硬幣來拋,如果正面朝上你將幸福一生,反面朝上你將幸福一世。但它偏偏立了起來!老天說沒辦法,就讓你幸福一生一世吧!中秋節快樂!朋友比領導重要,能力比知識重要,健康比業績重要,水平比文憑重要,情商比智商重要,星期日比平時重要,我的問候比送月餅重要!嘿嘿。中秋快樂。月到中秋分外明,節日喜氣伴您行...