python連連看 Python 連連看連線演算法

2021-10-11 20:30:23 字數 4632 閱讀 4941

#-*-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 可消除,如果沒有,再判斷每個延伸點的延伸點與目標點的延伸點是否有重複的,有則表示可以消除並...

妙語連連看

我拿出一枚硬幣來拋,如果正面朝上你將幸福一生,反面朝上你將幸福一世。但它偏偏立了起來!老天說沒辦法,就讓你幸福一生一世吧!中秋節快樂!朋友比領導重要,能力比知識重要,健康比業績重要,水平比文憑重要,情商比智商重要,星期日比平時重要,我的問候比送月餅重要!嘿嘿。中秋快樂。月到中秋分外明,節日喜氣伴您行...