본문 바로가기
코딩 한 주

2023 2주차

by 마동휘 2023. 3. 27.

이번주는 파이썬의 기초과정을 복습하고 심화를 익히는 주였다

한주를 정리해보는 WIL이지만 이번 주차의 WIL은 과제를 해결해나가면서 있던 나의 생각을 정리해보고자한다

금요일 과제를 받게 되었는데 턴제 게임을 만들어 보는 것이었다,

토요일에 시작해서 형태를 얼추 갖추게 되었다 

import random
import numpy


class Player:
    def __init__(self, name, hp, power, axe):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power
        self.normal_attack = "공격"
        self.throwing = "던지기"
        self.throwing_axe = axe
        self.throwing_axe_power = 17

    def attack(self, attack_type):
        if attack_type == self.normal_attack:
            attack_power = random.randint(int(self.power * 0.9), int(self.power * 1.2))
        elif attack_type == self.throwing:
            if self.throwing_axe < 1:
                print("남은 도끼가 없다")
                return False
            self.throwing_axe -= 1
            attack_power = self.throwing_axe_power
        else:
            print("그렇게 할 수 없다")
            return False

        return attack_power


class Monster:
    def __init__(self, name, hp, power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power
        self.normal_attack = "공격"

    def attack(self):
        damage = random.randint(int(self.power * 0.7), int(self.power * 1.3))
        return damage


def print_status(player, monster):
    print(f"{player.name}:HP {player.hp}/{player.max_hp}, 투척용 도끼 {player.throwing_axe}자루")
    print(f"{monster.name}:HP {monster.hp}/{monster.max_hp}")


# 모험의 시작
player_name = input("당신의 이름은 무엇인가")
player = Player(player_name, hp=150, power=10, axe=5)

# 몬스터
monsters = [
    Monster("고블린", hp=50, power=6),
    Monster("늑대", hp=70, power=7),
    Monster("오크", hp=150, power=10),
    Monster("와이번", hp=512, power=30)
]
monster = numpy.random.choice(monsters, p=[0.4, 0.3, 0.2, 0.1])

print(f"[{monster.name} 이/가 나타났다!]")

# 전투
while player.hp > 0 and monster.hp > 0:
    print_status(player, monster)

    # 플레이어 공격
    while True:
        attack_type = input("(공격, 던지기)을/를 한다")
        attack_power = player.attack(attack_type)
        monster.hp -= attack_power
        print(f"{player.name}의 {attack_type} {monster.name}에게 {attack_power}의 데미지를 주었다.")
        if attack_power:
            break

        if monster.hp <= 0:
            print(f"[{monster.name}]을/를 물리쳤다!")
            break

    # 몬스터 공격
    player.hp -= monster.attack()
    print(f"{monster.name}의 {monster.normal_attack} {player.name}에게 {monster.power}의 데미지를 주었다.")

    if player.hp <= 0:
        print(f"{player.name}이(가) 쓰러졌다. 눈앞이 캄캄해졌다")
        break

 

구동이 되는 것을 확인했다 공격 위력의 가감을 배수로 적용해보고자 했는데 에러가 나서

절대값으로 다시 변경할 예정이다

//////////

가이드를 골조로 삼아 살을 붙였다 일반적인 공격 뿐아니라

다양한 타입의 공격 방식을 구현해보는 것이 조건 중 하나 였는데

쉽게 떠오르는 게임에서 흔히 표현되는 마나를 사용하는 마법 공격

마법이라 하면 다소 만능인 부분이 있지않은가 상당히 간략화한 것을 어디까지나 만들어보는

것이기 때문에 신경 쓰지않아도 되는 부분같지만 마법을 사용하기 위한 캐스팅 흔히 주문을 읊는 과정이 필요하다던가

굳이 읊지는 않더라도 정신집중이 필요하다던가의 요소를 넣어 놓음으로서

만능의 성격을 띄고 있는 마법에 패널티를 주곤한다

그렇기 때문에 이 게임 내에서 주인공은 어디까지나 던전에 들어오게된 용병이란 콘셉트로 해보려고한다

석궁을 넣으려 했으나 석궁은 장전시간이 필요하고 활은 정확히 맞추기란 어렵다고 들었다

생각해낸게 투척용 도끼다 한정된 갯수를 가지고 있고 이걸 소모한다는 방식으로 접근했다

던지는 힘에 의해서 위력이 좌우 될 수 있지만 소모성 아이템이라는 개념으로서 고정데미지로 지정했다 

공격방식은 두가지 통상적인 공격과 도끼 투척

공격방식의 입력은 텍스트로 하면되고

공격, 던지기 다 그외의 입력은 else 의 텍스트가 프린트되고 다시 선택할수있게 된다

 

몬스터의 구분이다

랜덤인카운트 요소를 좋아 하는지라 다양한 몬스터와 조우할수있고

그 중에는 현재 플레이어의 스펙으로 감당할수없는 개체또한 보인다 

기껏 판타지 요소가 가미된 것이니 여럿 추가했는데

힘이 강한 개체는 적고 약한 개체는 많을 테니 조우할 확률을 조정하고자 했다

결과 random.choice를 알게 됬고 확률을 조정했다 1을 나눈 값으로서 적용되어

약하고 흔할 고블린의 등장확률을 5할 정도로 하는 등의 조정을 했는데

50으로 지정해둔 HP값이 플레이어와 동일한 150으로 출력되는 버그가 생겼다

알아보니 random.choice 같은 경우 부동소수점 ex) 0.1xxxx 값이 들어가는 경우 문제가 발생하기 때문에

정수를 사용해야한다는 것이다 하여 확률을 조정했다

 

전투를 구현하는 부분은 while문을 사용해서

어느 개체던 hp가 0 이하가 될 때까지 반복하도록 했다

공방을 구현하는 것까지는 정상구동을 확인했는데

몬스터의 hp가 0 이하가 됬을 때 

if monster.hp <= 0:
    print(f"[{monster.name}]을/를 물리쳤다!")
    break

몬스터를 물리쳤다는 텍스트 출력을 확인하지못했다

일단은 다음날로 넘겨봐야할것같다

 

목표는

  • 몬스터 처치 텍스트 출력 (버그픽스)
  • 공격위력 최소최댓값 조정 - 미적용 (버그픽스)
  •  
  • 체력회복 물약 구현*
  • 레벨업 구현*
  • 모험의 지속 기능 구현*
  • 몬스터 개별 클래스 구현*
  • ^상태이상 (기절,독,마비 etc)
  • ^공격 방식에 따른 방어도 구현 (참격,찌르기,타격,마법-몬스터,스크롤)
  • ^휴식,식량,거점,맵,장비
  • ^마법 - 캐스팅시간, 정신집중 - 몬스터의 패턴으로 이용
                                                      마법사용하기전은 공격하지 않고 한턴 쉰다던가 

*는 후순위 시간이 남으면 구현해보기로 한다

^는 시간이 정말 많이 남으면 해보자

'코딩 한 주' 카테고리의 다른 글

2023 6주차  (0) 2023.04.24
2023 5주차  (0) 2023.04.17
2023 4주차  (0) 2023.04.10
2023 3주차  (0) 2023.04.02
2023 1주차  (0) 2023.03.19

댓글