Halting and Ruminating, like a Kangaroo: 2008/12a


12 / 02 (Tue)

_ 日記

今まで3 Tab派だったんだけど、ついこないだ4 Space派に転向した。PEP-8。3 Tabはrubyでdefendちゃんと囲まれてる感があったから好きだった。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+αばかりやってると忘れちゃう何かを思い出させてくれるから、ゲームとかは好きだ。や、仕事に使うために書いてるソフトウェアもそうなんだけどね。


No Unix, No Life.
©2009 H.Miyamoto

Generated by Pygeon