캐릭터와 몬스터를 생성해서 1VS1 싸우는 상황 구현하기.
우선 과제를 듣고 어디서 어떻게 해야할지 막막했다. 그래서 천천히 요구사항, 가이드, 힌트를 천천히 읽으면서 분석을 시작했다.
- 요구사항
- 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
- → 클래스에서 init 함수를 쓰면 되겠다!
- 몬스터는 임의 생성할 수 있어야 합니다.
- → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
- while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
- → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
- 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
- → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
- 몬스터는 일반 공격을 할 수 있어야 합니다.
- → 함수를 이용해서 hp에서 감소시키면 되겠다!
- 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
- → 일단 옼케!
- 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
- → 일단 옼케!
- 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
- → 일단 옼케!
가능한 기본 가이드를 지켜 과제를 진행해주세요
- 시작
- 플레이어 생성 (Player)
- 이름
- HP
- MP
- 파워
- 일반공격
- 마법파워
- 마법공격
- 몬스터 생성 (Monster)
- 이름
- HP
- 일반공격
- 플레이어 생성 (Player)
- 전투
- 몬스터와 턴제 전투 (While 반복문 사용)
- 플레이어, 몬스터 상태 출력
- 플레이어의 공격 방법 선택 (일반, 마법)
- 플레이어 공격
- 몬스터 공격
- 몬스터와 턴제 전투 (While 반복문 사용)
- 종료
- 승리 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이 해결 방법이었어!
고맙습니다! 점프 투 파이썬! 쵝오!!
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