続:pyxelでRPG風のものを作る(1.5)

今回は何か機能を追加するわけでもなく、今まで使っていたソースコードが長くて見にくくなってきたので、外部モジュール化を試してみます。

…と思ったのですが今まで同一クラス内にいろいろ書きすぎたせいで(特にAppクラス)変数のスコープがごっちゃごちゃになっているので早々に断念。辞書型配列で持たせているひらがなフォント・敵の座標・NPCの座標を外部モジュールとすることでとりあえず終了です。まあモジュールとパッケージ化の練習ということで。

さて、今まではAppクラスのinitメソッドで以下のような形で変数を代入していました。

#Font set
    self.font_list = {
        "a":[0,0],
        "A":[8,0],
        "i":[16,0],
        "I":[24,0],
        "u":[32,0],
        "U":[40,0],
        "e":[48,0],
        "E":[56,0],
        "o":[64,0],
        "O":[72,0],
        "KA":[80,0],
        "GA":[88,0],
        "KI":[96,0],
        "GI":[104,0],
        "KU":[112,0],
        "GU":[120,0],
        "KE":[128,0],
        "GE":[136,0],
        "KO":[144,0],
        "GO":[152,0],
        "SA":[160,0],
        "ZA":[168,0],
        "SI":[176,0],
        "JI":[184,0],
        "SU":[192,0],
        "ZU":[200,0],
        "SE":[208,0],
        "ZE":[216,0],
        "SO":[224,0],
        "ZO":[232,0],
        "TA":[240,0],
        "DA":[248,0],
        "TI":[0,8],
        "DI":[8,8],
        "tu":[16,8],
        "TU":[24,8],
        "DU":[32,8],
        "TE":[40,8],
        "DE":[48,8],
        "TO":[56,8],
        "DO":[64,8],
        "NA":[72,8],
        "NI":[80,8],
        "NU":[88,8],
        "NE":[96,8],
        "NO":[104,8],
        "HA":[112,8],
        "BA":[120,8],
        "PA":[128,8],
        "HI":[136,8],
        "BI":[144,8],
        "PI":[152,8],
        "HU":[160,8],
        "BU":[168,8],
        "PU":[176,8],
        "HE":[184,8],
        "BE":[192,8],
        "PE":[200,8],
        "HO":[208,8],
        "BO":[216,8],
        "PO":[224,8],
        "MA":[232,8],
        "MI":[240,8],
        "MU":[248,8],
        "ME":[0,16],
        "MO":[8,16],
        "ya":[16,16],
        "YA":[24,16],
        "yu":[32,16],
        "YU":[40,16],
        "yo":[48,16],
        "YO":[56,16],
        "RA":[64,16],
        "RI":[72,16],
        "RU":[80,16],
        "RE":[88,16],
        "RO":[96,16],
        "wa":[104,16],
        "WA":[112,16],
        "WI":[120,16],
        "WE":[128,16],
        "WO":[136,16],
        "NN":[144,16],
        }

これはひらがなフォントの場合ですが、こんな感じで敵の座標とNPCの座標も辞書型で持たせていたわけです。この部分を本体の.pyファイルから分離しようと思います。

まずは本体と同じ階層にモジュールを入れておくための「module」フォルダを作成します。その後とりあえず空ファイルで「Enemy_pos.py」、「Npc_pos.py」、「Fontlist.py」を作成します。これがモジュールファイルです。さらに「__init__.py」も作成します。これは該当フォルダをパッケージとして読み込めるようにするファイルで、中身は特に必要ありません。
ここまでできたら、各モジュールファイルの中身を書いていきます。

#Enemy_pos

def enemy_posx():
    pos = {
              "0-0":[],
              "1-0":[5,13],
              "2-0":[9,12,13],
              "3-0":[10,12,8],
              "4-0":[6,8,9,12],
              "5-0":[],
              "6-0":[],
              "7-0":[],
              "8-0":[],
              "9-0":[],
              "10-0":[],
              "0-1":[5,106,108],
              "1-1":[5,5,11,11,7,8],
              "2-1":[2,3,2,3,4],
              "3-1":[],
              "4-1":[],
              "5-1":[],
              "6-1":[],
              "7-1":[],
              "8-1":[],
              "9-1":[],
              "10-1":[],
              "0-2":[106,108,109,1012],
              "1-2":[107,108,104,105,111,112,106,108,110],
              "2-2":[],
              "3-2":[7,8,9,10,11,11,12],
              "4-2":[210],
              "5-2":[205,208,210,211],
              "6-2":[],
              "7-2":[],
              "8-2":[],
              "9-2":[],
              "10-2":[],
              "0-3":[],
              "1-3":[],
              "2-3":[],
              "3-3":[],
              "4-3":[],
              "5-3":[],
              "6-3":[],
              "7-3":[],
              "8-3":[13],
              "9-3":[],
              "10-3":[],
    }
    return pos

def enemy_posy():
    pos = {
              "0-0":[],
              "1-0":[5,7],
              "2-0":[7,8,2],
              "3-0":[7,8,11],
              "4-0":[7,8,7,8],
              "5-0":[],
              "6-0":[],
              "7-0":[],
              "8-0":[],
              "9-0":[],
              "10-0":[],
              "0-1":[5,10,10],
              "1-1":[5,10,5,10,8,7],
              "2-1":[7,8,9,10,11],
              "3-1":[],
              "4-1":[],
              "5-1":[],
              "6-1":[],
              "7-1":[],
              "8-1":[],
              "9-1":[],
              "10-1":[],
              "0-2":[7,11,7,8],
              "1-2":[5,6,7,8,7,8,2,3,3],
              "2-2":[],
              "3-2":[10,10,10,10,10,5,5,],
              "4-2":[7],
              "5-2":[4,8,7,9],
              "6-2":[],
              "7-2":[],
              "8-2":[],
              "9-2":[],
              "10-2":[],
              "0-3":[],
              "1-3":[],
              "2-3":[],
              "3-3":[],
              "4-3":[],
              "5-3":[],
              "6-3":[],
              "7-3":[],
              "8-3":[13],
              "9-3":[],
              "10-3":[],
    }
    return pos
#Npc_pos

def npc_posx():
   pos = {
              "0-0":[],
              "1-0":[],
              "2-0":[],
              "3-0":[],
              "4-0":[],
              "5-0":[13],
              "6-0":[12,12],
              "7-0":[107,208],
              "8-0":[],
              "9-0":[],
              "10-0":[],
              "0-1":[],
              "1-1":[],
              "2-1":[],
              "3-1":[],
              "4-1":[],
              "5-1":[],
              "6-1":[],
              "7-1":[],
              "8-1":[7],
              "9-1":[],
              "10-1":[],
              "0-2":[],
              "1-2":[],
              "2-2":[],
              "3-2":[],
              "4-2":[],
              "5-2":[],
              "6-2":[],
              "7-2":[],
              "8-2":[313],
              "9-2":[],
              "10-2":[],
              "0-3":[],
              "1-3":[],
              "2-3":[],
              "3-3":[],
              "4-3":[],
              "5-3":[],
              "6-3":[],
              "7-3":[],
              "8-3":[13],
              "9-3":[],
              "10-3":[],
   }
   return pos
   
def npc_posy():
   pos = {
              "0-0":[],
              "1-0":[],
              "2-0":[],
              "3-0":[],
              "4-0":[],
              "5-0":[9],
              "6-0":[4,10],
              "7-0":[107,212],
              "8-0":[],
              "9-0":[],
              "10-0":[],
              "0-1":[],
              "1-1":[],
              "2-1":[],
              "3-1":[],
              "4-1":[],
              "5-1":[],
              "6-1":[],
              "7-1":[],
              "8-1":[5],
              "9-1":[],
              "10-1":[],
              "0-2":[],
              "1-2":[],
              "2-2":[],
              "3-2":[],
              "4-2":[],
              "5-2":[],
              "6-2":[],
              "7-2":[],
              "8-2":[307],
              "9-2":[],
              "10-2":[],
              "0-3":[],
              "1-3":[],
              "2-3":[],
              "3-3":[],
              "4-3":[],
              "5-3":[],
              "6-3":[],
              "7-3":[],
              "8-3":[13],
              "9-3":[],
              "10-3":[],
   }   
   return pos
#Fontlist

def text_j():  
   font_list = {
        "a":[0,0],
        "A":[8,0],
        "i":[16,0],
        "I":[24,0],
        "u":[32,0],
        "U":[40,0],
        "e":[48,0],
        "E":[56,0],
        "o":[64,0],
        "O":[72,0],
        "KA":[80,0],
        "GA":[88,0],
        "KI":[96,0],
        "GI":[104,0],
        "KU":[112,0],
        "GU":[120,0],
        "KE":[128,0],
        "GE":[136,0],
        "KO":[144,0],
        "GO":[152,0],
        "SA":[160,0],
        "ZA":[168,0],
        "SI":[176,0],
        "JI":[184,0],
        "SU":[192,0],
        "ZU":[200,0],
        "SE":[208,0],
        "ZE":[216,0],
        "SO":[224,0],
        "ZO":[232,0],
        "TA":[240,0],
        "DA":[248,0],
        "TI":[0,8],
        "DI":[8,8],
        "tu":[16,8],
        "TU":[24,8],
        "DU":[32,8],
        "TE":[40,8],
        "DE":[48,8],
        "TO":[56,8],
        "DO":[64,8],
        "NA":[72,8],
        "NI":[80,8],
        "NU":[88,8],
        "NE":[96,8],
        "NO":[104,8],
        "HA":[112,8],
        "BA":[120,8],
        "PA":[128,8],
        "HI":[136,8],
        "BI":[144,8],
        "PI":[152,8],
        "HU":[160,8],
        "BU":[168,8],
        "PU":[176,8],
        "HE":[184,8],
        "BE":[192,8],
        "PE":[200,8],
        "HO":[208,8],
        "BO":[216,8],
        "PO":[224,8],
        "MA":[232,8],
        "MI":[240,8],
        "MU":[248,8],
        "ME":[0,16],
        "MO":[8,16],
        "ya":[16,16],
        "YA":[24,16],
        "yu":[32,16],
        "YU":[40,16],
        "yo":[48,16],
        "YO":[56,16],
        "RA":[64,16],
        "RI":[72,16],
        "RU":[80,16],
        "RE":[88,16],
        "RO":[96,16],
        "wa":[104,16],
        "WA":[112,16],
        "WI":[120,16],
        "WE":[128,16],
        "WO":[136,16],
        "NN":[144,16],
   }
   return font_list

ということでモジュールができました。全てもともとは本体に記載していた変数を戻り値として返す関数です。

これを本体側で呼び出すためにインポートします。

from module import Fontlist, Npc_pos, Enemy_pos

その後、各モジュールからの戻り値を本体側で使うために代入します。

    self.npc_pos_x = Npc_pos.npc_posx()
    self.npc_pos_y = Npc_pos.npc_posy()
    
    self.enemy_pos_x = Enemy_pos.enemy_posx()
    self.enemy_pos_y = Enemy_pos.enemy_posy()
    
    self.font_list =Fontlist.text_j()

モジュールファイル名.関数名()で各関数を呼び出し、各変数に入れます。これで動作としては同じようになるはずです。
新しくなった本体のソースコードを載せてみます。

# -*- coding: utf-8 -*-

import pyxel
from random import randint
from module import Fontlist, Npc_pos, Enemy_pos

class App:
def __init__(self):
    #Font set
    self.font_list =Fontlist.text_j()
    
    #Player status
    self.Player = Player(8, 56)
    self.player_move = 0    
    self.atc_flug = False   
    self.atc_count = 0      
    self.p_atc_x = 0        
    self.p_atc_y = 0        
    
    #Map status
    self.stage_flug = 1     
    self.map_count_x = 1    
    self.map_count_y = 1    
    self.map_x = 0
    self.map_y = 0
    self.map_move = 0

    #NPC status
    self.npcs = []
    self.npc_move = 0
    self.npc_pos_x = Npc_pos.npc_posx()
    self.npc_pos_y = Npc_pos.npc_posy()

    #Enemy status
    self.enemys = []
    self.enemy_pos_x = Enemy_pos.enemy_posx()
    self.enemy_pos_y = Enemy_pos.enemy_posy()
    
    #System status
    self.game_start = False 
    self.game_over = False 
    self.movie_flug = False 
    self.movie_count = 0
    self.music_flug = True
    self.shop1 = Shop(1)
    
    pyxel.init(128,128, caption="pyxel_knights", scale=5)

    #Image read
    pyxel.load('assets/pknights.pyxres')
    
    pyxel.run(self.update, self.draw)
    
def update(self):

    if pyxel.btnp(pyxel.KEY_S) and self.game_start == False:
      self.game_start = True
      self.movie_flug = True
      self.movie_count = 1
      self.music_flug = False
    if pyxel.btnp(pyxel.KEY_R) and self.game_over == True:
      self.Retry()
    if pyxel.btnp(pyxel.KEY_Q):
        pyxel.quit()
    
    if self.movie_flug == False:
        #Player controll
        self.Player_ctr()
        #NPC controll
        self.NPC_ctr()
        #Enemy controll
        self.Enemy_ctr()
        #Enemy Hit-check
        self.Hit_chk()
        #Player Damage-check
        self.Dmg_chk()
    
    #Enemy & NPC creation
    if self.map_move == 1:
       self.npcs.clear()
       self.enemys.clear()
       tgt_map_x = int(self.map_x / 16)
       tgt_map_y = int(self.map_y / 16)
       xy_key = str(tgt_map_x) + "-" + str(tgt_map_y)
       
       #Enemy creation
       enemy_x_1 = self.enemy_pos_x[xy_key]
       enemy_y_1 = self.enemy_pos_y[xy_key]
       enemy_kazu = len(enemy_x_1)
       for i in range(enemy_kazu):
           
           if enemy_x_1[i] < 101:
               new_enemy_v = 32
               new_enemy_x = enemy_x_1[i]
           elif enemy_x_1[i] < 201:
              new_enemy_v = 48
              new_enemy_x = enemy_x_1[i] - 100
           else:
              new_enemy_v = 64
              new_enemy_x = enemy_x_1[i] - 200
               
           new_enemy_v2 = randint(1,3)
           new_enemy = Enemy1(new_enemy_x*8, enemy_y_1[i]*8, 
                              new_enemy_v, new_enemy_v2)
           self.enemys.append(new_enemy)
           
       #NPC creation
       npc_x_1 = self.npc_pos_x[xy_key]
       npc_y_1 = self.npc_pos_y[xy_key]
       npc_kazu = len(npc_x_1)
       for i in range(npc_kazu):
           
           if npc_x_1[i] < 101:
               new_npc_b = 16
               new_npc_x = npc_x_1[i]
           elif npc_x_1[i] < 201:
              new_npc_b = 8
              new_npc_x = npc_x_1[i] - 100
           elif npc_x_1[i] < 301:
              new_npc_b = 8
              new_npc_x = npc_x_1[i] - 200               
           else:
              new_npc_b = 16
              new_npc_x = npc_x_1[i] - 300
               
           if npc_y_1[i] < 101:
               new_npc_v = 0
               new_npc_y = npc_y_1[i]
           elif npc_y_1[i] < 201:
               new_npc_v = 16
               new_npc_y = npc_y_1[i] - 100
           elif npc_y_1[i] < 301:
               new_npc_v = 32
               new_npc_y = npc_y_1[i] - 200                
           else:
               new_npc_v = 48
               new_npc_y = npc_y_1[i] - 300
               
           new_npc = NPC(new_npc_x*8, new_npc_y*8, new_npc_b, new_npc_v)
           self.npcs.append(new_npc)
           
       self.map_move = 0
     
def draw(self):
    pyxel.cls(0)
    
    #Draw tilemap
    pyxel.bltm(0,0,0,0 + self.map_x,0 + self.map_y,16,16)

    #Draw player
    if self.atc_flug == True:
        if self.Player.player_m == 0:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,0,16,8,8,14)
            pyxel.blt(self.Player.player_x+8,self.Player.player_y,
                          0,0,24,8,8,14)
        elif self.Player.player_m == 1:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,8,16,8,8,14)
            pyxel.blt(self.Player.player_x-8,self.Player.player_y,
                          0,8,24,8,8,14)
        elif self.Player.player_m == 2:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,16,16,8,8,14)
            pyxel.blt(self.Player.player_x,self.Player.player_y-8,
                          0,16,24,8,8,14)
        elif self.Player.player_m == 3:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,24,16,8,8,14)  
            pyxel.blt(self.Player.player_x,self.Player.player_y+8,
                          0,24,24,8,8,14)
    else:
        if self.Player.player_m == 0:
                pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,0,0+self.Player.player_m2*8,8,8,14)
        elif self.Player.player_m == 1:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,8,0+self.Player.player_m2*8,8,8,14)
        elif self.Player.player_m == 2:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,16,0+self.Player.player_m2*8,8,8,14)
        elif self.Player.player_m == 3:
            pyxel.blt(self.Player.player_x,self.Player.player_y,
                          0,24,0+self.Player.player_m2*8,8,8,14)
            
    #Draw NPCs
    npc_count = len(self.npcs)
    for e in range(npc_count):
        if self.npc_move < 50:
            pyxel.blt(self.npcs[e].npc_x,self.npcs[e].npc_y,
                      0,
                      0 + self.npcs[e].npc_v, 224,
                      self.npcs[e].npc_b,self.npcs[e].npc_b,14)
        else:
            pyxel.blt(self.npcs[e].npc_x,self.npcs[e].npc_y,
                      0,
                      0 + self.npcs[e].npc_v,240,
                      self.npcs[e].npc_b,self.npcs[e].npc_b,14)
         
    #Draw Enemys
    enemy_count = len(self.enemys)
    for e in range(enemy_count):
        if self.enemys[e].enemy_m == 0:
            pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
                      1,
                      8*self.enemys[e].enemy_v2,self.enemys[e].enemy_v,
                      8,8,14)
        else:
            pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
                      1,
                      8*self.enemys[e].enemy_v2,self.enemys[e].enemy_v+8,
                      8,8,14)
        if self.enemys[e].enemy_d == 1:
            pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
                      0,40,16,8,8,14)
            
    #Draw damage
    if self.Player.player_d == 1:
         pyxel.blt(self.Player.player_x,self.Player.player_y,0,32,16,8,8,14)      
         
    #Draw title text
    if self.game_start == False:
       pyxel.cls(0)
       pyxel.text(35, 40, "PYXEL KNIGHTS", 7)
       pyxel.text(45, 70, "S = ", 7)
       self.Draw_fonts(["HA","JI","ME","RU"], 60, 70)
       pyxel.text(45, 85, "Q = ", 7)
       self.Draw_fonts(["YA","ME","RU"], 60, 85)
    else: #Draw player hp
       pyxel.text(2, 122, "HP="+ str(self.Player.player_h),7)
       
    #Draw movie
    if self.movie_flug == True:
       self.Movie_ctr(self.movie_count)
        
    #Draw gameover text
    if self.game_over == True:
       pyxel.cls(0)
       pyxel.text(20, 30, "GAME OVER!", 7)
       pyxel.text(80, 70, "R = RETRY ", 7)
       pyxel.text(80, 80, "Q = QUIT ", 7)
       


def Player_ctr(self):
    
    #Get map coordinate
    x = 16*(self.map_count_x-1)
    y = 16*(self.map_count_y-1)

    #Get player coordinate        
    move_map_x = int(self.Player.player_x / 8 + x)
    move_map_y = int(self.Player.player_y / 8 + y)
    
    #Tilemap action
    #HP recovery
    if pyxel.tilemap(0).get(move_map_x, move_map_y) == 31:
        self.Player.player_h = 100    
        
    #Status view and pause
    if pyxel.btnp(pyxel.KEY_I):
               self.movie_flug = True
               self.movie_count = 2
               #self.movie_count = 226
    
    #Plyer move
    self.player_move = self.player_move + 1
    if (self.player_move > 6) and (self.atc_flug == False):
    
        if pyxel.tilemap(0).get(move_map_x, move_map_y-1) < 32:
            #Up
            if pyxel.btnp(pyxel.KEY_UP):
                self.Player.player_y = self.Player.player_y - 8
                self.player_move = 0
                self.Player.player_m = 2
                if self.Player.player_m2 == 0: #Move animation
                    self.Player.player_m2 = 1
                else:
                    self.Player.player_m2 = 0      
                if (self.Player.player_y - 8) < -8: #When map change
                    self.map_y = self.map_y - 16
                    self.Player.update(56, 120)
                    self.map_count_y = self.map_count_y - 1
                    self.map_move = 1
        elif pyxel.tilemap(0).get(move_map_x, move_map_y-1) >= 224:
            if pyxel.btnp(pyxel.KEY_UP):
               self.movie_flug = True
               self.movie_count = pyxel.tilemap(0).get(move_map_x,
                                                       move_map_y-1)
    
        if pyxel.tilemap(0).get(move_map_x, move_map_y+1) < 32:
            #Down
            if pyxel.btnp(pyxel.KEY_DOWN):
                self.Player.player_y = self.Player.player_y + 8
                self.player_move = 0
                self.Player.player_m = 3     
                if self.Player.player_m2 == 0: #Move animation
                    self.Player.player_m2 = 1
                else:
                    self.Player.player_m2 = 0      
                if (self.Player.player_y + 8) > 128: #When map change
                    self.map_y = self.map_y + 16
                    self.Player.update(56, 0)
                    self.map_count_y = self.map_count_y + 1
                    self.map_move = 1
        elif pyxel.tilemap(0).get(move_map_x, move_map_y+1) >= 224:
            if pyxel.btnp(pyxel.KEY_DOWN):
               self.movie_flug = True
               self.movie_count = pyxel.tilemap(0).get(move_map_x,
                                                       move_map_y+1)
            
        if pyxel.tilemap(0).get(move_map_x+1, move_map_y) < 32: 
            #Right
            if pyxel.btnp(pyxel.KEY_RIGHT):
                self.Player.player_x = self.Player.player_x + 8
                self.player_move = 0
                self.Player.player_m = 0
                if self.Player.player_m2 == 0: #Move animation
                    self.Player.player_m2 = 1
                else:
                    self.Player.player_m2 = 0      
                if (self.Player.player_x + 8) > 128: #When map change
                    self.map_x = self.map_x + 16
                    self.Player.update(0, 56)
                    self.map_count_x = self.map_count_x + 1
                    self.map_move = 1
        elif pyxel.tilemap(0).get(move_map_x+1, move_map_y) >= 224:
            if pyxel.btnp(pyxel.KEY_RIGHT):
               self.movie_flug = True
               self.movie_count = pyxel.tilemap(0).get(move_map_x+1,
                                                       move_map_y)
       
        if pyxel.tilemap(0).get(move_map_x-1, move_map_y) < 32: 
            #Left
            if pyxel.btnp(pyxel.KEY_LEFT):
                self.Player.player_x = self.Player.player_x - 8
                self.player_move = 0
                if self.Player.player_m2 == 0: #Move animation
                    self.Player.player_m2 = 1
                else:
                    self.Player.player_m2 = 0      
                self.Player.player_m = 1
                if (self.Player.player_x - 8) < -8: #When map change
                    self.map_x = self.map_x - 16
                    self.Player.update(120, 56)
                    self.map_count_x = self.map_count_x - 1
                    self.map_move = 1
        elif pyxel.tilemap(0).get(move_map_x-1, move_map_y) >= 224:
            if pyxel.btnp(pyxel.KEY_LEFT):
               self.movie_flug = True
               self.movie_count = pyxel.tilemap(0).get(move_map_x-1,
                                                       move_map_y)
           
    #Attack action       
    if pyxel.btnp(pyxel.KEY_SPACE):
        self.atc_flug = True
        pyxel.play(0,3,loop=False)
        
    if self.atc_flug == True:
        self.atc_count = self.atc_count + 1
        if self.atc_count > 8:
            self.atc_count = 0
            self.p_atc_x = 0
            self.p_atc_y = 0
            self.atc_flug = False
        else:
            if self.Player.player_m == 0:
                self.p_atc_x = self.Player.player_x + 8
                self.p_atc_y = self.Player.player_y
            elif self.Player.player_m == 1:
                self.p_atc_x = self.Player.player_x - 8
                self.p_atc_y = self.Player.player_y
            elif self.Player.player_m == 2:
                self.p_atc_x = self.Player.player_x
                self.p_atc_y = self.Player.player_y - 8
            elif self.Player.player_m == 3:
                self.p_atc_x = self.Player.player_x
                self.p_atc_y = self.Player.player_y + 8
      
def Retry(self):
    #Player status
    self.Player = Player(8, 56)
    self.player_move = 0    
    self.atc_flug = False   
    self.atc_count = 0      
    self.p_atc_x = 0        
    self.p_atc_y = 0        
    
    #Map status
    self.stage_flug = 1     
    self.map_count_x = 1    
    self.map_count_y = 1    
    self.map_x = 0
    self.map_y = 0
    self.map_move = 0
    
    #Enemy status
    self.enemys = []
    
    #System status
    self.game_start = False 
    self.game_over = False 
    self.movie_flug = False 
            
def Hit_chk(self):
    enemy_count = len(self.enemys)
    for e in range(enemy_count):
        self.enemys[e].enemy_d = 0
        enemy_pos_x = self.enemys[e].enemy_x
        enemy_pos_y = self.enemys[e].enemy_y
        if ((enemy_pos_x <= self.p_atc_x < enemy_pos_x + 8) and
            (enemy_pos_y <= self.p_atc_y < enemy_pos_y + 8)):
            self.enemys[e].enemy_d = 1
            #Music_ctr
            pyxel.play(1,0,loop=False)
            self.enemys[e].enemy_h = self.enemys[e].enemy_h -1
            #Enemy delete
            if self.enemys[e].enemy_h < 0:
                self.Player.money += 10 * self.enemys[e].enemy_v2
                del self.enemys[e]
                #Music_ctr
                pyxel.play(2,2,loop=False)
                if len(self.enemys) == 0:
                    x = int(self.map_x / 16)
                    y = int(self.map_y / 16)
                    self.MapEvents_ctr(x, y)
                break
    
def Dmg_chk(self):     
     self.Player.player_d = 0
     enemy_count = len(self.enemys)  
     player_pos_x = self.Player.player_x
     player_pos_y = self.Player.player_y
     for e in range(enemy_count):
         enemy_pos_x = self.enemys[e].enemy_x
         enemy_pos_y = self.enemys[e].enemy_y
         if ((enemy_pos_x <= player_pos_x < enemy_pos_x + 8) and
            (enemy_pos_y <= player_pos_y < enemy_pos_y + 8)):
             #Music_ctr
             pyxel.play(3,1,loop=False)
             self.Player.player_h = self.Player.player_h - 1
             self.Player.player_d = 1
             if self.Player.player_h <= 0:
                 self.game_over = True     
    

def Enemy_ctr(self):        
    enemy_count = len(self.enemys)
    for e in range(enemy_count):
        self.enemys[e].enemy_m2 = self.enemys[e].enemy_m2 + 1
        if self.enemys[e].enemy_m2 > 47 - self.enemys[e].enemy_v2 * 7:
            self.enemys[e].enemy_m2 = 0
            enemy_pos_x = int(self.enemys[e].enemy_x / 8 + self.map_x)
            enemy_pos_y = int(self.enemys[e].enemy_y / 8 + self.map_y)
            enemy_pos_x2 = self.Player.player_x - self.enemys[e].enemy_x
            enemy_pos_y2 = self.Player.player_y - self.enemys[e].enemy_y
            #Check tilemap
            if (abs(enemy_pos_x2) < 35 and abs(enemy_pos_y2) < 35):
                if abs(enemy_pos_x2) > abs(enemy_pos_y2):
                    #Move right
                    if enemy_pos_x2 > 0:
                        if (40> (pyxel.tilemap(0).get(enemy_pos_x+1, 
                                                      enemy_pos_y)) < 32):
                            self.enemys[e].enemy_x=self.enemys[e].enemy_x+8
                            self.enemys[e].enemy_m = 1
                    #Move left
                    else:
                        if (40> (pyxel.tilemap(0).get(enemy_pos_x-1, 
                                                      enemy_pos_y)) < 32):
                            self.enemys[e].enemy_x=self.enemys[e].enemy_x-8
                            self.enemys[e].enemy_m = 0           
                else:
                    #Move down
                    if enemy_pos_y2 > 0:
                        if (40> (pyxel.tilemap(0).get(enemy_pos_x, 
                                                      enemy_pos_y+1)) < 32):
                            self.enemys[e].enemy_y=self.enemys[e].enemy_y+8
                    #Move up
                    else:
                        if (40> (pyxel.tilemap(0).get(enemy_pos_x, 
                                                      enemy_pos_y-1)) < 32):
                            self.enemys[e].enemy_y=self.enemys[e].enemy_y-8

def NPC_ctr(self):        
    self.npc_move = self.npc_move + 1
    if self.npc_move > 100:
        self.npc_move = 0
        
def MapEvents_ctr(self,x,y):
    xy_key = str(x) + "-" + str(y)
    if xy_key == "1-2":
        pyxel.tilemap(0).set(7+self.map_x, 10+self.map_y, ["006006"]) 
       #pyxel.tilemap(0).set(8+self.map_x, 10+self.map_y, ["010", "012"]) 

def Movie_ctr(self,n):
    #Game start information
    if n == 1:
        pyxel.rect(0, 65, 128, 63, 0)
        self.Draw_fonts(["A","NA","TA","HA","O","U","KO","KU","NO",
                         "KA","KI","yu","U","KI","SI"], 5, 70)
        self.Draw_fonts(["MI","YA","KO","NO","HA","ZU","RE","NI",
                         "SU","NN","DE","I","MA","SU"], 5, 80)
        self.Draw_fonts(["KO","NO","SE","KA","I","WO","KI","MA","MA",
                         "NI"], 5, 95)
        self.Draw_fonts(["BO","U","KE","NN","SI","TE","MI","MA","SI",
                         "yo","U"], 5, 105)
        pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                   pyxel.frame_count % 16)
    #Status view
    elif n == 2:
        pyxel.rect(0, 100, 128, 63, 0)
        pyxel.text(5, 110, "Money="+ str(self.Player.money), 7) 
        pyxel.text(5, 120, "Press SPACE-KEY to return", 
                   pyxel.frame_count % 16)  
        
   #Shop/////////////////////////////////////////////
    elif n == 226 or n == 227:
        
        pyxel.bltm(0,0,0,240,0,16,16)
        pyxel.blt(100 ,15 ,0 ,48 ,0 ,16 ,16 ,2)
        
        #Shop select
        s = self.shop1
        
        if pyxel.btnp(pyxel.KEY_1):
            if s.urikire[0] == 1:
                s.text_n = 98
            else:
                s.text_n = 1
        elif pyxel.btnp(pyxel.KEY_2):
            if s.urikire[1] == 1:
                s.text_n = 98
            else:
                s.text_n = 2
        elif pyxel.btnp(pyxel.KEY_3):
            if s.urikire[2] == 1:
                s.text_n = 98
            else:
                s.text_n = 3
        elif pyxel.btnp(pyxel.KEY_4):
            if s.urikire[3] == 1:
                s.text_n = 98
            else:
                s.text_n = 4
            
        for i in range(4):
            item_name = []
            if s.urikire[i] == 1:
                item_name = ["U","RI","KI","RE"]
            else:
                item_name = s.item[i]
            self.Draw_fonts(item_name,15, 73 + (i * 10))
            pyxel.text(75, 73 + (i * 10), "price=" + 
                       str(s.price[i]), 7)
            
        shop_text = s.Show_text()
        text_len = len(shop_text)
        if s.text_n > 0 and s.text_n < 90:
            pyxel.text(12, 55, "( Y = Yes, N = No )", 7) 
            if pyxel.btnp(pyxel.KEY_Y):
                p = s.text_n - 1
                if self.Player.money - s.price[p] >= 0:
                    self.Player.money = self.Player.money - s.price[p]
                    s.urikire[p] = 1
                    s.text_n = 100
                else:
                    s.text_n = 99
            elif pyxel.btnp(pyxel.KEY_N):
                s.text_n = 0
        for t in range(text_len):
            self.Draw_fonts(shop_text[t],15, 15 + (t * 10))
            
        pyxel.text(15, 113, "SPACE-KEY = Exit", 7)   
    #//////////////////////////////////////////////////////////
        
    #NPC text//////
    elif n == 224:
        pyxel.rect(0, 100, 128, 63, 0)
        self.Draw_fonts(["MI","YA","KO","NO","E","I","HE","I","DA"],5, 105)
        pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                   pyxel.frame_count % 16)   
    elif n == 225:
        pyxel.rect(0, 100, 128, 63, 0)
        self.Draw_fonts(["MI","YA","KO","NO","JI","yu","U","NI","NN",
                         "DA"],5, 105)
        pyxel.text(5, 120, "Press SPACE-KEY to continue...", 
                   pyxel.frame_count % 16)   
    #/////////////
        
    #Return game
    if pyxel.btnp(pyxel.KEY_SPACE):
        self.movie_flug = False

def Draw_fonts(self,txt,x,y):  
    txt_count = len(txt)      
    for i in range(txt_count):
        #Key check
        font_xy = self.font_list[txt[i]]
       
        fontx = font_xy[0]
        fonty = font_xy[1]
        pyxel.blt(x + 8 * i,y,1,fontx,fonty,8,8,14)
       
          
class Player:
def __init__(self, x, y):
    self.player_x = x
    self.player_y = y
    self.player_h = 100
    self.player_d = 0
    self.player_m = 0
    self.player_m2 = 0
    self.money = 0
def update(self, x, y):
    self.player_x = x
    self.player_y = y

class NPC:
 def __init__(self, x, y, b, v):
     self.npc_x = x
     self.npc_y = y
     self.npc_b = b
     self.npc_v = v
     self.npc_m = 0
 def update(self, x, y):
     self.npc_x = x
     self.npc_y = y
     
class Enemy1:
 def __init__(self, x, y, v, v2):
     self.enemy_x = x
     self.enemy_y = y
     self.enemy_h = 10 + v2*5
     self.enemy_d = 0
     self.enemy_m = 0
     self.enemy_m2 = 0
     self.enemy_v = v
     self.enemy_v2 = v2
 def update(self, x, y):
     self.enemy_x = x
     self.enemy_y = y
     
class Shop:
 def __init__(self, n):
     self.shop_v = n
     self.item = [["I","TI"],
                 ["NI"],
                 ["SA","NN"],
                 ["YO","NN"]]
     self.price = [100,200,300,400]
     self.text_n = 0
     self.urikire = [0, 0, 0, 0]
 def Show_text(self):
     t = self.text_n
     if t == 0:
         return [["I","RA","tu", "SI", "ya", "I", "MA", "SE"],
                 ["SI","yo","U", "HI", "NN", "NO", "BA", "NN"],
                 ["GO","U","WO", "E", "RA", "NN", "DE", "KU"],
                 ["DA","SA","I"],]
     elif t == 1:
         return [["HI","TO","TU", "ME", "NO", "SI", "yo", "U"],
                 ["HI","NN","DE", "SU"],
                 ["KA","I","MA", "SU", "KA"]]
     elif t == 2:
         return [["HU","TA","TU", "ME", "NO", "SI", "yo", "U"],
                 ["HI","NN","DE", "SU"],
                 ["KA","I","MA", "SU", "KA"]]
     elif t == 3:
         return [["MI","tu","TU", "ME", "NO", "SI", "yo", "U"],
                 ["HI","NN","DE", "SU"],
                 ["KA","I","MA", "SU", "KA"]]
     elif t == 4:
         return [["YO","tu","TU", "ME", "NO", "SI", "yo", "U"],
                 ["HI","NN","DE", "SU"],
                 ["KA","I","MA", "SU", "KA"]]
     elif t == 98:
         return [["U","RI","KI", "RE", "DE", "SU",]]
     elif t == 99:
         return [["O","KA","NE", "GA", "TA", "RI", "MA", "SE"],
                 ["NN"]]
     elif t == 100:
         return [["MA","I","DO", "A", "RI",]]

App()

うーん...まぁinit部分は見やすくなったかな?
敵の座標を外に出せたので、ちょっとは拡張がしやすくなったかもしれません。例えば、「難易度ごとに敵の配置を変える」とかも本体側は呼び出す関数を変えればいいだけで、あとはモジュール側の記載でできそうな気がします。

GitHubもディレクトリ構成をほんのちょっとだけいじりました。以後このRPGもどきは以下のフォルダで更新していこうと思います。

ここまで読んでいただきありがとうございました。

ここまで読んでいただきありがとうございます!