最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 連連看連接算法

 更新時(shí)間:2008年11月22日 22:02:25   作者:  
這段時(shí)間老是“不務(wù)正業(yè)”的搞一些東西玩。之前的貪吃蛇,俄羅斯方塊激發(fā)了我研究游戲算法的興趣。經(jīng)過(guò)1個(gè)星期的構(gòu)思,連連看的連接算法終于出爐了。再過(guò)一段時(shí)間就基于這個(gè)算法使用JavaScript推出網(wǎng)頁(yè)版的連連看。下面是說(shuō)明及代碼。
功能:為連連看游戲提供連接算法
說(shuō)明:模塊中包含一個(gè)Point類(lèi),該類(lèi)是游戲的基本單元“點(diǎn)”,該類(lèi)包含屬性:x,y,value。
其中x,y代表了該點(diǎn)的坐標(biāo),value代表該點(diǎn)的特征:0代表沒(méi)有被填充,1-8代表被填充為游戲圖案,9代表被填充為墻壁
模塊中還包含一個(gè)名為points的Point列表,其中保存著整個(gè)游戲界面中的每個(gè)點(diǎn)
使用模塊的時(shí)候應(yīng)首先調(diào)用createPoints方法,初始化游戲界面中每個(gè)點(diǎn),然后可通過(guò)points訪問(wèn)到每個(gè)點(diǎn),繼而初始化界面
模塊中核心的方法是link,通過(guò)提供源點(diǎn)和終點(diǎn),可嘗試連接兩點(diǎn),如果可以連接則返回保存路徑的path列表,否則返回False

復(fù)制代碼 代碼如下:

#-*-coding:utf-8-*-
"""連連看連接算法

為連連看游戲提供連接算法
模塊中包含一個(gè)Point類(lèi),該類(lèi)是游戲的基本單元“點(diǎn)”,該類(lèi)包含屬性:x,y,value。
其中x,y代表了該點(diǎn)的坐標(biāo),value代表該點(diǎn)的特征:0代表沒(méi)有被填充,1-8代表被填充為游戲圖案,9代表被填充為墻壁
模塊中還包含一個(gè)名為points的Point列表,其中保存著整個(gè)游戲界面中的每個(gè)點(diǎn)
使用模塊的時(shí)候應(yīng)首先調(diào)用createPoints方法,初始化游戲界面中每個(gè)點(diǎn),然后可通過(guò)points訪問(wèn)到每個(gè)點(diǎn),繼而初始化界面
模塊中核心的方法是link,通過(guò)提供源點(diǎn)和終點(diǎn),可嘗試連接兩點(diǎn),如果可以連接則返回保存路徑的path列表,否則返回False
"""
import random

__author__ ="http://blog.csdn.net/anhulife"
__license__ ="python"

class Point:
"""Point類(lèi)

Point類(lèi)是游戲中基本單元:“點(diǎn)”
"""
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):
"""構(gòu)造點(diǎn)的方向集

每個(gè)點(diǎn)在連接的過(guò)程中都持有一個(gè)方向集,這個(gè)方向集中保存著該點(diǎn)的前進(jìn)方向選擇的優(yōu)先級(jí)
優(yōu)先級(jí):指向目標(biāo)點(diǎn)的方向級(jí)別最高,在同等級(jí)別并且遵循x方向優(yōu)先于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):
"""點(diǎn)的前進(jìn)動(dòng)作

點(diǎn)的前進(jìn)即是依次從方向集中取出優(yōu)先級(jí)高的方向,并判斷該方向上的下一個(gè)點(diǎn)是否被填充
如果沒(méi)有被填充則說(shuō)明該方向可通,并返回該方向。否則試探下一個(gè)方向,如果方向集中沒(méi)有方向可用了,則返回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):
"""判斷方向變化

返回在該點(diǎn)前進(jìn)時(shí),是否帶來(lái)了方向的變化,即方向不同于原方向
"""
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):
"""構(gòu)造游戲界面的點(diǎn)

初始化界面中的所有的點(diǎn),并且規(guī)則如下:
最外一層是“墻壁”點(diǎn),接下來(lái)的一層是沒(méi)有被填充的點(diǎn),被包裹的是填充的點(diǎn)
"""
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):
"""點(diǎn)的連接

連接方法的思想:針對(duì)源點(diǎn)的每個(gè)方向嘗試前進(jìn),如果可以前進(jìn),則將針對(duì)該方向上的下個(gè)點(diǎn)的每個(gè)方向嘗試前進(jìn)
當(dāng)一個(gè)點(diǎn)的可選方向都不能前進(jìn)的時(shí)候,則返回到已有前進(jìn)路徑中的前一個(gè)點(diǎn),嘗試該點(diǎn)其他可選方向。當(dāng)回源點(diǎn)
的每個(gè)方向都走不通或是路徑的方向變化等于4的時(shí)候,連接失敗返回False。否則當(dāng)路徑連接到目標(biāo)點(diǎn)而且路徑的方向變化小
于4的時(shí)候,連接成功返回路徑
"""
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

相關(guān)文章

  • 詳解Flask前后端分離項(xiàng)目案例

    詳解Flask前后端分離項(xiàng)目案例

    這篇文章主要介紹了Flask前后端分離項(xiàng)目案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python中的省略號(hào)(Ellipsis)賦值方式詳解

    Python中的省略號(hào)(Ellipsis)賦值方式詳解

    在Python編程中,省略號(hào)(...)是一種特殊對(duì)象,主要用作函數(shù)占位、未實(shí)現(xiàn)的方法示例和NumPy數(shù)組處理,本文通過(guò)示例詳細(xì)解釋了省略號(hào)的賦值方式及其在不同編程場(chǎng)景下的應(yīng)用,幫助提升Python編程技巧
    2024-10-10
  • 深入分析python數(shù)據(jù)挖掘 Json結(jié)構(gòu)分析

    深入分析python數(shù)據(jù)挖掘 Json結(jié)構(gòu)分析

    這篇文章通過(guò)實(shí)例給大家分析總結(jié)了python數(shù)據(jù)挖掘以及Json結(jié)構(gòu)分析的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友參考下。
    2018-04-04
  • python實(shí)現(xiàn)的守護(hù)進(jìn)程(Daemon)用法實(shí)例

    python實(shí)現(xiàn)的守護(hù)進(jìn)程(Daemon)用法實(shí)例

    這篇文章主要介紹了python實(shí)現(xiàn)的守護(hù)進(jìn)程(Daemon)用法,實(shí)例分析了Python進(jìn)程操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • pandas使用函數(shù)批量處理數(shù)據(jù)(map、apply、applymap)

    pandas使用函數(shù)批量處理數(shù)據(jù)(map、apply、applymap)

    這篇文章主要介紹了pandas使用函數(shù)批量處理數(shù)據(jù)(map、apply、applymap),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • opencv?傅里葉變換的實(shí)現(xiàn)

    opencv?傅里葉變換的實(shí)現(xiàn)

    本文主要介紹了opencv?傅里葉變換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • python unix時(shí)間戳轉(zhuǎn)換毫秒的實(shí)現(xiàn)

    python unix時(shí)間戳轉(zhuǎn)換毫秒的實(shí)現(xiàn)

    Unix時(shí)間戳是一種常見(jiàn)的時(shí)間表示方式,本文主要介紹了python unix時(shí)間戳轉(zhuǎn)換毫秒的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • win10環(huán)境下配置vscode python開(kāi)發(fā)環(huán)境的教程詳解

    win10環(huán)境下配置vscode python開(kāi)發(fā)環(huán)境的教程詳解

    這篇文章主要介紹了win10環(huán)境下配置python開(kāi)發(fā)環(huán)境(vscode)的教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • pytorch教程實(shí)現(xiàn)mnist手寫(xiě)數(shù)字識(shí)別代碼示例

    pytorch教程實(shí)現(xiàn)mnist手寫(xiě)數(shù)字識(shí)別代碼示例

    這篇文章主要講解了pytorch教程中如何實(shí)現(xiàn)mnist手寫(xiě)數(shù)字識(shí)別,文中附有詳細(xì)的代碼示例,test準(zhǔn)確率98%,有需要的朋友可以借鑒參考下
    2021-09-09
  • python 命令行傳參方法總結(jié)

    python 命令行傳參方法總結(jié)

    這篇文章主要介紹了python 命令行傳參方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評(píng)論

嫩江县| 应城市| 平和县| 万荣县| 金秀| 南川市| 柳林县| 茶陵县| 南郑县| 六安市| 金阳县| 白银市| 通许县| 农安县| 平凉市| 科技| 分宜县| 靖边县| 浦东新区| 奎屯市| 宁津县| 凤城市| 郯城县| 保定市| 于田县| 綦江县| 本溪市| 长春市| 苏尼特右旗| 华坪县| 大连市| 南宫市| 保山市| 通化市| 城步| 班戈县| 德兴市| 德昌县| 肇庆市| 柞水县| 太和县|