Python3でRPGを作る時に使えそうな技術の断片 -村に入れるようにしよう-

f:id:sakage24:20170628200017p:plain

村に入った後の処理までは実装しませんが、「村に入った」というトリガーを判定出来るようにしましょう!

前回のあらすじ

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

chase()関数を作成したことで、NPCが追っかけてくるようになりました。

今回やること

  1. WorldMapクラスに_village_position属性を追加しよう
  2. WorldMapクラスにget_village_positionクラスメソッドを追加しよう
  3. WorldMapクラスのset_villageクラスメソッドを拡張しよう
  4. 村と同じ座標に侵入したかどうかを判定するis_terran_check関数を追加しよう
  5. Playerクラスのmove()関数を拡張しよう

やってみよう

WorldMapクラスを拡張していこう


# maps.py
class WorldMap(object):
...
...
...
__village_position = list() # 追加

とりあえず追加してlist()で初期化しましょう。そして、set_village関数の利用時についでに村の座標を入れてもらえるように改造しましょう。


# maps.py
class WorldMap(object):
...
...
...
@classmethod
def set_village(cls, y, x):
cls.__world_map[y][x] = cls.__village
cls.__village_position.append1)y, x

これで、村の配置の際に座標を保持してもらえるようになりました!最後に、村の座標を返してくれるget_village_position関数を作成しましょう。


# maps.py
class WorldMap(object)
...
...
...
@classmethod
def get_village_position(cls):
return cls.__village_position

is_terran_check関数を作成しよう

座標を移動する前に、移動先が村かどうかを確認する関数です。


def is_terran_check(self, inputs, terran):
if inputs == "w":
if (self.current_position.y - 1, self.current_position.x) in terran:
return True
else:
return False
elif inputs == "a":
if (self.current_position.y, self.current_position.x - 1) in terran:
return True
else:
return False
elif inputs == "s":
if (self.current_position.y + 1, self.current_position.x) in terran:
return True
else:
return False
elif inputs == "d":
if (self.current_position.y, self.current_position.x + 1) in terran:
return True
else:
return False

move関数を拡張しよう

移動先が村なら、移動せずに「村に入る」イベントが起きるようにしましょう。


class Manager(object):
...
...
...
def move(self, rect, village_pos):
print(self.current_position.position)
height = rect[0]
width = rect[1]
if modules_flag:
raw_inputs = msvcrt.getwch()
else:
raw_inputs = input()
if raw_inputs == "q":
print("プログラムを終了します...")
sys.exit(0)
elif raw_inputs == "w" and self.current_position.y >= 1:
if self.is_terran_check(raw_inputs, village_pos):
print("村に入りました。")
input()
else:
self.current_position.y -= 1
elif raw_inputs == "a" and self.current_position.x >= 1:
if self.is_terran_check(raw_inputs, village_pos):
print("村に入りました。")
input()
else:
self.current_position.x -= 1
elif raw_inputs == "s" and self.current_position.y <= height - 2:
if self.is_terran_check(raw_inputs, village_pos):
print("村に入りました。")
input()
else:
self.current_position.y += 1
elif raw_inputs == "d" and self.current_position.x <= width - 2:
if self.is_terran_check(raw_inputs, village_pos):
print("村に入りました。")
input()
else:
self.current_position.x += 1

実行結果

f:id:sakage24:20170707213421g:plain

出来ました!村に侵入すると座標は移動せず、村に入るイベントを発生させることが出来ました。

イベント自体は特に実装していませんので、どうぞご自由に(適当w

他にも、応用としてダンジョンに入るとか、罠が仕掛けられている的なイベントにも使えるかもしれません。無限大です。

終わり

ブログでソースコードを公開するのは大変ですね…一個修正したら遡って全部修正しなくちゃいけないとか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入門

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

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

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

ソースコード

www.dropbox.com

続き

TO BE CONTINUED…

脚注   [ + ]

1. y, x

コメントを残す

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