Operation KiWi

一生使える言語はPythonだと信じてる

Python3でRPGを作る時に使えそうな技術の断片 -座標を記録しよう-

f:id:sakage24:20170628200017p:plain

前回はマップのビューアを作成しました。今回はプレイヤー、AIの座標を管理できるようにしましょう。

前回のあらすじ

www.kiwi-bird.xyz

マップの実体は単なる数値ですが、深いコピーを取って安全に中身を書き換えることで安全にマップっぽく表示する機能を作成しました。

今回やること

  • sources/coordinates.pyを作成しよう
  • sources/player.pyを作成しよう
  • sources/view.pyを追記しよう
  • run.pyを追記しよう

やってみよう

coordinates.pyの作成

  • sourcesフォルダ内にcoordinates.pyを作成して下さい。

coordinates.pyを作り込んでいこう

coordinates.pyはプレイヤーはもちろん、これから追加されるであろうNPCや敵の座標を手軽に管理するためのクラスです。プレイヤーやNPCの座標は全てこちらのクラスのインスタンスを作成して管理します。

# coordinates.py
class Manager(object):
    """
    マップ上におけるプレイヤーやNPCの座標を管理するクラス
    """
    def __init__(self):
        self.__y = 0
        self.__x = 0

    @property
    def y(self):
        return self.__y

    @y.setter
    def y(self, n):
        self.__y = n

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, n):
        self.__x = n

    @property
    def position(self):
        return self.__y, self.__x
    
    @position.setter
    def position(self, value):
        self.__y, self.__x = value[0], value[1]

player.pyの作成

playerクラスは、coordinatesクラスのインスタンスを保持します。さらに、移動を指示するmove()関数を持っています。WASDで上下左右に移動が出来るようになりました。

import sources.coordinates
import sys
modules_flag = True


class Manager(object):
    def __init__(self, name):
        self.name = name
        self.current_position = sources.coordinates.Manager()
        self.current_position.y = 5
        self.current_position.x = 5

ViewFilterクラスへの追記

create_view()関数にプレイヤーの位置を引数として渡しています。さらに、プレイヤーを示すを追加しています。

# view.py
class ViewFilter(object):
    def __init__(self, v, rect):
        self._view = v
        self._view_height = rect[0]
        self._view_width = rect[1]

    def create_view(self, player_pos):
        for i in range(self._view_height):
            for j in range(self._view_width):
                if i == player_pos[0] and j == player_pos[1]:
                    self._view[i][j] = "@"
                elif self._view[i][j] == 0:
                    self._view[i][j] = "・"
                elif self._view[i][j] == 1:
                    self._view[i][j] = "村"
        return self._view

run.pyの追記

# run.py
import pprint
import copy
from sources.maps import WorldMap
from sources.view import ViewFilter
import sources.player

# 初期設定
pp = pprint.PrettyPrinter()
world_map = WorldMap()
player = sources.player.Manager(name="あなた")
world_map.set_village(y=2, x=4)  # ほげ村
world_map.set_village(y=8, x=3)  # ぴよ村

map_viewer = ViewFilter(v=(copy.deepcopy(world_map.get_world_map())), rect=world_map.get_rect())

# create_view()へプレイヤーへの座標を渡しています。
pp.pprint(map_viewer.create_view(player_pos=player.current_position.position))

以上で完了です。だんだんソースコードが多くなってきて管理が難しくなってきましたね…

実行結果

[['・', '・', '・', '・', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '村', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '@', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '村', '・', '・', '・', '・', '・', '・'],
 ['・', '・', '・', '・', '・', '・', '・', '・', '・', '・']]

出来ました~!@マークがプレイヤーです。ようやくプレイヤーが表示できました。ほぼ完成ですねwww

説明不足な点が多々ありそうです。分からない所があればコメントいただけると幸いです。

あと今更ですが、クラス設計とかは完全に我流なので、おかしいぞって言う点が多々あるかもしれません。改善出来る所はどんどん自己流で弄ってみて下さいwそれが上達のコツでもありますよ!!

終わり

今回はここで終わります。次回はプレイヤーが移動出来るようにしましょう。お楽しみに~

オススメの教科書類

指定教科書

入門 Python 3

入門 Python 3

これ無しでPython開発は無理です。私的にはあまり演習問題の類は説かずに知りたいことがあったら読む、辞書的な感じで使っています。

  • スライスって何?
  • リスト内包表記って何なんだよあれ?
  • リストとタプルはどう違うの?
  • そもそも集合って何に使うの?

少しでも上記に当てはまるなら購入しましょう。せっかくPythonを使っているんですから、有効に使えるようにしてみませんか?

副読本

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

  • 他言語を得意としているプログラマがPythonを書いた時にやりがちなこと…
  • ゲームの保存に使えるpickle
  • この機能はこう使うべきである
  • while, for文のelseを使うべきではない理由
  • Pythonでセッター, ゲッターを使うべきではない理由

みたいに、様々な事例とともにPythonのベストノウハウ、やってはいけないアンチパターンが紹介されています。pycon2016でも確か推されてましたw

初心者から上級者まで、手元に置いておくべき本です。

副読本2

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

ノンプログラマー向けとありますが、経験者の方も結構アイディアを貰える本でした。 序盤は文法の解説ですので、読み飛ばせます。後半は様々な局面で使えそうな自動化処理の書き方が載っていました。

ゲームの所持アイテムを辞書で表現しよう…みたいにゲームプログラマーに役立つ演習もありましたw

副読本3

ゲーム開発者のためのAI入門

ゲーム開発者のためのAI入門

C言語での解説が主ですが、しっかりとした説明があるので、だいたい分かりました。Pythonでも使える知識がほとんどです。ただ、ファジー理論など、数学的な要素は私にはどうともしがたい躓きポイントでしたw

ローグライクゲームに使える最短経路探索法やAIの作成法、確率の基本まで教えてもらえる良本でした!!

ここまでのソースコード

www.dropbox.com

続き

www.kiwi-bird.xyz