코딩/til

3-27 TIL

김은수2 2023. 3. 27. 20:13

간단한 텍스트 게임 

 

 

이름을 생성한다. 

몬스터와 전투를 한다. 

플레이어는 HP, MP, POWER 을 가지고 있고 

 

power 수치에 따라서 공격이 랜덤 범위내에서 어느정도의 데미지를 입힐지 결정된다. 

플레이어는 일반공격과 마법공격을 할 수 있으며 마법공격은 강한대신 mp를 소모한다. 

몬스터는 일반공격만 할 수있다. 

몬스터는 3가지 종류가 있으며 누구와 싸울 것인지 선택하여 싸울 수 있다. 

플레이어나 몬스터의 hp가 0 이하가 되면 전투는 종료된다. 

 

플레이어 캐릭터의 class 를 일단 선언 

 

class Character:

    def__init__(self,name,hp,mp,power):
        self.name=name
        self.max_hp=hp
        self.hp=hp
        self.mp=mp
        self.power=power

플레이어의 이름, hp,mp,power 을 정의

 

def attack(self,other):
    damage=random.randint(self.power-2,self.power+2)
    other.hp=max(other.hp-damage,0)
    print(f"{self.name}의 공격!{other.name}에게{damage}의 데미지를 입혔습니다.")
    if other.hp==0:
    	print(f"{other.name}이(가) 쓰러졌습니다.")

플레이어가 공격을 할때 

 

def magic_attack(self,other):
    damage=random.randint(self.power*2-2,self.power*2+2)
    if self.mp<=0:
        print("mp가 없어서 가만히 있었다.")
        return True
    self.mp=max(self.mp-3,0)
    other.hp=max(other.hp-damage,0)
    print(f"{self.name}의 마법 공격!{other.name}에게{damage}의 데미지를 입혔습니다.")
    ifother.hp==0:
    print(f"{other.name}이(가) 쓰러졌습니다.")

플레이어가 마법 공격을 할 때 호출하는 함수

mp가 없을때는 행동을 하지 못한다. 

 

def show_status(self):
    print(f"{self.name}의 상태: HP{self.hp}/{self.max_hp}MP{self.mp}")

플레이어의 상태창을 보고싶을 때 호출

 

mon_select=input("누구와 싸우시겠습니까?\n 1. 언데드 아처, 2. 언데드 워리어, 3.언데드 나이트\n")
print(type(mon_select))

몬스터를 선택함 

print(f'{undead_acher.name}가 나타남')

while True:
    character.show_status()
    undead_acher.show_status()
    atk_type=input("무엇을 할 것인가?\n 1. 일반공격 2. 마법공격\n")

    ifatk_type=="1":
            character.attack(other=undead_acher)
            undead_acher.attack(other=character)
            character.show_status()
            undead_acher.show_status()

    elifatk_type=="2":
            character.magic_attack(other=undead_acher)
            undead_acher.attack(other=character)
            character.show_status()
            undead_acher.show_status()

	if character.hp<=0:
			print("당신은 죽었습니다.")
			break

	elif undead_acher.hp<=0:
			print("승리하셨습니다.")	
            break

 

전투의 진행 

if atk type = "1" 에서 if 문이 작동을 하지 않는 문제가 있었다. 

input으로 받은 변수는 문자열로 받아져서 if 조건문 뒤에 숫자를 나도 문자열로 바꾸어 주었다. 

 

 

 

 

전체코드

 

더보기
import random


class Character:

    def __init__(self, name, hp, mp, power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.mp = mp
        self.power = power

    def attack(self, other):
        damage = random.randint(self.power - 2, self.power + 2)
        other.hp = max(other.hp - damage, 0)
        print(f"{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
        if other.hp == 0:
            print(f"{other.name}이(가) 쓰러졌습니다.")

    def magic_attack(self, other):
        damage = random.randint(self.power*2 - 2, self.power*2 + 2)
        if self.mp <= 0:
            print("mp가 없어서 가만히 있었다.")
            return True
        self.mp = max(self.mp - 3, 0)
        other.hp = max(other.hp - damage, 0)
        print(f"{self.name}의 마법 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
        if other.hp == 0:
            print(f"{other.name}이(가) 쓰러졌습니다.")

    def show_status(self):
        print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp} MP {self.mp}")


class Monster:

    def __init__(self, name, hp, power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power

    def attack(self, other):
        damage = random.randint(self.power - 2, self.power + 2)
        other.hp = max(other.hp - damage, 0)
        print(f"{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
        if other.hp == 0:
            print(f"{other.name}이(가) 쓰러졌습니다.")

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


Character_name = input("플레이어의 이름을 입력하세요\n")
character = Character(Character_name, hp=100, mp=40, power=10)

monster = {
    Monster("언데드 아처", hp=50, power=7),
    Monster("언데드 워리어", hp=80, power=7),
    Monster("언데드 나이트", hp=100, power=7)
}


mon_select = input("누구와 싸우시겠습니까?\n 1. 언데드 아처, 2. 언데드 워리어, 3.언데드 나이트\n")
print(type(mon_select))
if mon_select == "1":
    undead_acher = Monster("언데드 아처", hp=50, power=7)
    print(f'{undead_acher.name}가 나타남')
    while True:
        character.show_status()
        undead_acher.show_status()
        atk_type = input("무엇을 할 것인가?\n 1. 일반공격 2. 마법공격\n")
        if atk_type == "1":
            character.attack(other=undead_acher)
            undead_acher.attack(other=character)
            character.show_status()
            undead_acher.show_status()
        elif atk_type == "2":
            character.magic_attack(other=undead_acher)
            undead_acher.attack(other=character)
            character.show_status()
            undead_acher.show_status()
        if character.hp <= 0:
            print("당신은 죽었습니다.")
            break
        elif undead_acher.hp <= 0:
            print("승리하셨습니다.")
            break

if mon_select == "2":
    undead_warrior = Monster("언데드 워리어", hp=80, power=7)
    print(f'{undead_warrior.name}가 나타남')
    while True:
        character.show_status()
        undead_warrior.show_status()
        atk_type = input("무엇을 할 것인가?\n 1. 일반공격 2. 마법공격\n")
        if atk_type == "1":
            character.attack(other=undead_warrior)
            undead_warrior.attack(other=character)
            character.show_status()
            undead_warrior.show_status()
        elif atk_type == "2":
            character.magic_attack(other=undead_warrior)
            undead_warrior.attack(other=character)
            character.show_status()
            undead_warrior.show_status()
        if character.hp <= 0:
            print("당신은 죽었습니다.")
            break
        elif undead_warrior.hp <= 0:
            print("승리하셨습니다.")
            break

if mon_select == "3":
    undead_knight = Monster("언데드 나이트", hp=100, power=7)
    print(f'{undead_knight.name}가 나타남')
    while True:
        character.show_status()
        undead_knight.show_status()
        atk_type = input("무엇을 할 것인가?\n 1. 일반공격 2. 마법공격\n")
        if atk_type == "1":
            character.attack(other=undead_knight)
            undead_knight.attack(other=character)
            character.show_status()
            undead_knight.show_status()
        elif atk_type == "2":
            character.magic_attack(other=undead_knight)
            undead_knight.attack(other=character)
            character.show_status()
            undead_knight.show_status()
        if character.hp <= 0:
            print("당신은 죽었습니다.")
            break
        elif undead_knight.hp <= 0:
            print("승리하셨습니다.")
            break

'코딩 > til' 카테고리의 다른 글

3.28 til  (0) 2023.03.28
3-17 TIL  (0) 2023.03.17
3-16 TIL  (0) 2023.03.16
3-15 TIL  (0) 2023.03.15
2023-03-13 TIL (Today I learned.)  (0) 2023.03.13