機能: Lianliankan ゲームの接続アルゴリズムを提供します
説明: モジュールには、ゲームの基本単位「ポイント」である Point クラスが含まれます。このクラスには、属性 x、y、値が含まれます。
ここで、x と y はポイントの座標を表し、値はポイントの特性を表します: 0 は塗りつぶされていないことを表し、1 ~ 8 はゲーム パターンとして塗りつぶされたことを表し、9 は壁として塗りつぶされたことを表します
モジュールも同様ですゲーム インターフェイス全体のすべてのポイントを保存する、points という名前のポイント リストが含まれています
モジュールを使用するときは、まず createPoints メソッドを呼び出してゲーム インターフェイス内の各ポイントを初期化する必要があります。その後、ポイントを通じて各ポイントにアクセスできるようになります。次に、初期化インターフェイス
モジュールのコア メソッドはリンクです。ソース ポイントとエンド ポイントを指定すると、接続できる場合は保存されたパスのパス リストを返します。 return False
コードをコピー コードは次のとおりです:
#-*-coding:utf-8-*-
"""Lianliankan 接続アルゴリズム
Lianliankan ゲームの接続アルゴリズムを提供します
モジュールには Point クラスが含まれています。クラスはゲームの基本単位「ポイント」です。このクラスには属性が含まれます。1 ~ 8 はゲーム パターンとして塗りつぶされることを表し、9 は壁として塗りつぶされることを表します。
モジュールには、各ポイントを保存する Points という名前のポイント リストも含まれています。ゲーム インターフェイス全体で
モジュールを使用するときは、まず createPoints メソッドを呼び出してゲーム インターフェイスの各ポイントを初期化し、次にポイントを通じて各ポイントにアクセスして、 モジュールはリンクです。ソースポイントとエンドポイントを指定することで、2 つのポイントを接続することができます。接続できる場合は、保存されたパスのパスリストを返します。そうでない場合は、False を返します。
"""
import ランダム
__author__ ="http://blog.csdn.net/anhulife"
__license__ ="python"
クラス ポイント:
"""ポイント クラス
ポイント クラスはゲームの基本単位です: "point"
"""
def __init__( self,x,y,value):
self.x = x
self .y = y
self.value = value
self.directs = なし
self.changed = 0
def __createDirect(self,pre,target):
"""方向を構築するポイントのセット
各ポイントは接続プロセス中に方向セットを保持し、この方向は方向セットを一元的に保存します ポイントの前方向選択の優先順位
優先順位: ターゲットを指す方向ポイントは最高レベルを持ち、同じレベルにあり、y 方向よりも前に x 方向に従います
"""
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 なし
direct = なし
while(True):
if len(self.directs) == 0 :
break
tmpDirect = self.directs.pop(0)
if tmpDirect == "アップ" :
x = self.x
y = self.y + 1
elif tmpDirect == "ダウン":
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 = ポイント[x][y]
if p.value > 0 and p ! = target:
続行
else :
direct = tmpDirect
if pre == なし:
self.changed = 1
else:
if (pre. x - self.x) == 0 および (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 および self.y == p.y :
return True
else:
return False
points = list()
def createPoints(w,h):
"""ゲーム インターフェイスのポイントを構築します
インターフェイス内のすべてのポイントを初期化します。ルールは次のとおりです:
最も外側のレイヤーは「壁」ポイント、次のレイヤーは塗りつぶされていないポイント、ラップされたポイントは塗りつぶされたポイントです
"""
r = randint
範囲 (w) の x の場合:
temp = list()
範囲 (h) の y の場合:
if x == 0 または x == (w-1) または y == 0 または y == (h-1):
temp.append(Point(x,y,9))
else:
if x == 1 またはx == (w-2) または y == 1 または 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):
"""Point connection
接続方法のアイデア: ソースポイントの各方向に前進してみます。前進できる場合は、その方向の次のポイントの各方向に前進してみます。
オプションのいずれも存在しない場合。ポイントの方向を前進させると、前のポイントの既存の順方向パスに戻り、そのポイントで他のオプションの方向を試します。原点
に戻るすべての方向が利用できない場合、またはパスの方向変更が 4 に等しい場合、接続は失敗し、False が返されます。それ以外の場合、パスがターゲット ポイントに接続されており、パスの方向変化が 4 未満である場合、接続は成功し、パスが返されます
"""
if source == target:
return False
path = list()
change = 0
current =source
while True:
if current==target および変更
for p in path:
p.directs = なし
リターンパス
if change == 4:
current.directs = なし
current = path.pop(len(path)-1)
change = 変更 - current.isChanged( )
続行
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 = 現在.y + 1
elif direct == "下":
x = current.x
y = current.y - 1
elif direct == "左":
x = 現在.x - 1
y = 現在.y
elif direct == "right":
x = 現在.x + 1
y = 現在.y
print x,y
path.append(current)
current = Points[x][y]
else:
if change == 0:
return False
else:
current.directs = なし
current = path.pop(len(path)-1)
change = 変更 - current.isChanged()
createPoints(8,8)
p = link (points[2][2 ],points[5][2])
print p