캐릭터와 몬스터를 생성해서 1VS1 싸우는 상황 구현하기.

우선 과제를 듣고 어디서 어떻게 해야할지 막막했다. 그래서 천천히 요구사항, 가이드, 힌트를 천천히 읽으면서 분석을 시작했다.

  • 요구사항
    • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
    • → 클래스에서 init 함수를 쓰면 되겠다!
    • 몬스터는 임의 생성할 수 있어야 합니다.
    • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
    • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
    • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
    • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
    • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
    • 몬스터는 일반 공격을 할 수 있어야 합니다.
    • → 함수를 이용해서 hp에서 감소시키면 되겠다!
    • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
    • → 일단 옼케!
    • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
    • 일단 옼케!
    • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
    • → 일단 옼케!

가능한 기본 가이드를 지켜 과제를 진행해주세요

  1. 시작
    • 플레이어 생성 (Player)
      • 이름
      • HP
      • MP
      • 파워
      • 일반공격
      • 마법파워
      • 마법공격
    • 몬스터 생성 (Monster)
      • 이름
      • HP
      • 일반공격
  2. 전투
    • 몬스터와 턴제 전투 (While 반복문 사용)
      • 플레이어, 몬스터 상태 출력
      • 플레이어의 공격 방법 선택 (일반, 마법)
      • 플레이어 공격
      • 몬스터 공격
  3. 종료
    • 승리 or 패배

→ 가이드 순서를 따라서 코드를 작성해야겠다고 생각을 했다.

 

힌트

힌트의 코드가 각각 무엇을 의미하는지 공부를 하기 시작.

class Character:
    """
    모든 캐릭터의 모체가 되는 클래스
    """
    #인스턴스를 만드는 함수.각각의 변수에 인자를 저장한다.
    def __init__(self, name, hp, power): 
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power

	#공격 함수
    def attack(self, other):
    #데미지가 공격력의 ± 2 사이 랜덤하게 선택.
        damage = random.randint(self.power - 2, self.power + 2)
    #1인자의 체력은 인자의 (hp - 데미지,0) 중 높은 수를 선택하게 되어있네.
    #이게 왜 필요하지?
        other.hp = max(other.hp - damage, 0)
    #어택 함수의 출력 문장.
        print(f"{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
    #2아~ 인자의 hp가 0이면 출력문이 나오는거네..
        if other.hp == 0:
            print(f"{other.name}이(가) 쓰러졌습니다.")
    #수정할 것 :#1과 2. 인자의 체력이 0보다 작으면 출력이 나오도록 하고 max도 빼버린다.

	#상태를 확인하는 함수.
    def show_status(self):
    #현재hp / max hp가 출력 되네.
        print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp}")

그리고 가이드를 보면서 코드를 작성하기 시작했다.

플레이어 생성 부분부터!

  • 플레이어 생성 (Player)
    • 이름
    • HP
    • MP
    • 파워
    • 일반공격
    • 마법파워
    • 마법공격
class Character:
    """
    모든 캐릭터의 모체가 되는 클래스
    """

    def __init__(self, name, hp, mp, power, magic_power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.max_mp = mp
        self.mp = mp
        self.power = power
        self.magic_power = magic_power
        print(f'{name}이(가) 생성되었다.')
        print(f'체력{hp}, 마나{mp}, 일반공격력{power} ±2, 마법공격력{magic_power} ±20')

일반공격과 마법공격 함수.

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

"""
마법공격 함수
"""
def magic_attack(self, other):
    damage = random.randint(self.magic_power - 20, self.magic_power + 20)
    self.mp = self.mp - 30
    print('마나 30 소비')
    other.hp = other.hp - damage
    print(f"{self.name}의 마법공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
    if other.hp < 0:
        print(f"{other.name}이(가) 쓰러졌습니다.")

 

이제 몬스터 차례!

  • 몬스터 생성 (Monster)
    • 이름
    • HP
    • 일반공격
class Monster():
    """
    모든 몬스터의 모체가 되는 클래스
    """
    def __init__(self, name, hp, power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power
        print(f'{name}이(가) 생성되었다.')
        print(f'체력{hp},공격력{power} ±2')
        print(f'{name}이(가)와 조우했다.')

일반공격 함수

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

 

  • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
  • → 클래스에서 init 함수를 쓰면 되겠다!
  • 몬스터는 임의 생성할 수 있어야 합니다.
  • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
  • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
  • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
  • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
  • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
  • 몬스터는 일반 공격을 할 수 있어야 합니다.
  • → 함수를 만들고 이용해서 hp에서 감소시키면 되겠다!
  • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
  • → 일단 옼케!
  • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
  •  일단 옼케!
  • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
  • → 일단 옼케!

요구사항 체크를 하고 뭘 할지 생각을 해봄.

while문을 이용해서 전투를 구현해보자 생각을 함.

일단 인스턴스를 만든다.

C1 = Character('용사', 100, 80, 20, 20)
M1 = Monster('발록',100,20)

그 밑에 while을 이용해서 둘 중 하나의 체력이 0보다 크면 서로 공격하게 만듦.

그리고 hp <=0 이면 끝내도록 함.

while C1.hp > 0 or M1.hp > 0:
    C1.attack(M1)
    M1.attack(C1)
    if C1.hp <= 0 or M1.hp <= 0:
        exit()

공격함수에 0 < 이면 쓰러졌다고 출력하게 되어 있어서 <=으로 수정함.

그리고 M1이 죽었는데도 발악하면서 또 공격을 하는 모습을 보여줌; 문제점 발견!!

용사의 일반공격! 발록에게 22의 데미지를 입혔습니다.
발록이(가) 쓰러졌습니다.
발록의 일반공격! 용사에게 22의 데미지를 입혔습니다.

체력이 0 이하가 되면 아무 행동도 못하도록 수정함.

그리고 C1이 죽으면 패배. M1이 죽으면 승리. 출력을 하도록 함.

while C1.hp > 0 or M1.hp > 0:
    if C1.hp <= 0:
    	print('패배..')
        exit()
    C1.attack(M1)
    if M1.hp <= 0:
    	print('승리!')
        exit()
    M1.attack(C1)

각각 행동 전에 체력을 확인하도록 함.

발록이 죽고 발악하지 않음. 오오~ 해결했어~~

결과 승리랑 패배까지 출력이 잘 되네!

발록의 일반공격! 용사에게 19의 데미지를 입혔습니다.
용사의 일반공격! 발록에게 20의 데미지를 입혔습니다.
발록이(가) 쓰러졌습니다.
승리!
  • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
  • → 클래스에서 init 함수를 쓰면 되겠다!
  • 몬스터는 임의 생성할 수 있어야 합니다.
  • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
  • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
  • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
  • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
  • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
  • 몬스터는 일반 공격을 할 수 있어야 합니다.
  • → 함수를 만들고 이용해서 hp에서 감소시키면 되겠다!
  • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
  • → 일단 옼케!
  • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
  •  일단 옼케!
  • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
  • → 일단 옼케!

이제 공격을 선택 할 수 있도록 구현을 해보도록 했다. 해결이 하나씩 되면서 재미있어졌다.

참 웃기게도 과제를 받은 날 잠을 자는데 꿈에서도 코딩을 하기 시작했다. 공격 선택하는 부분은 input으로 하면 되겠다 생각을 하면서 잠이 깼다. 꿈인지 선잠 중 생각인지 정확히 모르겠다... 여튼!

while문을 공부를 하면서 선택지 중 input값으로 선택하는 예제가 있어서 바로 공부를 시작! 역시 input이 해결 방법이었어!

고맙습니다! 점프 투 파이썬! 쵝오!!

https://wikidocs.net/21

 

03-2 while문

[TOC] ## while문의 기본 구조 반복해서 문장을 수행해야 할 경우 while문을 사용한다. 그래서 while문을 반복문이라고도 부른다. 다음은 while문의 기본 …

wikidocs.net

프롬프트를 만들고 변수 = 0을 만들어 줬다. 변수를 안주며 에러가 난다!

prompt = """
... 1. 일반공격 : 데미지 20 ± 2
... 2. 마법공격 : 데미지 20 ±20 MP -30
... 3. 스테이터스 확인
... 4. 도망치기(게임종료)
... 행동선택: """
number = 0

그리고 C1의 공격일 때 행동을 선택해야해서 용사의 체력이 0 이하가 아닐 때 행동선택을 프린트하고 각 선택에 어떤 함수를 불러오고 출력할지 적어줌.

while C1.hp >= 0 or M1.hp >= 0:
    if C1.hp <= 0:
        print('패배..')
        exit()
    print(prompt)
    number = int(input())
    if number ==1:
        C1.attack(M1)
    if number ==2:
        if C1.mp < 30:
            print('마나가 부족합니다!')
            continue
        else:
            C1.magic_attack(M1)
    if number ==3:
        print('스테이터스를 확인합니다.')
        C1.show_status()
        M1.show_status()
        continue
    if number ==4:
        print('도망쳤다.')
        print('용기를 가져라!')
        exit()
    if M1.hp <= 0:
        print('승리!')
        exit()
    else:
        M1.attack(C1)
  • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
  • → 클래스에서 init 함수를 쓰면 되겠다!
  • 몬스터는 임의 생성할 수 있어야 합니다.
  • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
  • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
  • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
  • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
  • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
  • 몬스터는 일반 공격을 할 수 있어야 합니다.
  • → 함수를 만들고 이용해서 hp에서 감소시키면 되겠다!
  • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
  • → 일단 옼케!
  • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
  •  일단 옼케!
  • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
  • → 일단 옼케!

이번주는 운빨이 끝내줬는지 막막하던 과제를 잘 해결하게 되었다. 재미있는 경험이었고 자신감 소폭 상승! 오옷!

아 그리고 오늘 아침도 상속을 사용하면 더 코드가 깔끔해지지 않을까 했는데 상속받는 Monster 클래스를 전부다 수정해서 사용했기 때문에 상속이 의미가 없을 거라 판단하여 작업을 중지했다.

이제 다른 공부하러 가보자~~ 이 글은 과제 마감기한 이후 공개로 돌릴 예정.

게임을 해보고 싶으시다면 깃을 방문해주세요~

https://github.com/JJJ-1443/python-battle01/commits/main

 

GitHub - JJJ-1443/python-battle01: Player vs Monster

Player vs Monster. Contribute to JJJ-1443/python-battle01 development by creating an account on GitHub.

github.com

 

+ Recent posts