バトル画面


[記事全体の目次へ移動](https://qiita.com/hijpa/items/31900e327315fa8e4eea)

 
# バトル画面

<details><summary>ここをクリックしてください</summary>

```python:
import pygame
from pygame import *
import sys
import time
import random
import numpy as np


pygame.init()
screen=pygame.display.set_mode((640,480))
pygame.display.set_caption('battle')


#初期ステータス
Max_HP = 8
player_HP = 8
Max_MP = 0
player_MP = 0
power = 13
quick = 1
arms = 0
attack_power = power + arms
deffence = 0

Gold = 200
Level = 1
Exp = 0


#ここにフォントのパスを貼り付ける
font = pygame.font.Font(, 18)
#ここにカーソル画像のパスを貼り付ける
cursor = pygame.image.load()
#ここにモンスター画像のパスを貼り付ける
slyme_image = pygame.image.load()
#ここにモンスター画像のパスを貼り付ける
wolf_image = pygame.image.load()
#ここにモンスター画像のパスを貼り付ける
chikin_image = pygame.image.load()

#SE
#ここにボタン音のパスを貼り付ける
sound = pygame.mixer.Sound()
#ここにダメージ音のパスを貼り付ける
sound2 = pygame.mixer.Sound()
#ここにレベルアップのパスを貼り付ける
sound3 = pygame.mixer.Sound()
#BGM
#ここに戦闘のBGMのパスを貼り付ける
battle_bgm = 
#ここに勝ったときのBGMのパスを貼り付ける
win_bgm = 
#ここに負けたときのBGMのパスを貼り付ける
lose_bgm = 


# テキストを改行して描画する関数
def draw_text(surface, message, pos, font, color=(255, 255, 255)):
    lines = message.split('\n')
    x, y = pos
    for line in lines:
        text_surface = font.render(line, True, color)
        surface.blit(text_surface, (x, y))
        y += text_surface.get_height()

#カーソル
cursor_x = 30
cursor_y = 368
alpha = 220
delta = 5
clock = pygame.time.Clock()

battle_message = True
command = False
effect = 0

monster_attack = 0
motion = 0
attack = 0 
encount = 0

#モンスター
monster_list = [slyme_image, wolf_image ,chikin_image]
random.shuffle(monster_list)
monster_image = monster_list[0]
monster_name = ""
if monster_list[0] == slyme_image:
    message = "スライムが あらわれた！"
    monster_name = "スライム"
    monster_HP = 4
    monster_power = 6
    monster_deffence = 4
elif monster_list[0] == wolf_image:
    message = "ウルフがあらわれた！"
    monster_name = "ウルフ"
    monster_HP = 6
    monster_power = 10
    monster_deffence = 4
elif monster_list[0] == chikin_image:
    message = "バードがあらわれた！"
    monster_name = "バード"
    monster_HP = 8
    monster_power = 6
    monster_deffence = 8

#ここのpathはそのままにしておく(パスを貼り付けるところではない)
def bgm(path):
    pygame.mixer.music.load(path)
    pygame.mixer.music.play(1)
bgm(battle_bgm)    


# 画像を読み込む
if monster_list[0] == slyme_image:
    image = slyme_image
elif monster_list[0] == wolf_image:
    image = wolf_image
elif monster_list[0] == chikin_image:
    image = chikin_image

# 画像をnumpy配列に変換
image_array = pygame.surfarray.array3d(image)

# 明るさを調整する関数
def adjust_brightness(img_array, brightness_factor):
    img_array = img_array * brightness_factor
    img_array = np.clip(img_array, 0, 255)  # 値を0-255に制限
    return img_array

# 明るさを上げる（例：1.2倍にする）
brightness_factor = 1.6
bright_image_array = adjust_brightness(image_array, brightness_factor)

# 調整後の画像をサーフェスに戻す
bright_image_surface = pygame.surfarray.make_surface(bright_image_array)

m_width, m_height = monster_image.get_size()
black_image = pygame.Surface((m_width, m_height))
    
#ダメージエフェクト
def damage_effect():
    screen.blit(bright_image_surface, (220, 174))
    pygame.display.update()
    time.sleep(0.1)
    screen.blit(monster_image, (220, 174))
    pygame.display.update()
    time.sleep(0.1)
    screen.blit(black_image, (220, 174))
    pygame.display.update()
    time.sleep(0.1)
    screen.blit(monster_image, (220, 174))
    pygame.display.update()
    sound2.play()
         
#枠点滅
damage_flash = True
flash = 0

# 色
white = (255, 255, 255)

action_number = 0 
player_damage = 0

damage = 0

running = True

while running:
    clock.tick(60)
    # 画面を黒色に塗りつぶし
    screen.fill((0, 0, 0))
    #モンスターの画像表示
    if monster_HP > 0: 
        screen.blit(monster_image, (220, 174))
    draw_text(screen,message,(40,350),font)
    #メッセージウィンドゥ
    if battle_message:
        pygame.draw.rect(screen, white, Rect(20, 320, 600, 140), 3)
    #ステータスウィンドゥ
    if damage_flash == True:
        pygame.draw.line(screen, white, (20, 58),(118, 58))
        pygame.draw.rect(screen, white, (20, 20, 102, 134), 3)
        text = font.render("ゆうしゃ", True, white)
        screen.blit(text,(35, 35))
        text = font.render("H", True, white)
        screen.blit(text,(35, 65))
        text = font.render(str(player_HP), True, white)
        screen.blit(text,(85, 65))
        text = font.render("M", True, white)
        screen.blit(text,(35, 95))
        text = font.render(str(player_MP), True, white)
        screen.blit(text,(85, 95))
        text = font.render("ゆ：　", True, white)
        screen.blit(text,(35, 125))
        text = font.render(str(Level), True, white)
        screen.blit(text,(85, 125))
    #コマンドウィンドゥ
    if command:
        pygame.draw.line(screen, white, (20, 358),(236, 358))
        pygame.draw.rect(screen, white, (20, 320, 220, 140), 3)
        text = font.render("ゆうしゃ", True, white)
        screen.blit(text,(80, 335))
        text = font.render("こうげき", True, white)
        screen.blit(text,(50, 370))
        text = font.render("まほう", True, white)
        screen.blit(text,(50, 400))
        text = font.render("ふせぐ", True, white)
        screen.blit(text,(50, 430))
        text = font.render("アイテム", True, white)
        screen.blit(text,(160, 370))
        text = font.render("そうび", True, white)
        screen.blit(text,(160, 400))
        text = font.render("にげる", True, white)
        screen.blit(text,(160, 430))
        #カーソル
        screen.blit(cursor, (cursor_x, cursor_y))
        cursor.set_alpha(alpha)
        alpha += delta
        if alpha <= 120 or alpha >= 255:
            delta = -delta

    if motion == 12:
        message = ""
        battle_message = False
        command = True
        motion = 1
    if player_HP == 0 and motion == 14:
        #pygame.display.update()
        time.sleep(2)
        pygame.quit()
        sys.exit()
    #HPゼロになったら閉じる
    if motion == 13:
        message = "そのあと\nゆうしゃのすがたをみたものはいない"
        motion = 14

    pygame.display.update()
    if flash > 0:
        damage_flash = not damage_flash
        flash -= 1
        time.sleep(0.15)
        if flash == 1:
            sound2.play()
    elif action_number == 0 and motion == 2 and attack == 1 and effect == 1:
        damage_effect()
        effect = 0
    elif motion == 11:
        damage_effect()
        monster_HP = 0
        sound2.play()
        message = monster_name + "をたおした！"
        bgm(win_bgm)
        motion = 5

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_z:
                # 「にげる」
                if action_number == 5:
                    sound.play()
                    pygame.quit()
                    sys.exit()

                
                elif motion == 2 and attack != 1:
                    sound.play()
                    damage = attack_power // 2 - monster_deffence // 4
                    if damage <= 0:
                        damage = 1
                    
                    monster_HP -= damage
                    damageY = 200
                    if monster_HP <= 0:
                        motion = 11
                        
                    else:
                        message = monster_name + "に　" + str(damage) + "の ダメージ"
                        time.sleep(0.5)
                        attack = 1
                        effect = 1
                # 「たたかう」
                elif motion == 1 and action_number == 0:
                    sound.play()
                    command = False
                    battle_message = True
                    message = "プレイヤーのこうげき"
                    motion = 2
                elif motion == 0:
                    sound.play()
                    motion = 1
                    message = ""
                    battle_message = False
                    command = True

                elif attack == 1 and motion == 2:
                    sound.play()                        
                    message = monster_name + "のこうげき"
                    motion = 3

                elif attack == 1 and motion == 3:
                    if monster_HP > 0:                            
                     player_damage = monster_power // 2 - deffence // 4
                     if player_damage <= 0:
                         player_damage = 1
                     player_HP -= player_damage
                                                  
                    message = "プレイヤーに　" +str(player_damage) + "のダメージ"
                    motion = 4
                    monster_attack = 1
                    damage_flash = False
                    flash = 3
                    time.sleep(0.5)
                    if player_HP <= 0:
                     player_HP = 0
                
                elif attack == 1 and motion == 4:
                    sound.play()
                    if player_HP <= 0:
                        bgm(lose_bgm)
                        motion = 13
                    else:
                        attack = 0
                        motion = 12
                elif motion == 5:
                    sound.play()
                    if monster_image == slyme_image:
                        message = "けいけんち　１かくとく\n4ゴールドを　てにいれた"
                        Exp += 1
                        Gold += 4
                    elif monster_image == wolf_image:
                        message = "けいけんち　2かくとく\n５ゴールドを　てにいれた"
                        Exp += 2
                        Gold += 5
                    elif monster_image == chikin_image:
                        message = "けいけんち　４かくとく\n10ゴールドを　てにいれた"
                        Exp += 4
                        Gold += 10
                    if Level == 1 and Exp >= 4 or Level == 2 and Exp >= 8:
                        motion = 8
                    else:
                        motion = 6
                elif motion == 6:
                    sound.play()
                    motion = 7
                    pygame.quit()
                    sys.exit()
                    
                elif motion == 8:
                    pygame.mixer.music.pause()
                    sound3.play()
                    message = "レベルが上がった"
                    if Level == 1:
                        motion = 9
                    elif Level == 2:
                        motion = 10
                elif motion == 9:
                    time.sleep(1)
                    pygame.mixer.music.unpause()
                    sound.play()
                    message = "さいだいHPが　４ポイント上がった！\nちからが　3ポイント　上がった！\nすばやさが　2ポイント　上がった！"
                    Max_HP += 4
                    power += 3
                    quick += 2
                    Level += 1
                    motion = 6
                    attack_power = power + arms
                elif motion == 10:
                    time.sleep(1)
                    pygame.mixer.music.unpause()
                    sound.play()
                    message = "さいだいHPが　６ポイント上がった！\nさいだいMPが　５ポイント上がった！\nちからが　１ポイント上がった！\nすばやさが　１ポイント上がった！\nホイムンをおぼえた"
                    Max_HP += 4
                    power += 3
                    quick += 2
                    Level += 1
                    motion = 6
                    attack_power = power + arms
                    
                      

            
            if event.key == K_DOWN:
                if cursor_y != 428:
                    cursor_y += 30
                    action_number += 1
                    sound.play()
            elif event.key == K_UP:
                if cursor_y != 368:
                    cursor_y -= 30
                    action_number -= 1
                    sound.play()
            elif event.key == K_LEFT:
                if cursor_x != 30:
                    cursor_x -= 110
                    action_number -= 3
                    sound.play()
            elif event.key == K_RIGHT:
                if cursor_x != 140:
                    cursor_x += 110
                    action_number += 3
                    sound.play()


```
</details> 
#

<details><summary>ここをクリックしてください</summary>

```python:


```
</details> 
#

<details><summary>ここをクリックしてください</summary>

```python:


```
</details>