내일배움캠프

[TIL]rpg게임 만들기 개인과제

2023. 4. 3. 14:04

과제를 받았을 때 어떻게 시작해야하는지 감이 오지 않았고 강의에서 배운 내용을 어떤식으로 활용해야하는지 갈피를 잡기 어려웠다.

그래서 시작조차 하지 못하고 있었다.

 

나 같은 사람이 많았던 탓인지 과제에 대한 접근 방법을 알려주는 특강이 있었다. 

 

1. 과제의 요구사항을 vscode에 주석처리를 하여 쭉 적어본다. 

2. 그 주석을 따라 class들을 먼저 생성해준다. 

3. 세부사항을 채워나간다.

 

이를 따라 코드를 차근차근 작성해 보았다.

요구사항을 각각 주석처리를 한 후 순서대로 하나씩 진행해보니 전체적인 틀이 잡혔다. 

 

 

 

내 코드

더보기
import random

class BaseCharacter:
    def __init__(self, name, hp, normal_power):
        self.name = name
        self.max_hp = hp
        self.current_hp = hp
        self.normal_power = normal_power

    def normal_attack(self, target):
        damage = random.randint(int(self.normal_power*0.8), int(self.normal_power*1.2))
        target.current_hp -= damage
        print(f"{self.name}의 일반 공격! {target.name}에게 {damage}의 데미지를 입혔습니다.")
        if target.current_hp <= 0:
            print(f"{target.name}이(가) 쓰러졌습니다!")
        else:
            print(f"{target.name}의 남은 체력: {target.current_hp}")

    def show_status(self):
        print(f"{self.name}의 남은 체력은 {self.current_hp}입니다")

class Player(BaseCharacter):
    def __init__(self, name, hp, mp, normal_power, magic_power):
        super().__init__(name, hp, normal_power)
        self.max_mp = mp
        self.current_mp = mp
        self.magic_power = magic_power
        self.type_ = "인간"

    def magic_attack(self, target):
        damage = random.randint(int(self.magic_power*0.8), int(self.magic_power*1.2))
        self.current_mp -= 10  # magic_attack 메소드가 10 MP소모
        target.current_hp -= damage
        print(f"{self.name}의 마법 공격! {target.name}에게 {damage}의 데미지를 입혔습니다.")
        if target.current_hp <= 0:
            print(f"{target.name}이(가) 쓰러졌습니다!")
        else:
            print(f"{target.name}의 남은 체력: {target.current_hp}")

class Monster(BaseCharacter):
    def __init__(self, name, hp, normal_power):
        super().__init__(name, hp, normal_power)
        self.type_ = "몬스터"


# 플레이어로 부터 정보 입력받기
print("이름을 입력해 주세요: ")
name = str(input(" "))


player = Player(name, 100, 50, 20, 25)
monster = Monster("몬스터", 100, 20)
while True:
    print("공격을 선택해주세요.")
    print("1. 일반 공격")
    print("2. 마법 공격")
    action = input("입력: ")

    if action == "1":
        player.normal_attack(monster)
    elif action == "2":
        if player.current_mp < 10:
            print("mp가 부족합니다.")
            continue
        player.magic_attack(monster)
    else:
        print("잘못된 입력입니다. 다시 선택해주세요.")
        continue

    if monster.current_hp <= 0:
        print(f"{player.name}님이 승리했습니다.")
        break

    monster.normal_attack(player)

    if player.current_hp <= 0:
        print(f"{player.name}님이 패배했습니다.")
        break

    player.show_status()

 

정답코드

더보기
import random


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):
        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}")


class Player(Character):
    def __init__(self, name, hp, power, mana, magic_power):
        super().__init__(name, hp, power)
        self.max_mana = mana
        self.mana = mana
        self.magic_power = magic_power

    def attack(self, other):
        action = input("어떤 공격을 사용하시겠습니까? (1: 일반 공격, 2: 마법 공격) ")
        if action == '1':
            super().attack(other)
        elif action == '2':
            if self.mana < 10:
                print("마나가 부족합니다.")
                return
            damage = self.magic_power
            other.hp = max(other.hp - damage, 0)
            self.mana = max(self.mana - 10, 0)
            print(f"{self.name}의 마법 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
            if other.hp == 0:
                print(f"{other.name}이(가) 쓰러졌습니다.")
        else:
            print("잘못된 입력입니다. 다시 입력해주세요.")

    def show_status(self):
        super().show_status()
        print(f"마나 {self.mana}/{self.max_mana}")


class Monster(Character):
    def __init__(self, name, hp, power):
        super().__init__(name, hp, 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}이(가) 쓰러졌습니다.")


# 게임 시작
name = input("캐릭터의 이름을 입력하세요: ")
player = Player(name, 100, 10, 20, 20)
monster = Monster("슬라임", 50, 5)

while True:
    player.show_status()
    monster.show_status()
    player.attack(monster)
    if monster.hp == 0:
        print("승리했습니다!")
        break
    monster.attack(player)
    if player.hp == 0:
        print("패배했습니다...")
        break

 

 

 

'내일배움캠프' 카테고리의 다른 글

[TIL]Django 실무 기초 - 프로젝트 세팅  (0) 2023.04.03
[TIL]rpg게임 만들기 팀과제  (0) 2023.04.03
[TIL]javascript 기초문법  (0) 2023.03.15
[TIL]CSS 파일 분리  (0) 2023.03.14
[TIL] Git과 Github  (0) 2023.03.14