見出し画像

【pyxel 1.5】pyxelで3D迷路を作ってみる(1)

pythonのレトロゲームエンジン「pyxel」の新バージョンがリリースされました。新バージョンである1.5系とそれ以前では仕様が違う面があるので、今作っているものについては旧バージョンで継続して、新しく作るものに1.5系のpyxelを使おうと思います。

というわけで、3D迷路を作ってみます。ウィザードリィなどでもみられる歴史ある形態ですが、なんか個人的にあこがれがあるんですよね。小さいころに見た「大人がパソコンで遊ぶゲーム」のイメージに結びついているのかもしれません。
以前作ろうとして挫折したのですが、今回は何とか移動部分まではこぎつけることができました。

▲とりあえず自由に歩き回れるところまではたどり着きました。輪郭線のみのシンプルな見た目です。

それではコードの説明に入っていきます。

  def __init__(self):
      pyxel.init(256, 256, title = "pyxel")
      
      self.maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
                   [1, 0, 0, 0, 0, 1, 1, 0, 1, 1,],
                   [1, 0, 1, 1, 0, 1, 1, 0, 1, 1,],
                   [1, 0, 1, 1, 0, 0, 0, 0, 0, 1,],
                   [1, 0, 1, 1, 0, 1, 1, 0, 1, 1,],
                   [1, 0, 0, 0, 0, 1, 1, 1, 1, 1,],
                   [1, 1, 1, 1, 0, 1, 1, 1, 1, 1,],
                   [1, 1, 1, 1, 0, 1, 0, 1, 1, 1,],
                   [1, 1, 1, 1, 0, 0, 0, 1, 1, 1,],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],]
      
      self.pos = [4, 4]
      self.pos_angle = 1
      
      self.wall = [[0, 0],
                   [0, 0],
                   [0, 0],
                   [0, 0],]

      self.dead_end = 0
      for i1 in range(5):
          x1 = self.pos[1] - (1 * i1)
          if self.maze[x1][self.pos[0]] == 1:
              self.dead_end = i1      
      
      pyxel.run(self.update, self.draw)

▲まずはinit部分です。ウィンドウサイズは256*256。
self.mazeに多重配列の形で迷路データを入れます。0が通路で1は壁です。今回はとりあえず10*10で作成してみます。
self.posはプレイヤー座標。初期値として[4, 4]を入れておきます。
self.pos_angleはプレイヤーの方向を示す変数です。上・右・下・左の時計回りに1・2・3・4を対応させます。初期値は1で、上向きです。
self.wallにはプレイヤーの左右に壁があるかを4マス先まで格納できるような配列を作っておきます。
次に行き止まりが何マス先なのかを計算しておきます。プレイヤーは最初上を向いているので、上方向に5マス先までチェックして壁(つまり1)だったら、進んだマス数をself.dead_endに代入します

  def update(self): 
      
      self.wall = [[0, 0],
                   [0, 0],
                   [0, 0],
                   [0, 0],]      
              
      if pyxel.btnp(pyxel.KEY_UP):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          elif self.pos_angle == 2:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          elif self.pos_angle == 3:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3
          elif self.pos_angle == 4:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
                  

          
      if pyxel.btnp(pyxel.KEY_DOWN):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3
          elif self.pos_angle == 2:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
          elif self.pos_angle == 3:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          elif self.pos_angle == 4:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          
      if pyxel.btnp(pyxel.KEY_RIGHT):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          elif self.pos_angle == 2:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3
          elif self.pos_angle == 3:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
          elif self.pos_angle == 4:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          
      if pyxel.btnp(pyxel.KEY_LEFT):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
          elif self.pos_angle == 2:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          elif self.pos_angle == 3:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          elif self.pos_angle == 4:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3    
  
          
      if self.pos_angle == 1:
          for i1 in range(4):
              if self.pos[1] - i1 < 0:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] - (1 * i1)
                  p2 = self.pos[0] - 1 + (2 * i2) 
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[p1][self.pos[0]] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1
                      
      elif self.pos_angle == 3:
          for i1 in range(4):
              if self.pos[1] + i1 > 9:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] + (1 * i1)
                  p2 = self.pos[0] + 1 - (2 * i2) 
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[p1][self.pos[0]] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1
                      
      elif self.pos_angle == 2:
          for i1 in range(4):
              if self.pos[0] + i1 > 9:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] - 1 + (2 * i2) 
                  p2 = self.pos[0] + (1 * i1)
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[self.pos[1]][p2] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1             
                          
      elif self.pos_angle == 4:
          for i1 in range(4):
              if self.pos[0] - i1 < 0:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] + 1 - (2 * i2) 
                  p2 = self.pos[0] - (1 * i1)
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[self.pos[1]][p2] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1            

▲次はupdate部分です。
self.wallを初期化した後は、上下左右の各ボタンを押した際の挙動を書いています。
基本的には進行方向が壁でなければ方向を修正して進むだけです。ただし、「自分の向いた方向」によって同じボタンでも挙動が変わる点は注意しなければなりません。
例えば上ボタン(pyxel.KEY_UP)は「上に進む」というよりは、「前進する」ボタンなので、上を向いていたら上に進み、左を向いていたら左に進む挙動を目指します。このあたりの分岐はself.pos_angleの値を見て判断します。
プレイヤーが移動した後は壁や行き止まりを再計算しなければなりません。ここでもself.pos_angleをみてどの方向に迷路をチェックするかを決めています。
壁の有無はself.wallに格納し、行き止まりが何マス先かをself.dead_endに入れています。
この時存在しないマスを検査しようとするとエラーになってしまいます。例えば自分が[1, 5]の地点にいるときにx軸を負の方向に検査していくと、[1, 5]→[0, 5]→[-1, 5]といずれxが負の数になってしまいます。これを避けるために「if self.pos[1] - i1 < 0:」「if self.pos[1] + i1 > 9:」といったif文で検査対象マスが迷路の外に出ないようにしています。最小値は0でいいのですが、最大値は迷路の大きさによって異なるので、縦横のサイズを変えるときは合わせて修正が必要です。

  def draw(self):
      pyxel.cls(0)
      
      pyxel.rectb(0, 150, 256, 106, 1)
#--------------------------------------------------------------      
      if self.wall[0][0] == 1:
          pyxel.line(0, 0, 50, 29, 6)
          pyxel.line(0, 0, 0, 150, 6)
          pyxel.line(0, 150, 50, 121, 6)
          pyxel.line(50, 29, 50, 121, 6)
      else:
          pyxel.line(0, 29, 50, 29, 6)
          pyxel.line(0, 121, 50, 121, 6)
      if self.wall[0][1] == 1:       
          pyxel.line(256, 0, 205, 29, 6)
          pyxel.line(256, 150, 205, 121, 6)      
          pyxel.line(255, 0, 255, 150, 6)
          pyxel.line(205, 29, 205, 121, 6)
      else:
          pyxel.line(256, 29, 205, 29, 6)
          pyxel.line(256, 121, 205, 121, 6)
#---------------------------------------------------------------          

#---------------------------------------------------------------                    
      if self.wall[1][0] == 1:       
          pyxel.line(50, 29, 80, 45, 12)
          pyxel.line(50, 121, 80, 105, 12)
          pyxel.line(50, 29, 50, 121, 12)
          pyxel.line(80, 45, 80, 105, 12)
      else:          
          pyxel.line(80, 45, 50, 45, 12)
          pyxel.line(80, 105, 50, 105, 12)
      if self.wall[1][1] == 1:       
         pyxel.line(205, 29, 175, 45, 12)
         pyxel.line(205, 121, 175, 105, 12)
         pyxel.line(205, 29, 205, 121, 12)
         pyxel.line(175, 45, 175, 105, 12)
      else:          
          pyxel.line(175, 45, 205, 45, 12)
          pyxel.line(175, 105, 205, 105, 12)      
#---------------------------------------------------------------          
      
#---------------------------------------------------------------                  
      if self.wall[2][0] == 1:       
          pyxel.line(80, 45, 97, 55, 5)
          pyxel.line(80, 105, 97, 95, 5)
          pyxel.line(80, 45, 80, 105, 5)
          pyxel.line(97, 55, 97, 95, 5)
      else:
          pyxel.line(97, 55, 80, 55, 5)
          pyxel.line(97, 95, 80, 95, 5)
      if self.wall[2][1] == 1:       
          pyxel.line(175, 45, 158, 55, 5)
          pyxel.line(175, 105, 158, 95, 5)
          pyxel.line(175, 45, 175, 105, 5)
          pyxel.line(158, 55, 158, 95, 5)
      else:
          pyxel.line(158, 55, 175, 55, 5)
          pyxel.line(158, 95, 175, 95, 5)
#---------------------------------------------------------------

#---------------------------------------------------------------                  
      if self.wall[3][0] == 1:       
          pyxel.line(97, 55, 108, 60, 1)
          pyxel.line(97, 95, 108, 90, 1)
          pyxel.line(97, 55, 97, 95, 1)
          pyxel.line(108, 60, 108, 90, 1)    
      if self.wall[3][1] == 1:       
         pyxel.line(158, 55, 148, 60, 1)
         pyxel.line(158, 95, 148, 90, 1)  
         pyxel.line(158, 55, 158, 95, 1)
         pyxel.line(148, 60, 148, 90, 1)      
#-------------------------------------------------------------      
      

 
      if self.dead_end == 0:
          pass
      elif self.dead_end == 1:
          pyxel.rect(50, 29, 156, 93, 0)
          pyxel.rectb(50, 29, 156, 93, 6)
      elif self.dead_end == 2:
          pyxel.rect(80, 45, 96, 61, 0)
          pyxel.rectb(80, 45, 96, 61, 12)
      elif self.dead_end == 3:
          pyxel.rect(97, 55, 62, 41, 0)
          pyxel.rectb(97, 55, 62, 41, 5)
      elif self.dead_end == 4:
          pyxel.rect(108, 60, 41, 30, 0)
          pyxel.rectb(108, 60, 41, 30, 1)
          
      for d in range(3):
          pyxel.text(30+10*d, 180, str(self.maze[self.pos[1]]
                                  [self.pos[0]-1+d]), 7)
      for d2 in range(3):
          pyxel.text(30+10*d2, 190, str(self.maze[self.pos[1]+1]
                                  [self.pos[0]-1+d2]), 7)
      for d3 in range(3):
          pyxel.text(30+10*d3, 170, str(self.maze[self.pos[1]-1]
                                  [self.pos[0]-1+d3]), 7)          
      pyxel.rect(40, 180, 10, 10, 0)
      if self.pos_angle == 1:
          pyxel.tri(41, 178, 37, 185, 45, 185, 8)
      elif self.pos_angle == 2:
          pyxel.tri(45, 181, 37, 178, 37, 185, 8)
      elif self.pos_angle == 3:
          pyxel.tri(41, 185, 37, 178, 45, 178, 8)
      elif self.pos_angle == 4:
          pyxel.tri(37, 183, 45, 178, 45, 186, 8)
      
      
      
      
APP()

▲draw部分です。壁の描画がメインとなります。self.wallの値を見て手前から順に壁を書いていきます。self.wallが1なら壁を、それ以外は通路を描きます。
左右それぞれ4枚、計8枚の壁について処理が終わったら、行き止まりを描きます。
最後に自分の向いている方向と周囲のマスが見えるコンパス的なものを描いて終わりです。
APP()でプログラム実行します。

すべてつなげるとソースは以下のようになります。

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

import pyxel

class APP:
  def __init__(self):
      pyxel.init(256, 256, title = "pyxel")
      
      self.maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
                   [1, 0, 0, 0, 0, 1, 1, 0, 1, 1,],
                   [1, 0, 1, 1, 0, 1, 1, 0, 1, 1,],
                   [1, 0, 1, 1, 0, 0, 0, 0, 0, 1,],
                   [1, 0, 1, 1, 0, 1, 1, 0, 1, 1,],
                   [1, 0, 0, 0, 0, 1, 1, 1, 1, 1,],
                   [1, 1, 1, 1, 0, 1, 1, 1, 1, 1,],
                   [1, 1, 1, 1, 0, 1, 0, 1, 1, 1,],
                   [1, 1, 1, 1, 0, 0, 0, 1, 1, 1,],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],]
      
      self.pos = [4, 4]
      self.pos_angle = 1
      
      self.wall = [[0, 0],
                   [0, 0],
                   [0, 0],
                   [0, 0],]

      self.dead_end = 0
      for i1 in range(5):
          x1 = self.pos[1] - (1 * i1)
          if self.maze[x1][self.pos[0]] == 1:
              self.dead_end = i1      
      
      
      pyxel.run(self.update, self.draw)
     
  def update(self): 
      
      self.wall = [[0, 0],
                   [0, 0],
                   [0, 0],
                   [0, 0],]      
              
      if pyxel.btnp(pyxel.KEY_UP):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          elif self.pos_angle == 2:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          elif self.pos_angle == 3:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3
          elif self.pos_angle == 4:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
                  

          
      if pyxel.btnp(pyxel.KEY_DOWN):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3
          elif self.pos_angle == 2:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
          elif self.pos_angle == 3:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          elif self.pos_angle == 4:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          
      if pyxel.btnp(pyxel.KEY_RIGHT):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          elif self.pos_angle == 2:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3
          elif self.pos_angle == 3:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
          elif self.pos_angle == 4:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          
      if pyxel.btnp(pyxel.KEY_LEFT):
          self.dead_end = 0
          if self.pos_angle == 1:
              if self.maze[self.pos[1]][self.pos[0] - 1] == 0:
                  self.pos[0] = self.pos[0] - 1     
                  self.pos_angle = 4
          elif self.pos_angle == 2:
              if self.maze[self.pos[1] - 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] - 1
                  self.pos_angle = 1
          elif self.pos_angle == 3:
              if self.maze[self.pos[1]][self.pos[0] + 1] == 0:
                  self.pos[0] = self.pos[0] + 1
                  self.pos_angle = 2
          elif self.pos_angle == 4:
              if self.maze[self.pos[1] + 1][self.pos[0]] == 0:
                  self.pos[1] = self.pos[1] + 1
                  self.pos_angle = 3    
  
          
      if self.pos_angle == 1:
          for i1 in range(4):
              if self.pos[1] - i1 < 0:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] - (1 * i1)
                  p2 = self.pos[0] - 1 + (2 * i2) 
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[p1][self.pos[0]] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1
                      
      elif self.pos_angle == 3:
          for i1 in range(4):
              if self.pos[1] + i1 > 9:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] + (1 * i1)
                  p2 = self.pos[0] + 1 - (2 * i2) 
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[p1][self.pos[0]] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1
                      
      elif self.pos_angle == 2:
          for i1 in range(4):
              if self.pos[0] + i1 > 9:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] - 1 + (2 * i2) 
                  p2 = self.pos[0] + (1 * i1)
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[self.pos[1]][p2] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1             
                          
      elif self.pos_angle == 4:
          for i1 in range(4):
              if self.pos[0] - i1 < 0:
                  break
              for i2 in range(2):
                  p1 = self.pos[1] + 1 - (2 * i2) 
                  p2 = self.pos[0] - (1 * i1)
              
                  self.wall[i1][i2] = self.maze[p1][p2]
              
                  if self.maze[self.pos[1]][p2] == 1:
                      if self.dead_end == 0:
                          self.dead_end = i1
                      if self.dead_end > i1:
                          self.dead_end = i1            


  def draw(self):
      pyxel.cls(0)
      
      pyxel.rectb(0, 150, 256, 106, 1)
#--------------------------------------------------------------      
      if self.wall[0][0] == 1:
          pyxel.line(0, 0, 50, 29, 6)
          pyxel.line(0, 0, 0, 150, 6)
          pyxel.line(0, 150, 50, 121, 6)
          pyxel.line(50, 29, 50, 121, 6)
      else:
          pyxel.line(0, 29, 50, 29, 6)
          pyxel.line(0, 121, 50, 121, 6)
      if self.wall[0][1] == 1:       
          pyxel.line(256, 0, 205, 29, 6)
          pyxel.line(256, 150, 205, 121, 6)      
          pyxel.line(255, 0, 255, 150, 6)
          pyxel.line(205, 29, 205, 121, 6)
      else:
          pyxel.line(256, 29, 205, 29, 6)
          pyxel.line(256, 121, 205, 121, 6)
#---------------------------------------------------------------          

#---------------------------------------------------------------                    
      if self.wall[1][0] == 1:       
          pyxel.line(50, 29, 80, 45, 12)
          pyxel.line(50, 121, 80, 105, 12)
          pyxel.line(50, 29, 50, 121, 12)
          pyxel.line(80, 45, 80, 105, 12)
      else:          
          pyxel.line(80, 45, 50, 45, 12)
          pyxel.line(80, 105, 50, 105, 12)
      if self.wall[1][1] == 1:       
         pyxel.line(205, 29, 175, 45, 12)
         pyxel.line(205, 121, 175, 105, 12)
         pyxel.line(205, 29, 205, 121, 12)
         pyxel.line(175, 45, 175, 105, 12)
      else:          
          pyxel.line(175, 45, 205, 45, 12)
          pyxel.line(175, 105, 205, 105, 12)      
#---------------------------------------------------------------          
      
#---------------------------------------------------------------                  
      if self.wall[2][0] == 1:       
          pyxel.line(80, 45, 97, 55, 5)
          pyxel.line(80, 105, 97, 95, 5)
          pyxel.line(80, 45, 80, 105, 5)
          pyxel.line(97, 55, 97, 95, 5)
      else:
          pyxel.line(97, 55, 80, 55, 5)
          pyxel.line(97, 95, 80, 95, 5)
      if self.wall[2][1] == 1:       
          pyxel.line(175, 45, 158, 55, 5)
          pyxel.line(175, 105, 158, 95, 5)
          pyxel.line(175, 45, 175, 105, 5)
          pyxel.line(158, 55, 158, 95, 5)
      else:
          pyxel.line(158, 55, 175, 55, 5)
          pyxel.line(158, 95, 175, 95, 5)
#---------------------------------------------------------------

#---------------------------------------------------------------                  
      if self.wall[3][0] == 1:       
          pyxel.line(97, 55, 108, 60, 1)
          pyxel.line(97, 95, 108, 90, 1)
          pyxel.line(97, 55, 97, 95, 1)
          pyxel.line(108, 60, 108, 90, 1)    
      if self.wall[3][1] == 1:       
         pyxel.line(158, 55, 148, 60, 1)
         pyxel.line(158, 95, 148, 90, 1)  
         pyxel.line(158, 55, 158, 95, 1)
         pyxel.line(148, 60, 148, 90, 1)      
#-------------------------------------------------------------      
      

 
      if self.dead_end == 0:
          pass
      elif self.dead_end == 1:
          pyxel.rect(50, 29, 156, 93, 0)
          pyxel.rectb(50, 29, 156, 93, 6)
      elif self.dead_end == 2:
          pyxel.rect(80, 45, 96, 61, 0)
          pyxel.rectb(80, 45, 96, 61, 12)
      elif self.dead_end == 3:
          pyxel.rect(97, 55, 62, 41, 0)
          pyxel.rectb(97, 55, 62, 41, 5)
      elif self.dead_end == 4:
          pyxel.rect(108, 60, 41, 30, 0)
          pyxel.rectb(108, 60, 41, 30, 1)
          
      for d in range(3):
          pyxel.text(30+10*d, 180, str(self.maze[self.pos[1]]
                                  [self.pos[0]-1+d]), 7)
      for d2 in range(3):
          pyxel.text(30+10*d2, 190, str(self.maze[self.pos[1]+1]
                                  [self.pos[0]-1+d2]), 7)
      for d3 in range(3):
          pyxel.text(30+10*d3, 170, str(self.maze[self.pos[1]-1]
                                  [self.pos[0]-1+d3]), 7)          
      pyxel.rect(40, 180, 10, 10, 0)
      if self.pos_angle == 1:
          pyxel.tri(41, 178, 37, 185, 45, 185, 8)
      elif self.pos_angle == 2:
          pyxel.tri(45, 181, 37, 178, 37, 185, 8)
      elif self.pos_angle == 3:
          pyxel.tri(41, 185, 37, 178, 45, 178, 8)
      elif self.pos_angle == 4:
          pyxel.tri(37, 183, 45, 178, 45, 186, 8)
      
      
      
      
APP()

▲思ったより長くなってしまいましたが、何とか形になりました。

次回は迷路ゲームの肝である「迷路の構造」について作っていきたいと思います。
今回はリストの形で持たせましたが、ここをどうするか。Pyxel Editorのタイルマップでグラフィカルに作成して取り込むのも面白そうだし、せっかくだから自動生成に挑戦してランダムマップを作るのも捨てがたいです。

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

この記事が参加している募集

つくってみた

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