Operation KiWi

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

Python3でRPGを作る時に使えそうな技術の断片 -エスケープシーケンスを使おう-

f:id:sakage24:20170628200017p:plain

前回の記事でようやくプレイヤーが画面内を移動できるようになりました。ですが、画面出力が残ってしまっているのでこのままだと見づらくて仕方ないです。これを直していきましょう。

前回

www.kiwi-bird.xyz

参考

今回扱うモジュールcoloramaの解説を過去記事で行っておりますので、詳細な説明は省かさせて頂きます。coloramaってなに?という方は、是非以下の記事に目を通して見て下さい。

www.kiwi-bird.xyz

今回やること

  • エスケープシーケンスを使って、画面クリアをしよう
  • coloramaを使って、文字列を装飾するためのクラスを作ろう
    • sourcesフォルダに、新しくutils.pyを作成しよう

エスケープシーケンスを使って、画面クリアをしよう

  1. coloramaのインポート
  2. init()を行う(windowsのみ)
  3. 画面クリアする

といっても簡単です。run.pyに以下を加えるだけ。

ソースコード

# run.py
import os
from colorama import init


# windowsOS = nt
if os.name == 'nt':
    init()

print("\033[2J")

run.pyは以下の通りになります。

# run.py
import copy
import os
from sources.maps import WorldMap
from sources.view import ViewFilter
from colorama import init
import sources.player

# windowsOS = nt
if os.name == 'nt':
    init()

# 初期設定
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())

while True:
    # create_view()へプレイヤーへの座標を渡しています。
    map_viewer.create_view(player_pos=player.current_position.position)
    player.move(rect=world_map.get_rect())
    print("\033[2J")

実行結果

f:id:sakage24:20170703220957g:plain

出来ましたでしょうか?ようやくまともに動けるようになってきましたね!!続いて、マップに色を付けましょう。

coloramaを使って、文字列を装飾するためのクラスを作ろう

続きまして、coloramaを使って手軽に文章を装飾してくれるクラスを作りましょう。いちいちインポートするのも面倒ですし、文字列を渡したら装飾して返してくれるTextDecorationクラスを作成しましょう。

ソースコード

# utils.py
from colorama import Fore, Back


class TextDecoration(object):
    @staticmethod
    def red(text):
        """ 赤色 """
        string = Fore.RED + text + Fore.RESET
        return string
    @staticmethod
    def yellow(text):
        """ 黄色 """
        string = Fore.YELLOW + text + Fore.RESET
        return string
    @staticmethod
    def green(text):
        """ 緑色 """
        string = Fore.GREEN + text + Fore.RESET
        return string
    @staticmethod
    def blue(text):
        """ 青色 """
        string = Fore.LIGHTBLUE_EX + text + Fore.RESET
        return string
    @staticmethod
    def cyan(text):
        """シアン """
        string = Fore.CYAN + text + Fore.RESET
        return string
    @staticmethod
    def bgcolor_red(text):
        string = Back.LIGHTRED_EX + text + Back.RESET
        return string
    @staticmethod
    def bgcolor_green(text):
        string = Back.LIGHTGREEN_EX + text + Back.RESET
        return string
    @staticmethod
    def bgcolor_blue(text):
        string = Back.LIGHTBLUE_EX + text + Back.RESET
        return string

出来ましたね。試しに使ってみましょう!!マップをカラー表示に対応させるため、create_view()関数によく似た、pretty_view()関数を作成しましょう

ViewFilterクラスに、pretty_view()関数を作成しましょう

from sources.utils import TextDecoration as deco

# pretty_view()を追加

def pretty_view(self, player_pos):
    for i in range(self._view_height):
        for j in range(self._view_width):
            s = ""
            if i == player_pos[0] and j == player_pos[1]:
                s = deco.bgcolor_red(deco.yellow("@"))
            elif self._view[i][j] == 0:
                s = deco.bgcolor_green("ー")
            elif self._view[i][j] == 1:
                s = deco.bgcolor_blue("村")
            self.printer(width=j, strings=s)

run.pyの修正

# whileループ内のcreate_view()の呼び出しを削除して、pretty_view()を追加
map_viewer.pretty_view(player_pos=player.current_position.position)

実行結果

f:id:sakage24:20170704094233j:plain

gifで取ったらひどいことになったので画像だけ。何かいいgif作成ソフトありませんか…?

色がついて、少しマップっぽくなりました!!移動も出来てますかね。一応ソースの起動チェックはしてるんですが、環境によって動かないとかあるかもしれません。そのような場合、コメントで教えていただけると嬉しいです。

終わり

とりあえず、マップ関連は一段落つきましたね。これからどうしようか…まだ何やるかは決めてませんが、やるとしたら

  • 視界の持たせ方
  • NPCの追加
  • 敵の追加
  • 最短経路アルゴリズム
  • ダンジョン生成

とかですかね?そもそも需要があるのかどうか…

あとダンジョン生成はやったことが無いのでライブラリとか探してみたほうが早いかもしれませんw

それと、Pythonプログラミングする人は下記の本を読むことをおすすめします。ネットの知識だけだと色々偏るんで。

オススメの教科書類

指定教科書

入門 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.kiwi-bird.xyz

ソースコード

www.dropbox.com