読者です 読者をやめる 読者になる 読者になる

pythonでブレゼンハムアルゴリズムを実装した

python プログラミング

またまた壁にぶつかったのでメモ。

ダンジョン内におけるリアルな視界を表現するのに、直線を表現するアルゴリズムが必要でした。

googleで「ダンジョン 視界 アルゴリズム」とかでググっても、あんまり情報が出てこなかったので後発の方のために情報を残しておきます。

基本的には、「ゲーム開発者のためのAI入門」を参考にしました。

 

path_y = y
path_x = x
path = []
delta_y = pos[0] - y
delta_x = pos[1] - x
path_lists = []
while (path_y, path_x) != tuple(pos):
    if delta_y < 0:
        step_y = -1
    else:
        step_y = 1
    if delta_x < 0:
        step_x = -1
    else:
        step_x = 1

    delta_y = abs(delta_y * 2)
    delta_x = abs(delta_x * 2)

    path.append([path_y, path_x])

    if delta_x > delta_y:
        fraction = delta_y - delta_x / 2
        while path_x != pos[1]:
            if fraction >= 0:
                path_y += step_y
                fraction -= delta_x
            path_x += step_x
            fraction += delta_y
            path.append([path_y, path_x])
    else:
        fraction = delta_x - delta_y / 2
        while path_y != pos[0]:
            if fraction >= 0:
                path_x += step_x
                fraction -= delta_y
            path_y += step_y
            fraction += delta_x
            path.append([path_y, path_x])
try:
    for lists in path:
        if self.field[lists[0]][lists[1]] == 0:
            path_lists.append(0)
        else:
            path_lists.append(self.field[lists[0]][lists[1]])
except Exception as e:
    print(e)
    input()

pythonのappend()は罠だった

python プログラミング

オライリーの「入門Python 3」 P.59によれば、append()は、リストの末尾に要素を追加するものである。超便利で、割と多用するのだが、罠が張り巡らされていたのであった。

append()で追加される要素は、参照渡しである。値自体が渡されるわけではないのだ。

変数をappendで渡すときは、copy()を利用した方が良いかもしれない。割りと混乱したのでメモ。

 

pythonで標準入力をEnterキー押さずに即入力する方法

python プログラミング

ハマったのでメモ。

pythonで標準入力を扱うには、input()関数があります。

これで使えば基本的にオッケーなんですが、PRGとか作ってるといちいちEnterキーを押すのがだるい時がありますよね(移動とか)

そんなときに使えるのが msvcrtモジュール。

import msvcrt

print(msvcrt.getwch())

これでオーケー。エンターキー押さずに即反映されます。メモ以上!

coloramaをwindowsで動かす方法

python プログラミング

pythonのライブラリであるcolorama、文字列を装飾したり、画面クリアをしたり出来る凄い子達です。

pycharm上ではうまく動作するのに、exe形式にアウトプットした途端きちんと動作しなくなる症状が発生しました。

理由を色々試してみて発見しました。init()を行わないとwindows上では動きませんでした。

init()
print("\033[2J")  # 画面クリア

とやってあげると、きちんと動作しました。ちーん。。。

python3.4.4でローグライクゲーム制作 ~モジュールを見つけた~

python プログラミング

ダンジョン生成アルゴリズムの作成は困難を極めた。

まず、配列を矩形に分割するみたいなことをどこのページも書いていますが、どうやったらいいのか皆目見当もつかない。

早々にやる気を失い、ネットの海をゆらゆらと漂い続け、私は素晴らしいサイトを見つけたのであった。

http://arvelt.hatenablog.com/entry/2015/03/31/210104

なんと、既に先人がいました。しかもpipで簡単にインストールが出来るようにしてくれている!神がいたのであった。

しかし、そのままでは、私の環境(win10 + python3.4.4)では、何故かimportが出来ないエラーがががががgっっg

とりあえず色々ググってみたところ、パスが通っていないためらしい。よく分からん。

D:\python3.4.4\Lib\site-packages\dungeon.pthを作成。相対パス

dungeon\

とだけ書いて保存。実行してみる。なんとか実行出来た。。。こういうところで時間食いたくないんだけどな….

importしてみるとダンジョンが生成されている!ありがたいです。

そのままだと使えないので、私の環境に合わせてちょいちょい変更。ばっちり出来るようになりました。

私の作ったダイクストラ法もpypiに登録してみようかな…でも、糞汚いコードなので恥ずかしいww辞めておこう。

とりあえず今日はここまで。また!

python3.4.4でローグライクゲーム制作~ダンジョン生成下調べ編~

python プログラミング

お久しぶりです!どうやってもpython3.5.2でcx_freezeが動かないので、3.4.4にダウングレードしました。残念ながら、3.4.5にwindowsバイナリが無かったという

最短経路アルゴリズムが解決したのでもう怖いものなしだと思っていたら、また壁が迫ってきました。

ダンジョン生成アルゴリズムが欲しい!例のごとく、pythonには参考文献が無いので、他のサイト巡りをしてます。

まあ、1から作ったほうが勉強になるし、組み込みやすいからいいんですけど(T_T)

出来るかなぁ……

https://matome.naver.jp/odai/2134067533815973901

neverまとめに色々あったので覗いてみました。ううむ。難しそうだな

Python3.5.2でRPGを制作する ~敵の視界が出来たよ~

python プログラミング

敵の視界を作成しました。これがまた一癖あって、なかなか難しい。

AIを既にこちらの位置を知っているため、逆に知らないふりをさせないといけない。頭のいいAIの方が作っていて楽なのだということを知った。

 

def enemy_visibility(pos):
    """ 敵の視界を調整する関数。posはプレイヤーの座標を格納したタプル。 """
    if pos[0] - enemy.vision_ratio <= player_pos[0] <=\
            (pos[0] + enemy.vision_ratio) and\
            (pos[1] - enemy.vision_ratio) <= player_pos[1] <=\
            (pos[1] + enemy.vision_ratio):
            # 敵の視界
        pos = enemy.is_movable(player_pos)
        return pos
    else:
        dst = (random.randrange(1, 13), random.randrange(1, 48))
        pos = enemy.is_movable(dst)
        return pos

enemy.vision_ratioは視界範囲。確か6で設定していたはず。あんま広いとすげー探知力になる

if文の条件がめっちゃ長くなったので、擬似コードで説明してみる。頑張るし

if (縦の座標- 視界範囲) <= (縦の座標) <= (縦の座標 + 視界範囲) かつ (横の座標 - 視界範囲) <= (横の座標) <= (横の座標 + 視界範囲):

分かるかな。分からんよね。とりあえず、わざわざこんな条件を加えないと、敵の視界が表現出来ないのだということを知ってもらえれば嬉しいかも知れない

やることまだまだ!頑張ろう