今まで3 Tab派だったんだけど、ついこないだ4 Space派に転向した。PEP-8。3 Tabはrubyでdef
とend
でちゃんと囲まれてる感があったから好きだった。2は窮屈すぎるし縦に間延びしてる感があるし4はちゃんと囲まれてない感じがしてた。Pythonばっかり書いてる今ではendの文字を単体で見ることはないから、その恩恵もなくなったわけで。
そう書いたのは確か11月だったような。
pythonでA*。
from purplecrow import *
import util
import time
class Node(tuple): pass
def trace(lst, dic, start, goal):
if start == goal:
return lst
else:
lst.append(goal)
return trace(lst, dic, start, dic[goal])
def astar(pc, start, goal):
now = list()
close = list()
tree = dict()
node = Node(start)
goal = tuple(goal)
argv = (start[1], start[0], goal[1], goal[0])
node.cost, node.fn = 0, pc.stage.tiles.cost(*argv)
now.append(node)
while now:
node = now[0]
for n in now:
if n.fn < node.fn:
node = n
now.remove(node)
if node == goal:
break
else:
close.append(node)
for _nextnode in util.matrix(node):
if pc.stage.tiles.exists(*_nextnode):
nextnode = Node(_nextnode)
nextnode.cost = node.cost + (pc.stage.tiles.get(*_nextnode).reg + 1)
argv = (_nextnode[1], _nextnode[0], goal[1], goal[0])
nextnode.fn = nextnode.cost + pc.stage.tiles.cost(*argv)
if nextnode in now:
index = now.index(nextnode)
if now[index].fn > nextnode.fn:
now[index].fn = nextnode.fn
tree[nextnode] = node
elif nextnode in close:
index = close.index(nextnode)
if close[index].fn > nextnode.fn:
close.pop(index)
now.append(nextnode)
tree[nextnode] = node
else:
now.append(nextnode)
tree[nextnode] = node
if now:
print 'ok'
print trace(list(), tree, tuple(start), goal)
print len(trace(list(), tree, tuple(start), goal))
else:
raise 'now is empty'
pc = PurpleCrow()
astar(pc, [0, 8], [10, 8])
例のCGI wrapperのサンプルとして書いていたWikiを放り出して、公開するつもりがない自分専用SRPGを書いてる。HTML+αばかりやってると忘れちゃう何かを思い出させてくれるから、ゲームとかは好きだ。や、仕事に使うために書いてるソフトウェアもそうなんだけどね。