python pygameでローグライクのRPGを作る -pygame-

<H1>スペースを押す度変化するダンジョン</H1>

```python
import pygame
import sys
import random

CYAN = (0,255,255)
GRAY = (96,96,96)

MAZE_W = 11
MAZE_H = 9

maze = []

for y in range(MAZE_H): #初期化
    maze.append([0]*MAZE_W)

def make_maze():
    XP = [0,1,0,-1] #一番左の柱以外は要素を0，1、0にして左に壁を作らない
    YP = [-1,0,1,0]

    for x in range(MAZE_W): #周りの壁　一番上と一番下
        maze[0][x] = 1　
        maze[MAZE_H-1][x] = 1
    for y in range(1, MAZE_H-1):　#周りの壁　一番左と一番右
        maze[y][0] = 1
        maze[y][MAZE_W-1] = 1
    
    for y in range(1,MAZE_H-1): #床を設定
        for x in range(1,MAZE_W-1):
            maze[y][x] = 0
    
    for y in range(2, MAZE_H-2, 2): #2マス感覚で柱を設定
        for x in range(2, MAZE_W-2, 2):
            maze[y][x] = 1
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            d = random.randint(0,3)
            if x > 2:
                d = random.randint(0,2)
            maze[y+YP[d]][x+XP[d]] = 1
def main():
    pygame.init()
    pygame.display.set_caption("迷路をつくる")
    screen = pygame.display.set_mode((528,432))
    clock = pygame.time.Clock()
    
    make_maze()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    make_maze()
        for y in range(MAZE_H):
            for x in range(MAZE_W):
                W = 48 #一マスの幅
                H = 48 #一マスの高さ
                X = x*W #描画の座標
                Y = y*H #描画の座標
                if maze[y][x] == 0:
                    pygame.draw.rect(screen,CYAN,[X,Y,W,H])
                if maze[y][x] == 1:
                    pygame.draw.rect(screen,GRAY,[X,Y,W,H])
        pygame.display.update()
        clock.tick(2)

if __name__ == '__main__':
    main()
```
![mazemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/9b2b9812-1e26-5aed-e45e-f2195a48f100.png)

<H1>部屋と通路をつくる</H1>

```python
import pygame
import sys
import random

BLACK = (0,0,0)
CYAN = (0,255,255)
GRAY = (96,96,96)

MAZE_W = 11
MAZE_H = 9

maze = []

for y in range(MAZE_H):
    maze.append([0]*MAZE_W)
    
DUNGEON_W = MAZE_W*3
DUNGEON_H = MAZE_H*3
dungeon =[]

for y in range(DUNGEON_H):
    dungeon.append([0]*DUNGEON_W)

imgWall = pygame.image.load("C:\ds_python/wall.png")
imgFloor = pygame.image.load("C:\ds_python/floor.png")

def make_dungeon():
    XP = [0,1,0,-1]
    YP = [-1,0,1,0]

    for x in range(MAZE_W):
        maze[0][x] = 1
        maze[MAZE_H-1][x] = 1
    for y in range(1, MAZE_H-1):
        maze[y][0] = 1
        maze[y][MAZE_W-1] = 1
    
    for y in range(1,MAZE_H-1):
        for x in range(1,MAZE_W-1):
            maze[y][x] = 0
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            maze[y][x] = 1
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            d = random.randint(0,3)
            if x > 2:
                d = random.randint(0,2)
            maze[y+YP[d]][x+XP[d]] = 1
    
    for y in range(DUNGEON_H):
        for x in range(DUNGEON_W):
            dungeon[y][x] = 9 #全て壁にする
            
    for y in range(1, MAZE_H-1):
        for x in range(1, MAZE_W-1):
            dx = x*3+1
            dy = y*3+1
            if maze[y][x] ==　0:　
                if random.randint(0,99) < 20:
                    for ry in range(-1,2):
                        for rx in range(-1,2):
                            dungeon[dy+ry][dx+rx] = 0
                else:
                    dungeon[dy][dx] = 0
                    if maze[y-1][x] == 0:
                        dungeon[dy-1][dx] = 0
                    if maze[y+1][x] == 0:
                        dungeon[dy+1][dx] = 0
                    if maze[y][x-1] == 0:
                        dungeon[dy][dx-1] = 0
                    if maze[y][x+1] == 0:
                        dungeon[dy][dx+1] = 0
    
def main():
    pygame.init()
    pygame.display.set_caption("ダンジョンをつくる")
    screen = pygame.display.set_mode((1056,432))
    clock = pygame.time.Clock()
    
    make_dungeon()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    make_dungeon()
        for y in range(MAZE_H):
            for x in range(MAZE_W):
                X = x*48
                Y = y*48
                if maze[y][x] == 0:
                    pygame.draw.rect(screen,CYAN,[X,Y,48,48])
                if maze[y][x] == 1:
                    pygame.draw.rect(screen,GRAY,[X,Y,48,48])
                    
        for y in range(DUNGEON_H):
            for x in range(DUNGEON_W):
                X = x*16+528
                Y = y*16
                if dungeon[y][x] == 0:
                    screen.blit(imgFloor,[X,Y]) 
                if dungeon[y][x] == 9:
                    screen.blit(imgWall,[X,Y]) 
                    
        pygame.display.update()
        clock.tick(2)

if __name__ == '__main__':
    main()
```
![mazemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/1d480a44-a8d0-f9ef-b6d5-b7721185f1f2.png)

<H1>ダンジョン内を歩く</H1>

```python
import pygame
import sys
import random

BLACK = (0,0,0)


MAZE_W = 11
MAZE_H = 9

maze = []

for y in range(MAZE_H):
    maze.append([0]*MAZE_W)
    
DUNGEON_W = MAZE_W*3
DUNGEON_H = MAZE_H*3

dungeon =[]

for y in range(DUNGEON_H):
    dungeon.append([0]*DUNGEON_W)

imgWall = pygame.image.load("C:\ds_python/wall.png")
imgFloor = pygame.image.load("C:\ds_python/floor.png")
imgPlayer = pygame.image.load("C:\ds_python/player.png")

pl_x = 4
pl_y = 4


def make_dungeon():
    XP = [0,1,0,-1]
    YP = [-1,0,1,0]

    for x in range(MAZE_W):
        maze[0][x] = 1
        maze[MAZE_H-1][x] = 1
    for y in range(1, MAZE_H-1):
        maze[y][0] = 1
        maze[y][MAZE_W-1] = 1
    
    for y in range(1,MAZE_H-1):
        for x in range(1,MAZE_W-1):
            maze[y][x] = 0
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            maze[y][x] = 1
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            d = random.randint(0,3)
            if x > 2:
                d = random.randint(0,2)
            maze[y+YP[d]][x+XP[d]] = 1
    
    for y in range(DUNGEON_H):
        for x in range(DUNGEON_W):
            dungeon[y][x] = 9
            
    for y in range(1, MAZE_H-1):
        for x in range(1, MAZE_W-1):
            dx = x*3+1
            dy = y*3+1
            if maze[y][x] ==0:
                if random.randint(0,99) < 20:
                    for ry in range(-1,2):
                        for rx in range(-1,2):
                            dungeon[dy+ry][dx+rx] = 0
                else:
                    dungeon[dy][dx] = 0
                    if maze[y-1][x] == 0:
                        dungeon[dy-1][dx] = 0
                    if maze[y+1][x] == 0:
                        dungeon[dy+1][dx] = 0
                    if maze[y][x-1] == 0:
                        dungeon[dy][dx-1] = 0
                    if maze[y][x+1] == 0:
                        dungeon[dy][dx+1] = 0
def draw_dungeon(bg):
    bg.fill(BLACK)
    #上下5マスずつ、プレイヤーが軸でダンジョンを描写
    for y in range(-5, 6):
        for x in range(-5, 6):
            X = (x+5)*16 #床か壁をつくるx座標
            Y = (y+5)*16 #床か壁をつくるy座標
            dx = pl_x + x #Xと対になっている、プレイヤーからx分足した場所のdungeon配列
            dy = pl_y + y #yと対になっている、プレイヤーからy分足した場所のdungeon配列
            if 0 <= dx and dx < DUNGEON_W and 0 <= dy and dy < DUNGEON_H:
                if dungeon[dy][dx] == 0:
                    bg.blit(imgFloor, [X,Y])
                if dungeon[dy][dx] == 9:
                    bg.blit(imgWall, [X,Y])
            if x == 0 and y == 0: #半分描写したらプレイヤーを中心に描写
                bg.blit(imgPlayer,[X,Y-8])
def move_player():
    global pl_x, pl_y
    key = pygame.key.get_pressed()
    if key[pygame.K_UP] == 1:
        if dungeon[pl_y-1][pl_x] != 9: pl_y = pl_y - 1
    if key[pygame.K_DOWN] == 1:
        if dungeon[pl_y+1][pl_x] != 9: pl_y = pl_y + 1
    if key[pygame.K_LEFT] == 1:
        if dungeon[pl_y][pl_x-1] != 9: pl_x = pl_x - 1
    if key[pygame.K_RIGHT] == 1:
        if dungeon[pl_y][pl_x+1] != 9: pl_x = pl_x + 1
    
def main():
    pygame.init()
    pygame.display.set_caption("ダンジョンを歩く")
    screen = pygame.display.set_mode((176,176))
    clock = pygame.time.Clock()
    
    make_dungeon()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        
        move_player()
        draw_dungeon(screen)
        pygame.display.update()
        clock.tick(5)

if __name__ == '__main__':
    main()
```
![mazemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/1ec8fb7c-dc8f-30b3-3bae-8fc01405184a.png)

<H1>戦闘でメッセージを表示</H1>

```python
import pygame
import sys

WHITE = (255,255,255)
BLACK = (0,0,0)
imgBtlBG = pygame.image.load("C:\ds_python/btlbg.png")
imgEnemy = pygame.image.load("C:\ds_python/enemy1.png")

emy_x = 440-imgEnemy.get_width()/2
emy_y = 560-imgEnemy.get_height()

message = [""]*10

def init_message():
    for i in range(10):
        message[i] = ""

def set_message(msg): #空であればmsgを追加
    for i in range(10):
        if message[i] == "":
            message[i] = msg
            return　#処理が返る
    for i in range(9): #0～8のリストをひとつずらす
        message[i] = message[i+1]
        message[9] = msg　#9のリストを追加

def draw_text(bg, txt, x, y, fnt, col):
    sur = fnt.render(txt, True, BLACK)
    bg.blit(sur, [x+1,y+2])
    sur = fnt.render(txt,True,col)
    bg.blit(sur, [x,y])
    
def draw_battle(bg, fnt):
    bg.blit(imgBtlBG, [0,0])
    bg.blit(imgEnemy, [emy_x,emy_y])
    for i in range(10):
        draw_text(bg, message[i],600,100+i*50,fnt,WHITE)


def main():
    pygame.init()
    pygame.display.set_caption("戦闘中のメッセージ")
    screen = pygame.display.set_mode((880,720))
    clock = pygame.time.Clock()
    font = pygame.font.Font(None, 40)
    init_message()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                set_message("KEYDOWN"+str(event.key))
        draw_battle(screen, font)
        pygame.display.update()
        clock.tick(5)

if __name__ == '__main__':
    main()
```
![mazemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/d31bebc1-afc2-8c2d-5fd6-82941c934b70.png)

<H1>ターン制の処理</H1>

```python
import pygame
import sys
import random
from pygame.locals import *

WHITE = (255,255,255)
BLACK = (0,0,0)
imgBtlBG = pygame.image.load("C:\ds_python/btlbg.png")
imgEffect = pygame.image.load("C:\ds_python/effect_a.png")
imgEnemy = pygame.image.load("C:\ds_python/enemy1.png")

emy_x = 440-imgEnemy.get_width()/2
emy_y = 560-imgEnemy.get_height()

emy_step = 0
emy_blink = 0
dmg_eff = 0
COMMAND = ["[A]ttack","[P]otion","[S]laze gem", "[R]un"]



message = [""]*10

def init_message():
    for i in range(10):
        message[i] = ""

def set_message(msg):
    for i in range(10):
        if message[i] == "":
            message[i] = msg
            return
    for i in range(9):
        message[i] = message[i+1]
        message[9] = msg

def draw_text(bg, txt, x, y, fnt, col):
    sur = fnt.render(txt, True, BLACK)
    bg.blit(sur, [x+1,y+2])
    sur = fnt.render(txt,True,col)
    bg.blit(sur, [x,y])
    
def draw_battle(bg, fnt):
    global emy_blink, dmg_eff
    bx = 0
    by = 0
    if dmg_eff > 0:
        dmg_eff = dmg_eff -1
        bx = random.randint(-20, 20)
        by = random.randint(-10, 10)
    bg.blit(imgBtlBG, [bx,by])
    if emy_blink % 2 == 0:
        bg.blit(imgEnemy, [emy_x,emy_y+emy_step])
    if emy_blink > 0:
        emy_blink = emy_blink - 1
    for i in range(10):
        draw_text(bg, message[i],600,100+i*50,fnt,WHITE)

def battle_command(bg, fnt):
    for i in range(4):
        draw_text(bg, COMMAND[i], 20, 300+60*i, fnt, WHITE)


def main():
    global emy_step, emy_blink, dmg_eff
    idx = 10
    tmr = 0
    pygame.init()
    pygame.display.set_caption("ターン制の処理")
    screen = pygame.display.set_mode((880,720))
    clock = pygame.time.Clock()
    font = pygame.font.Font(None, 40)
    init_message()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        draw_battle(screen, font)
        tmr = tmr + 1
        key = pygame.key.get_pressed()
        
        if idx == 10:
            if tmr == 1: set_message("Encounter")
            if tmr == 6:
                idx = 11
                tmr = 0
        elif idx == 11:
            if tmr == 1: set_message("Your turn")
            battle_command(screen, font)
            if key[K_a] == 1 or key[K_SPACE] == 1:
                idx = 12
                tmr = 0
        elif idx == 12:
            if tmr == 1: set_message("Your attack!")
            if 2 <= tmr and tmr <= 4:
                screen.blit(imgEffect, [700-tmr*120, -100+tmr*120])
            if tmr == 5:
                emr_blink = 5
                set_message("***pts of damage!")
            if tmr == 16:
                idx =13
                tmr = 0
        elif idx == 13:
            if tmr == 1: set_message("Enemy turn.")
            if tmr == 5:
                set_message("Enemy attack!")
                emy_step = 30
            if tmr == 9:
                set_message("***pts of damage!")
                dmg_eff = 5
                emy_step = 0
            if tmr == 20:
                idx = 11
                tmr = 0
        pygame.display.update()
        clock.tick(5)

if __name__ == '__main__':
    main()
```
![mazemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/2a8f858b-a110-f67c-7aa2-17458579fcea.png)

<H1>ローグライクゲームを完成させる</H1>

```python
import pygame
import sys
import random
from pygame.locals import *

WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255, 0, 0)
CYAN = (0, 255, 255)
BLINK = [(224,255,255),(192,240,255),(128,224,255),(64,192,255),(128,224,225),(192,240,255)]

imgTitle = pygame.image.load("C:\ds_python/image/title.png")
imgWall = pygame.image.load("C:\ds_python/image/wall.png")
imgWall2 = pygame.image.load("C:\ds_python/image/wall2.png")
imgDark = pygame.image.load("C:\ds_python/image/dark.png")
imgPara = pygame.image.load("C:\ds_python/image/parameter.png")
imgBtlBG = pygame.image.load("C:\ds_python/image/btlbg.png")
imgEnemy = pygame.image.load("C:\ds_python/image/enemy0.png")
imgItem = [
    pygame.image.load("C:\ds_python/image/potion.png"),
    pygame.image.load("C:\ds_python/image/blaze_gem.png"),
    pygame.image.load("C:\ds_python/image/spoiled.png"),
    pygame.image.load("C:\ds_python/image/apple.png"),
    pygame.image.load("C:\ds_python/image/meat.png")
]
imgFloor = [
    pygame.image.load("C:\ds_python/image/floor.png"),
    pygame.image.load("C:\ds_python/image/tbox.png"),
    pygame.image.load("C:\ds_python/image/cocoon.png"),
    pygame.image.load("C:\ds_python/image/stairs.png")
]
imgPlayer = [
    pygame.image.load("C:\ds_python/image/mychr0.png"),
    pygame.image.load("C:\ds_python/image/mychr1.png"),
    pygame.image.load("C:\ds_python/image/mychr2.png"),
    pygame.image.load("C:\ds_python/image/mychr3.png"),
    pygame.image.load("C:\ds_python/image/mychr4.png"),
    pygame.image.load("C:\ds_python/image/mychr5.png"),
    pygame.image.load("C:\ds_python/image/mychr6.png"),
    pygame.image.load("C:\ds_python/image/mychr7.png"),
    pygame.image.load("C:\ds_python/image/mychr8.png"),
]
imgEffect = [
    pygame.image.load("C:\ds_python/image/effect_a.png"),
    pygame.image.load("C:\ds_python/image/effect_b.png")
]

speed = 1
idx = 0
tmr = 0
floor = 0
fl_max = 1
welcome = 0

pl_x = 0
pl_y = 0
pl_d = 0
pl_a = 0
pl_lifemax = 0
pl_life = 0
pl_str = 0
food = 0
potion = 0
blazegem = 0
treature = 0

emy_name = ""
emy_lifemax = 0
emy_life = 0
emy_str = 0
emy_x = 0
emy_y = 0
emy_step = 0
emy_blink = 0

dmg_eff = 0
btl_cmd = 0

COMMAND =["[A]ttack","[P]otion","[B]laze gem","[R]un"]
TRE_NAME =["Potion","Blaze gem","Food spoiled","Food +20", "Food + 100"]
EMY_NAME =[
    "Green slime",
    "Red slime",
    "Axe beast",
    "Ogre",
    "Sword man",
    "Death hornet",
    "Signal slime",
    "Devil plant",
    "Twin killer",
    "Hell"
]

MAZE_W = 11
MAZE_H = 9
maze = []
for y in range(MAZE_H):
    maze.append([0]*MAZE_W)

DUNGEON_W = MAZE_W*3
DUNGEON_H = MAZE_H*3
dungeon = []

for y in range(DUNGEON_H):
    dungeon.append([0]*DUNGEON_W)

def make_dungeon():
    XP = [0,1,0,-1]
    YP = [-1,0,1,0]

    for x in range(MAZE_W):
        maze[0][x] = 1
        maze[MAZE_H-1][x] = 1
    for y in range(1, MAZE_H-1):
        maze[y][0] = 1
        maze[y][MAZE_W-1] = 1
    
    for y in range(1,MAZE_H-1):
        for x in range(1,MAZE_W-1):
            maze[y][x] = 0
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            maze[y][x] = 1
    
    for y in range(2, MAZE_H-2, 2):
        for x in range(2, MAZE_W-2, 2):
            d = random.randint(0,3)
            if x > 2:
                d = random.randint(0,2)
            maze[y+YP[d]][x+XP[d]] = 1
    
    for y in range(DUNGEON_H):
        for x in range(DUNGEON_W):
            dungeon[y][x] = 9
            
    for y in range(1, MAZE_H-1):
        for x in range(1, MAZE_W-1):
            dx = x*3+1
            dy = y*3+1
            if maze[y][x] == 0:
                if random.randint(0,99) < 20:
                    for ry in range(-1,2):
                        for rx in range(-1,2):
                            dungeon[dy+ry][dx+rx] = 0
                else:
                    dungeon[dy][dx] = 0
                    if maze[y-1][x] == 0:
                        dungeon[dy-1][dx] = 0
                    if maze[y+1][x] == 0:
                        dungeon[dy+1][dx] = 0
                    if maze[y][x-1] == 0:
                        dungeon[dy][dx-1] = 0
                    if maze[y][x+1] == 0:
                        dungeon[dy][dx+1] = 0
                        
def draw_dungeon(bg, fnt):
    bg.fill(BLACK)
    #上下5マスずつ、プレイヤーが軸でダンジョンを描写
    for y in range(-4, 6):
        for x in range(-5, 6):
            X = (x+5)*80 #床か壁をつくるx座標
            Y = (y+4)*80 #床か壁をつくるy座標
            dx = pl_x + x #Xと対になっている、プレイヤーからx分足した場所のdungeon配列
            dy = pl_y + y #yと対になっている、プレイヤーからy分足した場所のdungeon配列
            if 0 <= dx and dx < DUNGEON_W and 0 <= dy and dy < DUNGEON_H:
                if dungeon[dy][dx] <= 3:
                    bg.blit(imgFloor[dungeon[dy][dx]], [X,Y])
                if dungeon[dy][dx] == 9:
                    bg.blit(imgWall, [X,Y-40])
                    if dy > 1 and dungeon[dy-1][dx] == 9:
                        bg.blit(imgWall2, [X,Y-80])
            if x == 0 and y == 0: #半分描写したらプレイヤーを中心に描写
                bg.blit(imgPlayer[pl_a],[X,Y-40])
    bg.blit(imgDark, [0,0])
    draw_pare(bg,fnt)

def put_event():
    global pl_x,pl_y,pl_d,pl_a
    
    while True:
        x = random.randint(3, DUNGEON_W-4)
        y = random.randint(3, DUNGEON_H-4)
        if(dungeon[y][x] == 0):
            for ry in range(-1, 2):
                for rx in range(-1, 2):
                    dungeon[y+ry][x+rx] = 0
            dungeon[y][x] = 3
            break
    for i in range(60):
        x = random.randint(3, DUNGEON_W-4)
        y = random.randint(3, DUNGEON_H-4)
        if(dungeon[y][x] == 0):
            dungeon[y][x] = random.choice([1,2,2,2,2])
            
    while True:
        pl_x = random.randint(3, DUNGEON_W-4)
        pl_y = random.randint(3, DUNGEON_H-4)
        if(dungeon[pl_y][pl_x] == 0):
            break
    
    pl_d = 1
    pl_a = 2


def move_player(key):
    global idx, tmr, pl_x, pl_y, pl_d, pl_a, pl_life, food, potion, blazegem, treasure
    
    if dungeon[pl_y][pl_x] == 1:
        dungeon[pl_y][pl_x] = 0
        treasure = random.choice([0,0,0,1,1,1,1,1,1,2])
        if treasure == 0:
            potion = potion + 1
        if treasure == 1:
            blazegem = blazegem + 1
        if treasure == 2:
            food = int(food/2)
        idx = 3
        tmr = 0
        return
    if dungeon[pl_y][pl_x] == 2:
        dungeon[pl_y][pl_x] = 0
        r = random.randint(0,99)
        if r < 40 :
            treasure = random.choice([3,3,3,4])
            if treasure == 3: food = food + 20
            if treasure == 4: food = food + 100
            idx = 3
            tmr = 0
        else:
            idx = 10
            tmr = 0
        return
    if dungeon[pl_y][pl_x] == 3:
        idx = 2
        tmr = 0
        return
    x = pl_x
    y = pl_y
    if key[K_UP] == 1:
        pl_d = 0
        if dungeon[pl_y-1][pl_x] != 9:
            pl_y = pl_y - 1
    if key[K_DOWN] == 1:
        pl_d = 1
        if dungeon[pl_y+1][pl_x] != 9:
            pl_y = pl_y + 1
    if key[K_LEFT] == 1:
        pl_d = 2
        if dungeon[pl_y][pl_x-1] != 9:
            pl_x = pl_x - 1
    if key[pygame.K_RIGHT] == 1:
        pl_d = 3
        if dungeon[pl_y][pl_x+1] != 9:
            pl_x = pl_x + 1
    pl_a = pl_d * 2
    if pl_x != x or pl_y != y:
        pl_a = pl_a + tmr%2
        if food > 0:
            food = food -1
            if pl_life < pl_lifemax:
                pl_life = pl_life + 1
        else:
            pl_life = pl_life - 5
            if pl_life <= 0:
                pl_life = 0
                pygame.mixer.music.stop()
                idx = 9
                tmr = 0



def draw_text(bg, txt, x, y, fnt, col):
    sur = fnt.render(txt, True, BLACK)
    bg.blit(sur, [x+1,y+2])
    sur = fnt.render(txt,True,col)
    bg.blit(sur, [x,y])
    
def draw_pare(bg,fnt):
    X = 30
    Y = 600
    bg.blit(imgPara, [X,Y])
    col = WHITE
    if pl_life < 10 and tmr%2 == 0: col = RED
    draw_text(bg, "{}/{}".format(pl_life, pl_lifemax), X+128, Y+6, fnt, col)
    draw_text(bg, str(pl_str), X+128, Y+33, fnt, WHITE)
    col = WHITE
    if food == 0 and tmr%2 == 0: col = RED
    draw_text(bg, str(food), X+128, Y+60, fnt, col)
    draw_text(bg, str(potion), X+266, Y+6, fnt, WHITE)
    draw_text(bg, str(blazegem), X+266, Y+33, fnt, WHITE)
    

def init_battle():
    global imgEnemy, emy_name, emy_lifemax, emy_life, emy_str, emy_x, emy_y
    typ = random.randint(0, floor)
    if floor >= 10:
        typ = random.randint(0, 9)
    lev = random.randint(1, floor)
    imgEnemy = pygame.image.load("C:\ds_python/image/enemy" + str(typ)+ ".png")
    emy_name = EMY_NAME[typ] + " LV" + str(lev)
    emy_lifemax = 60*(typ+1) + (lev-1)*10
    emy_life = emy_lifemax
    emy_str = int(emy_lifemax/8)
    emy_x = 440-imgEnemy.get_width()/2
    emy_y = 560-imgEnemy.get_height()

def draw_bar(bg, x, y, w, h, val, ma):
    pygame.draw.rect(bg, WHITE, [x-2, y-2, w+4, h+4])
    pygame.draw.rect(bg, BLACK, [x, y, w, h])
    if val > 0:
        pygame.draw.rect(bg, (0,128,255),[x,y,w*val/ma, h])

def draw_battle(bg, fnt):
    global emy_blink, dmg_eff
    bx = 0
    by = 0
    if dmg_eff > 0:
        dmg_eff = dmg_eff -1
        bx = random.randint(-20, 20)
        by = random.randint(-10, 10)
    bg.blit(imgBtlBG, [bx,by])
    if emy_life > 0 and emy_blink % 2 == 0:
        bg.blit(imgEnemy, [emy_x,emy_y+emy_step])
    draw_bar(bg,340,580,200,10, emy_life, emy_lifemax)
    if emy_blink > 0:
        emy_blink = emy_blink - 1
    for i in range(10):
        draw_text(bg, message[i],600,100+i*50,fnt,WHITE)
    draw_pare(bg, fnt)

def battle_command(bg, fnt, key):
    global btl_cmd
    ent = False
    if key[K_a]:
        btl_cmd = 0
        ent = True
    if key[K_p]:
        btl_cmd = 1
        ent = True
    if key[K_b]:
        btl_cmd = 2
        ent = True
    if key[K_r]:
        btl_cmd = 3
    if key[K_UP] and btl_cmd > 0:
        btl_cmd -= 1
    if key[K_DOWN] and btl_cmd < 3:
        btl_cmd += 1
    if key[K_SPACE] or key[K_RETURN]:
        ent = True
    for i in range(4):
        c = WHITE
        if btl_cmd == i: c = BLINK[tmr%6]
        draw_text(bg, COMMAND[i], 20, 360+i*60, fnt, c)
    return ent
message = [""]*10

def init_message():
    for i in range(10):
        message[i] = ""

def set_message(msg):
    for i in range(10):
        if message[i] == "":
            message[i] = msg
            return
    for i in range(9):
        message[i] = message[i+1]
    message[9] = msg

def main():
    global speed, idx, tmr, floor, fl_max, welcome
    global pl_a, pl_lifemax, pl_life, pl_str, food, potion, blazegem
    global emy_life, emy_step, emy_blink, dmg_eff
    dmg = 0
    lif_p = 0
    str_p = 0
    
    pygame.init()
    pygame.display.set_caption("one hour Dungeon")
    screen = pygame.display.set_mode((880,720))
    clock = pygame.time.Clock()
    font = pygame.font.Font(None, 40)
    fontS = pygame.font.Font(None, 40)
    se = [pygame.mixer.Sound("C:\ds_python/sound/ohd_se_attack.ogg"),
            pygame.mixer.Sound("C:\ds_python/sound/ohd_se_blaze.ogg"),
            pygame.mixer.Sound("C:\ds_python/sound/ohd_se_potion.ogg"),
            pygame.mixer.Sound("C:\ds_python/sound/ohd_jin_gameover.ogg"),
            pygame.mixer.Sound("C:\ds_python/sound/ohd_jin_levup.ogg"),
            pygame.mixer.Sound("C:\ds_python/sound/ohd_jin_win.ogg")
    ]
    
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_s:
                    speed = speed + 1
                    if speed == 4:
                        speed = 1
                        
        tmr = tmr + 1
        key = pygame.key.get_pressed()
        
        if idx == 0:
            if tmr == 1:
                pygame.mixer.music.load("C:\ds_python/sound/ohd_bgm_title.ogg")
                pygame.mixer.music.play(-1)
            screen.fill(BLACK)
            screen.blit(imgTitle, [40,60])
            if fl_max >= 2:
                draw_text(screen, "You reachd floor {}".format(fl_max),300, 460, font, CYAN)
            draw_text(screen, "Press space key",320, 560, font, BLINK[tmr%6])
            if key[K_SPACE] == 1:
                make_dungeon()
                put_event()
                floor = 1
                welcome = 15
                pl_lifemax = 300
                pl_life = pl_lifemax
                pl_str = 100
                food = 300
                potion = 0
                blazegen = 0
                idx = 1
                pygame.mixer.music.load("C:\ds_python/sound/ohd_bgm_field.ogg")
                pygame.mixer.music.play(-1)
        elif idx == 1:
            move_player(key)
            draw_dungeon(screen, fontS)
            draw_text(screen, "floor {} ({},{})".format(floor, pl_x, pl_y), 60, 40, fontS, WHITE)
            if welcome > 0:
                welcome = welcome - 1
                draw_text(screen, "Welcome to floor {}".format(floor), 300, 180, font, CYAN)
                
        elif idx == 2:
            draw_dungeon(screen, fontS)
            if 1 <= tmr and tmr <= 5:
                h = 80*tmr
                pygame.draw.rect(screen, BLACK, [0,0, 880, h])
                pygame.draw.rect(screen, BLACK, [0, 720-h, 880, h])
            if tmr == 5:
                floor = floor + 1
                if floor > fl_max:
                    fl_max = floor
                welcome = 15
                make_dungeon()
                put_event()
            if 6 <= tmr and tmr <= 9:
                h = 80*(10-tmr)
                pygame.draw.rect(screen, BLACK, [0,0,880,h])
                pygame.draw.rect(screen, BLACK, [0,720-h, 880, h])
            if tmr == 10:
                idx = 1
        elif idx == 3:
            draw_dungeon(screen, fontS)
            screen.blit(imgItem[treasure], [320,220])
            draw_text(screen, TRE_NAME[treasure], 380, 240, font, WHITE)
            if tmr == 10:
                idx =1
        
        elif idx == 9:
            if tmr <= 30:
                PL_TURN = [2,4,0,6]
                pl_a = PL_TURN[tmr%4]
                if tmr == 30: pl_a = 8
                draw_dungeon(screen, fontS)
            elif tmr == 31:
                se[3].play()
                draw_text(screen, "You died.", 360, 240, font, RED)
                draw_text(screen, "Game over", 360, 380, font, RED)
            elif tmr == 100:
                idx = 0
                tmr = 0
            
        if idx == 10:
            if tmr == 1: 
                pygame.mixer.music.load("C:\ds_python/sound/ohd_bgm_battle.ogg")
                pygame.mixer.music.play(-1)
                init_battle()
                init_message()
            if tmr <= 4:
                bx = (4-tmr) * 220
                by = 0
                screen.blit(imgBtlBG, [bx,by])
                draw_text(screen, "Encounter", 350, 200, font, WHITE)
            if tmr <= 16:
                draw_battle(screen, fontS)
                draw_text(screen,emy_name+" appear!", 300, 200, font, WHITE)
            else:
                idx = 11
                tmr = 0
        elif idx == 11:
            draw_battle(screen, fontS)
            if tmr == 1: set_message("Your turn")
            if battle_command(screen, font, key) == True:
                if btl_cmd == 0:
                    idx =12
                    tmr = 0
                if btl_cmd == 1 and potion > 0:
                    idx = 20
                    tmr = 0
                if btl_cmd == 2 and blazegem > 0:
                    idx = 21
                    tmr = 0
                if btl_cmd == 3:
                    idx = 14
                    tmr = 0
                    
                
            if key[K_a] == 1 or key[K_SPACE] == 1:
                idx = 12
                tmr = 0
        elif idx == 12:
            draw_battle(screen,fontS)
            if tmr == 1: 
                set_message("Your attack!")
                se[0].play()
                dmg = pl_str + random.randint(0,9)
            if 2 <= tmr and tmr <= 4:
                screen.blit(imgEffect[0], [700-tmr*120, -100+tmr*120])
            if tmr == 5:
                emr_blink = 5
                set_message(str(dmg) + "pts of damage!")
            if tmr == 11:
                emy_life = emy_life -dmg
                if emy_life <= 0:
                    emy_life = 0
                    idx = 16
                    tmr = 0
            if tmr == 16:
                idx =13
                tmr = 0
                
        elif idx == 13:
            draw_battle(screen,fontS)
            if tmr == 1: 
                set_message("Enemy turn.")
            if tmr == 5:
                set_message(emy_name + " attack!")
                se[0].play
                emr_step = 30
            if tmr == 9:
                dmg = emy_str + random.randint(0,9)
                set_message(str(dmg) + "pts of damege!")
                dmg_eff = 5
                emy_step = 0
            if tmr == 15:
                pl_life = pl_life -dmg
                if pl_life <= 0:
                    pl_life = 0
                    idx = 15
                    tmr = 0
            if tmr == 20:
                idx = 11
                tmr = 0

        elif idx == 14:
            draw_battle(screen,fontS)
            if tmr == 1: set_message("...")
            if tmr == 2: set_message(".....")
            if tmr == 3: set_message(".......")
            if tmr == 4: set_message(".........")
            if tmr == 5:
                if random.randint(0,99) < 60:
                    idx = 22
                else:
                    set_message("You failed to flee.")
            if tmr == 10:
                idx =13
                tmr = 0
        elif idx == 15:
            draw_battle(screen,fontS)
            if tmr == 1:
                pygame.mixer.music.stop()
                set_message("You lose")
        elif idx == 16:
            draw_battle(screen,fontS)
            if tmr == 1:
                set_message("You win!")
                pygame.mixer.music.stop()
                se[5].play()
            if tmr == 28:
                idx = 22
                if random.randint(0, emy_lifemax) > random.randint(0, pl_lifemax):
                    idx = 17
                    
        elif idx == 17:
            draw_battle(screen, fontS)
            if tmr == 1:
                set_message("Level up!")
                se[4].play()
                lif_p = random.randint(10, 20)
                str_p = random.randint(5,10)
            if tmr == 21:
                set_message("Max life + " + str(lif_p))
                pl_lifemax = pl_lifemax + lif_p
            if tmr == 26:
                set.message("str + " + str(str_p))
                pl_str = pl_str + str_p
            if tmr == 50:
                idx = 22
        elif idx == 20:
            draw_battle(screen, fontS)
            if tmr == 1:
                set_message("Potion!")
                se[2].play
            if tmr == 6:
                pl_life = pl_lifemax
                potion = potion - 1
            if tmr == 11:
                idx = 13
                tmr = 0
                
        elif idx == 21:
            draw_battle(screen, fontS)
            img_rz = pygame.transform.rotozoom(imgEffect[1], 30*tmr, (12-tmr)/8)
            X = 440-img_rz.get_width()/2
            Y = 360-img_rz.get_height()/2
            screen.blit(img_rz, [X,Y])
            if tmr == 1:
                set_message("Blaze gem!")
                se[1].play
            if tmr == 6:
                blazegem = blazegem - 1
            if tmr == 11:
                dmg = 1000
                idx = 12
                tmr = 4
        elif idx == 22:
            pygame.mixer.music.load("C:\ds_python/sound/ohd_bgm_field.ogg")
            pygame.mixer.music.play(-1)
            idx = 1
        
        draw_text(screen, "[S]peed " +str(speed), 740, 40, fontS, WHITE)

        pygame.display.update()
        clock.tick(3+2*speed)

if __name__ == '__main__':
    main()
```
![mazemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/3634086b-95a5-6ad3-7089-15554388b472.png)