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

Python3.5.2でRPGを制作する①

python プログラミング

オセロはいったん休憩する(飽きたんじゃないよ)

RPGを作るのが人生の夢だった気がする…ので、RPGを作成しようと思う。すでに何回か挫折しているので、今度は作り上げるぞぅ

とりあえず見た目的にマップから作ってみることにする。

main.py

from field import Field
from player import Player


if __name__ == '__main__':
    field = Field()
    player = Player(field)

main.pyは基本的に呼び出しのみにしようと思う。わかりやすくしよう。

field.py

class Field(object):
    def __init__(self):
        self.height = 15  # 縦幅
        self.width = 50  # 横幅
        self.field = [[0 for x in range(self.width)]for y in range(self.height)]  # マップの初期化

        for x in range(self.height):
            for y in range(self.width):
                if x != 0 and y != 0 and x != self.height - 1 and y != self.width - 1:
                    self.field[x][y] = 0  # 平原
                else:
                    self.field[x][y] = -1  # 番兵(見えない壁)

        self.field[4][5] = 1  # アンティウム(街)
        self.field[8][24] = 1  # コンスタンティノポリス(街)

    def field_print(self):
        """ 視界外のマップも全て表示するデバッグ用関数 """
        for x in range(self.height):
            for y in range(self.width):
                if self.field[x][y] == 0:
                    print("・", end='')
                elif self.field[x][y] == -1:
                    print("#", end='')
                elif self.field[x][y] == 1:
                    print(">", end='')
                elif self.field[x][y] == 2:
                    print("*", end='')
            print()  # 改行用

    def visibility(self, y_vision, x_vision, vision_ratio):
        """ 視界を制御する関数 """
        for y in range(self.height):
            for x in range(self.width):
                if self.field[y][x] == -1:
                    print("#", end='')  # 見えない壁
                elif (y_vision - vision_ratio) <= y <= (y_vision + vision_ratio) and\
                        (x_vision - vision_ratio) <= x <= (x_vision + vision_ratio):
                    if self.field[y][x] == 0:
                        print("・", end='')
                    elif self.field[y][x] == 1:
                        print(">", end='')
                    elif self.field[y][x] == 2:
                        print("@", end='')
                else:
                    print("?", end='')  # 視界外
            print()  # 改行用

feild.pyは文字通りfieldを管理するクラス。視界を作るのがこんなに大変だとは思わなかった…視界だけで記事一本作れそうな感じ。

そもそもプログラムは既にfield全部知ってるわけだから、わざわざ知らんぷりさせるようにコード書かないといけない。ムズいのお

player.py

import random


class Player(object):
    def __init__(self, field):
        """ 初期化時にマップ関連を処理しとく """
        self.field = field
        y = random.randint(1, self.field.height - 1)
        x = random.randint(1, self.field.width - 1)
        self.field.field[y][x] = 2
        self.vision_ratio = 1  # 視界の範囲
        self.field.visibility(y, x, self.vision_ratio)

fieldはplayer.pyから呼び出す。npcの視界はどうしようか考え中。明日には決めよう…