개인프로젝트/몬스터 턴제게임

몬스터 턴제게임 만들기 끝

끈끈 2023. 3. 28. 21:35

 

스탯 나누기가 제일 힘들었다ㅎㅎㅎㅎㅎㅎㅎ

 

기본 hp, power를 100, 20 정도로 생각했었는데 세분화해보았음

 

[양손검, 방패] [총, 총알] [지팡이, 올빼미]가 가장 좋은 조합이라는거즤~!

 

Player 정보:

무기 종류 보조 무기 hp power mp magic_power
1. 양손검 1. 방패 200 30 30 15
2. 총알 180 20 30 15
3. 올빼미 180 20 50 30
2. 총 1. 방패 150 20 30 15
2. 총알 130 30 30 15
3. 올빼미 130 20 50 30
3. 지팡이 1. 방패 130 10 100 30
2. 총알 100 10 100 30
3. 올빼미 100 20 120 50

 

Monster 정보:

  hp power
해파리 100 10
좀비 150 15
베어 200 20

 


 

print(f"{self.name})

 

print(f"{other.name}이(가) 쓰러졌습니다. "+str(count) 
	+"번의 치열한 전투 끝에 {self.name}의 승리! 수고하셨습니다🤍")

 

{self.name}이 안 먹혀서 뭔가 했더니

 

print(f"{other.name}이(가) 쓰러졌습니다. "+str(count) 
	+f"번의 치열한 전투 끝에 {self.name}의 승리! 수고하셨습니다🤍")

 

"" 앞에 f를 또 넣어줘야 했다! 멍충

 


 

파이썬에서 이미지 띄우기

 

Pillow

 

Python Imaging Library(PIL)은 파이썬의 이미지 분석 Library이다

이미지 조정(resize, scale 등), 필터, 보정 등 다양한 이미지 처리를 해준다

Jupyter Notebook에서는 바로바로 이미지 확인이 가능해 변경된 이미지 확인이 용이하다고 한다

2011년에 PIL 개발은 중단되었지만 후속으로 Pillow라는 프로젝트가 진행되어 파이썬 3.x 버전을 지원하고 있다고 한다.

 

설치:

pip install Pillow

 

from PIL import Image

image = Image.open('test.jpg')
image.show()

 

show() 함수를 사용하면 기본 이미지 프로그램으로 열리게 된다

 

 

게임을 시작하지 짤을 넣고 싶어서 시도했던 것인데

귀여운 친구들을 몬스터별로 넣어두었다😉

 

이미지 url로 내 PC에 저장 후 열리기

 

urllib 패키지request 모듈이다

url 처리에 관련된 모듈을 모아 놓은 패키지이다

 

import urllib.request

 

https://docs.python.org/3.0/library/urllib.request.html

 

urllib.request — extensible library for opening URLs — Python v3.0.1 documentation

urllib.request — extensible library for opening URLs The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more. The urllib.reque

docs.python.org

 

url = 'https://mblogthumb-phinf.pstatic.net/MjAyMTA5MzBfMjEg/MDAxNjMyOTgwMTY0NTc0.ivC-fbO8uQj0VUNP9Iij-pptOdWMIA9oPeXVFiEoXqAg.BKZn6BcweHNJpwn5HT0AyJLlfJpy7b0_arKcE6cIPe4g.PNG.daehan4work/1.png?type=w800'
image_name = 'test.jpg'
urllib.request.urlretrieve(url, 'test.jpg')
image = Image.open('test.jpg')
image.show()
print("\n게임을 시작하지.")

👇

urllib.request.urlretrieve(
    'https://mblogthumb-phinf.pstatic.net/MjAyMTA5MzBfMjEg/MDAxNjMyOTgwMTY0NTc0.ivC-fbO8uQj0VUNP9Iij-pptOdWMIA9oPeXVFiEoXqAg.BKZn6BcweHNJpwn5HT0AyJLlfJpy7b0_arKcE6cIPe4g.PNG.daehan4work/1.png?type=w800', 'test.jpg')
image = Image.open('test.jpg')
image.show()
print("\n게임을 시작하지.")

 

url = ' '

image_name = 'test.jpg'

이 두 줄을 날리고 urllib.request.urlretrieve(url, path) 로 작성해 줘도 된다

path에는 이미지를 내려받길 원하는 경로를 입력해 줄 수도 있다

 


 

n번의 전투

 

elif player_attack == "3":  # 힐링
    count += 1
    heal_count += 1
    player.heal()
    print("HP가 충전되었습니다. 중꺽마!")
    player.player_show_status()
    monster.monster_show_status()        
    print("")

 

 

n번째 전투 끝에 n+1번으로 뜬다는 팀원분의 조언 덕에

(count-1) 하려다가 count += 1을 밑으로 내려주는 선택을 했다

 

elif player_attack == "3":  # 힐링
    player.heal()
    print("HP가 충전되었습니다. 중꺽마!")
    player.player_show_status()
    monster.monster_show_status()
    count += 1
    heal_count += 1
    print("")

 


 

 

+

input 값을 숫자 [1, 2, 3]만 받도록 isalpha() 함수를 사용!

isalpha() :

문자열의 구성이 알파벳 혹은 한글(파이썬3만 가능)로만 되어 있을 경우 True.

공백, 기호, 숫자가 있으면 False.

while player_attack == "" or player_attack.isalpha() or int(player_attack) > 3:
    print("\n공격을 선택하세요!!")
    player_attack = input("1.일반공격 2.마법공격 3.힐: ")

 


 

과제 제출본 : 

더보기
from PIL import Image
import urllib.request
import random
import time


class Character():
    def __init__(self, name, hp, power, mp=0, magic_power=0):  # 기본값이 적힌 인자는 맨 뒤에
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power
        self.max_mp = mp
        self.mp = mp
        self.magic_power = magic_power

    def attack(self, other):  # player가 (1.일반공격) 선택시
        damage = random.randint(self.power - 10, self.power + 10)
        if damage == 0:
            print(f"{self.name}의 💫일반공격이 실패했습니다!")
        elif damage < 0:
            other.hp = max(other.hp - damage, 0)
            print(f"{self.name}의 💫일반공격 실패! 🚨{other.name}의 HP가 충전되었습니다🚨")
        else:
            if other.hp > damage:
                other.hp = max(other.hp - damage, 0)
                print(f"{self.name}의 공격! {other.name}에게 {str(damage)}의 데미지🩸를 입혔습니다.")
            elif other.hp < damage:
                print(
                    f"{self.name}의 공격! {other.name}에게 {str(other.hp)}의 데미지🩸를 입혔습니다.")
                other.hp = 0
                print(f"{other.name}이(가) 쓰러졌습니다. "+str(count) +
                      f"번의 치열한 전투 끝에 {self.name}의 승리!\n\n🔺🔺🔺🔺🔺\n\n수고하셨습니다🤍")

    def magic_attack(self, other):  # player가 (2.마법공격) 선택시
        damage = random.randint(self.magic_power - 20, self.magic_power + 20)
        if self.mp == 0:
            print(f"💫mp가 부족해 {self.name}의 💫마법공격이 실패했습니다!")
        else:
            if damage == 0:
                print(f"{self.name}의 💫마법공격이 실패했습니다!")
            elif damage < 0:
                other.hp = max(other.hp - damage, 0)
                print(
                    f"{self.name}의 💫마법공격 실패! 🚨{other.name}의 HP가 {str(-damage)}만큼 충전되었습니다🚨")
            else:
                self.mp = max(self.mp - damage, 0)
                if other.hp > damage:
                    other.hp = max(other.hp - damage, 0)
                    print(
                        f"{self.name}의 공격! {other.name}에게 {str(damage)}의 데미지🩸를 입혔습니다.")
                elif other.hp < damage:
                    print(
                        f"{self.name}의 공격! {other.name}에게 {str(other.hp)}의 데미지🩸를 입혔습니다.")
                    other.hp = 0
                    print(f"{other.name}이(가) 쓰러졌습니다. "+str(count) +
                          f"번의 치열한 전투 끝에 {self.name}의 승리!\n\n🔺🔺🔺🔺🔺\n\n수고하셨습니다🤍")

    def heal(self):  # player가 (4.힐) 선택시
        self.hp += (self.max_hp)*0.5

    def show_status(self):  # player 상태보기 (HP, MP)
        print(
            f"🔋{self.name}의 상태: (HP) {int(self.hp)}/{self.max_hp} (MP) {self.mp}/{self.max_mp}")


class Monster(Character):
    def miss(self, other):  # player가 (3.회피하기) 선택시
        damage = random.randint(self.power - 20, self.power - 10)
        if damage == 0:
            print(f"회피 성공! {self.name}의 💫공격이 빗나갔습니다!")
        elif damage < 0:
            other.hp = max(other.hp - damage, 0)
            print(
                f"회피 성공! 🚑{other.name}의 HP가 {str(-damage)}만큼 충전되었습니다🚑")
        else:
            if other.hp > damage:
                other.hp = max(other.hp - damage, 0)
                print(
                    f"{self.name}의 틈새공격! {other.name}에게 {str(damage)}의 데미지🩸를 입혔습니다.")
            elif other.hp < damage:
                print(
                    f"{self.name}의 틈새공격! {other.name}에게 {str(other.hp)}의 데미지🩸를 입혔습니다.")
                other.hp = 0
                print(f"{other.name}이(가) 쓰러졌습니다. "+str(count) +
                      f"번의 치열한 전투 끝에 {self.name}의 승리!\n\n🔺🔺🔺🔺🔺\n\n수고하셨습니다🤍")

    def show_status(self):  # monster 상태보기 (HP)
        print(f"🔋{self.name}의 상태: (HP) {self.hp}/{self.max_hp}")


# 플레이어 정보
print("\n가보자고!")
time.sleep(0.5)
player_name = input("\n이름을 입력하세요: ")
while player_name == "":
    print("플레이어의 이름을 입력하세요!!")
    player_name = input("Player name: ")
print("\n어떤 무기를 사용하시겠습니까?")
player_weapon = input("1.양손검 2.총 3.지팡이: ")
while player_weapon == "" or player_weapon.isalpha() or int(player_weapon) > 3:
    print("\n무기를 선택하세요!!")
    player_weapon = input("1.양손검 2.총 3.지팡이: ")
# 주무기_양손검
if player_weapon == "1":
    print("\n보조 무기를 선택하세요. 능력치가 달라집니다.")
    player_assist_weapon = input("1.방패 2.총알 3.올빼미: ")
    while player_assist_weapon == "" or player_assist_weapon.isalpha() or int(player_assist_weapon) > 3:
        print("\n보조 무기를 선택하세요!!")
        player_assist_weapon = input("1.방패 2.총알 3.올빼미: ")
    if player_assist_weapon == "1":  # 양손검_방패
        player = Character(player_name, 200, 30, 30, 15)
    elif player_assist_weapon == "2":  # 양손검_총알
        player = Character(player_name, 180, 20, 30, 15)
    elif player_assist_weapon == "3":  # 양손검_올빼미
        player = Character(player_name, 180, 20, 50, 30)
# 주무기_총
elif player_weapon == "2":
    print("\n보조 무기를 선택하세요. 능력치가 달라집니다.")
    player_assist_weapon = input("1.방패 2.총알 3.올빼미: ")
    while player_assist_weapon == "" or player_assist_weapon.isalpha() or int(player_assist_weapon) > 3:
        print("\n보조 무기를 선택하세요!!")
        player_assist_weapon = input("1.방패 2.총알 3.올빼미: ")
    if player_assist_weapon == "1":  # 총_방패
        player = Character(player_name, 150, 20, 30, 15)
    elif player_assist_weapon == "2":  # 총_총알
        player = Character(player_name, 130, 30, 30, 15)
    elif player_assist_weapon == "3":  # 총_올빼미
        player = Character(player_name, 130, 20, 50, 30)
# 주무기_지팡이
elif player_weapon == "3":
    print("\n보조 무기를 선택하세요. 능력치가 달라집니다.")
    player_assist_weapon = input("1.방패 2.총알 3.올빼미: ")
    while player_assist_weapon == "" or player_assist_weapon.isalpha() or int(player_assist_weapon) > 3:
        print("\n보조 무기를 선택하세요!!")
        player_assist_weapon = input("1.방패 2.총알 3.올빼미: ")
    if player_assist_weapon == "1":  # 지팡이_방패
        player = Character(player_name, 130, 10, 100, 30)
    elif player_assist_weapon == "2":  # 지팡이_총알
        player = Character(player_name, 100, 10, 100, 30)
    elif player_assist_weapon == "3":  # 지팡이_올빼미
        player = Character(player_name, 100, 20, 120, 50)

# 몬스터 정보
monster_check = "2"
while monster_check == "2":
    print("\n어떤 몬스터를 처리하시겠습니까?")
    monster_name = input("1.해파리 2.좀비 3.베어: ")
    while monster_name == "" or monster_name.isalpha() or int(monster_name) > 3:
        print("\n몬스터를 선택하세요!!")
        monster_name = input("1.해파리 2.좀비 3.베어: ")
    if monster_name == "1":  # 해파리
        monster = Monster("해파리", 100, 10)
    elif monster_name == "2":  # 좀비
        monster = Monster("좀비", 150, 15)
    elif monster_name == "3":  # 베어
        monster = Monster("베어", 200, 20)

    # 몬스터 귀여운 이미지 띄우기
    if monster_name == "1":  # 해파리
        urllib.request.urlretrieve(
            'https://img.freepik.com/premium-vector/cute-jellyfish_795963-13.jpg', 'jellyfish.jpg')
        image = Image.open('jellyfish.jpg')
    elif monster_name == "2":  # 좀비
        urllib.request.urlretrieve(
            'https://img.freepik.com/free-vector/cute-zombie-frankenstein-from-the-grave-cartoon-illustration-people-halloween-concept-isolated-flat-cartoon-style_138676-2720.jpg', 'zombie.jpg')
        image = Image.open('zombie.jpg')
    elif monster_name == "3":  # 베어
        urllib.request.urlretrieve(
            'https://mblogthumb-phinf.pstatic.net/MjAyMTA5MzBfMjEg/MDAxNjMyOTgwMTY0NTc0.ivC-fbO8uQj0VUNP9Iij-pptOdWMIA9oPeXVFiEoXqAg.BKZn6BcweHNJpwn5HT0AyJLlfJpy7b0_arKcE6cIPe4g.PNG.daehan4work/1.png?type=w800', 'bear.jpg')
        image = Image.open('bear.jpg')
    image.show()

    # 몬스터 재확인
    print("\n"+monster.name+"와 싸우실 수 있겠어요~???~?")
    monster_check = input("1.당연!💪 2.다시 고를까..🤔 3.도..도망..run🏃‍♂️: ")

if monster_check == "3":
    print("\n쫄보시군요! 다음에 다시 만나요🖐")
    raise SystemExit

# 게임 시작
print("\n🔻🔻🔻🔻🔻\n\n지금부터 게임을 시작하지.")
player.show_status()
monster.show_status()
count = 1
heal_count = 0

while player.hp > 0 and monster.hp > 0:
    time.sleep(1)
    print("\n"+str(count)+"번째 전투를 시작합니다👊\n어떤 공격을 하시겠습니까?")
    if player.hp > (player.max_hp)*0.5:
        player_attack = input("1.일반공격 2.마법공격 3.회피하기: ")
        while player_attack == "" or player_attack.isalpha() or int(player_attack) > 3:
            print("\n공격을 선택하세요!!")
            player_attack = input("1.일반공격 2.마법공격 3.회피하기: ")
    elif player.hp <= (player.max_hp)*0.5 and heal_count == 0:
        player_attack = input("1.일반공격 2.마법공격 3.회피하기 4.힐: ")
        while player_attack == "" or player_attack.isalpha() or int(player_attack) > 4:
            print("\n공격을 선택하세요!!")
            player_attack = input("1.일반공격 2.마법공격 3.회피하기 4.힐: ")
    time.sleep(0.5)
    if player_attack == "1":  # 일반공격
        player.attack(monster)
        if monster.hp > 0:
            monster.attack(player)
            if player.hp > 0 and monster.hp > 0:
                player.show_status()
                monster.show_status()
                count += 1
    elif player_attack == "2":  # 마법공격
        player.magic_attack(monster)
        if monster.hp > 0:
            monster.attack(player)
            if player.hp > 0 and monster.hp > 0:
                player.show_status()
                monster.show_status()
                count += 1
    elif player_attack == "3":  # 회피하기
        monster.miss(player)
        if player.hp > 0 and monster.hp > 0:
            player.show_status()
            monster.show_status()
            count += 1
    elif player_attack == "4":  # 힐
        player.heal()
        print("🚑HP가 충전되었습니다🚑 중꺽마!")
        player.show_status()
        monster.show_status()
        count += 1
        heal_count += 1

 

막판에 게임관두기, 회피, 회복도 넣어주고, 허전해보여서 이모티콘 잔뜩..

 

중복으로 사용되는 코드들을 더 줄일 필요가 있겠다

 

클래스딕셔너리를 잘 활용해야 한다는 것!