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

f:id:sakage24:20170628200017p:plain

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

前回

https://www.kiwi-bird.xyz/2017/07/03/20170703002038/

参考

https://www.kiwi-bird.xyz/2017/07/03/20170703221713/

今回やること

  • エスケープシーケンスを使って、画面クリアをしよう
  • 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入門

  • 作者: David M. Bourg,Glenn Seemann,株式会社クイープ
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2005/01/12
  • メディア: 大型本
  • 購入: 24人 クリック: 395回
  • この商品を含むブログ (77件) を見る

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

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

次回

https://www.kiwi-bird.xyz/2017/07/04/20170704184604/

ソースコード

www.dropbox.com

コメントを残す

メールアドレスが公開されることはありません。