[TIL #7] Python 텍스트게임

안떽왕·2023년 3월 27일
0

Today I Learned

목록 보기
7/76

파이썬 텍스트게임

이번 주 초반에 진행할 발제 내용은 텍스트 게임입니다.
말 그대로 텍스트로 진행되는 게임인데 아주 옛날에 상용 컴퓨터 도입 초기에 유행했다고 알려진 게임입니다.

별도의 홈페이지나 그래픽 요소가 들어가 있지 않고 오로지 터미널 안에서 텍스트로 게임이 진행됩니다.

평소 게임에 관심이 많고 그동안 해왔던 게임도 많아서 그런지 여태껏 나왔던 그 어느 발제 내용보다도 흥미가 넘치는 발제였습니다.

이번 발제는 흥미가 많은 만큼 해보고 싶다는 욕심이 많아서 넣고 싶은 기능이 많은데 개인과제라 그런지 기간이 이틀 그것도 다음날 오후 5시까지 제출이라는 게 참 아쉽게 느껴졌습니다. 그러나 현재 참여하고 있는 부트 캠프가 게임 개발이 아니라 웹 개발인 점을 고려해 봤을 때 이러한 흥미를 돋을 수 있는 과제를 내줬다는 것 자체를 감사하게 생각하고 있습니다.

계획

플레이어 클래스는 이름, 체력, 마나, 힘, 마력을 가집니다.
몬스터 클래스는 이름, 체력, 힘을 가집니다.

각 클래스마다 공격 함수와 현재 상태를 확인할 수 있는 함수를 가지고 있으며, 플레이어의 경우 마법 공격 함수도 가지고 있습니다.

플레이어의 이름을 사용자에게 입력 받아야합니다.
플레이어의 나머지 스탯은 랜덤성을 부여합니다.
플레이어와 몬스터가 데미지를 줄때 랜덤성이 있어야합니다.

플레이어가 공격 시 어떤 방식으로 공격을 할 건지 입력받아야 합니다. 공격 방식을 입력받은 후에는 어떤 대상을 공격할 건지 입력받아야합니다.

몬스터는 리스트에 담겨있으며 몬스터가 사망 시 리스트에서 제거됩니다.

플레이어는 무조건 선공을 잡습니다.

계획을 이렇게 세웠습니다. 사실 속도라는 스탯을 부여해 선공을 나눌 수 있지만, 게임을 하는 입장에서 턴제 게임은 선공을 잡아야 향후 계획을 짜는 데에 유리하기도 하고 속이 시원하기 때문에 무조건 선공을 부여했습니다.

시도

랜덤한 데미지를 뽑기 위해 랜덤 상수를 만들어 불러오는 형태로 작성하면 편하지 않을까?라고 생각했습니다.

RANDOM_DAMAGE = random.randrange(8, 12) / 10

RANDOM_DAMAGE를 상수로 선언하고 데미지를 구하는 함수에 사용했습니다. 이후 코드를 완성하고 시도해 본 결과 게임은 정상적으로 진행되었고, 값 또한 랜덤으로 바뀌는 것을 확인했었다.

이후 기술 매니저님께서 방문하시고 매니저님 앞에서 코드 리뷰를 시작하는데 매니저님께서 랜덤 데미지가 잘 작동하는지 물으셨고 저는 당연히 잘 작동된다고 말씀드렸으나 확인 결과 그렇지 못함을 알 수 있었습니다.

저 랜덤 상수는 전역 함수로 선언이 되어있고 다른 함수에서 참조해 쓰기 때문에 반복문 내에서 때릴 때마다 랜덤이 적용되는 게 아니라 맨 처음 설정된 랜덤 상수만 적용되어 새 게임을 시작하지 않는 이상 같은 값만을 출력하고 있었습니다.

제가 착각한 가장 큰 이유가 저것인데, 희한하게 중복이 되는 경우가 많긴 하지만 새 게임을 시작할 때마다 상수가 바뀌다 보니 스스로 랜덤이 잘 작동한다고 믿었었습니다.

결과

작성된 코드에는 플레이어의 일반, 마법 공격, 몬스터의 일반 공격으로 공격 코드가 총 3개 있는데 모두 유사한 형태를 가지고 있어 그중 플레이어의 일반 코드를 예시로 살펴보겠습니다.

# 플레이어의 일반 공격
def nomal_attack(self, enemy):
    # damage가 float형식이라 int로 형변환
    damage = int(self.power * (random.randrange(8, 12) / 10))
    enemy.current_hp = enemy.current_hp - damage # 적의 현재 hp는 현재hp - 데미지
    print(f"{self.name}의 공격! {enemy.name}에게 {damage}의 물리데미지를 입혔습니다.")
    if enemy.current_hp <= 0:   # 적의 현재 hp가 0보다 작거나 같을경우 적 사망
        print(f"{enemy.name}이(가) 쓰러졌습니다.")

결국 선언해놓았던 전역 변수 랜덤 상수를 놓아주고 3개의 공격 함수에 각각 랜덤 값을 입력해 오류를 잡을 수 있었습니다.

처음에는 더 간결한 방법이 없을까 고민했는데 아직 제 수준으로는 마감시한까지 맞추기 힘들 것 같아 일단 할 수 있는 방법으로 기능을 구현하고 넘어가기로 했습니다.

느낀 점

다른 사람과 코드리뷰를 하는 행동이 얼마나 중요한지 알려주는 사례였던 것 같습니다. 물론 다음 날 테스트를 하며 발견할 수 도 있었겠지만, 더 빨리 발견해서 수정하는 것이 기능이 더 심화되서 수정하는 것 보다 낫다고 생각하고 있습니다.

그리고 테스트를 하면서 이상하게 랜덤인데 중복이 잘 된다고 생각하고 있었는데 스스로 랜덤함수가 잘 작동한다고 믿고 있어서 그런지 우연이 저렇게 겹치네 하고 넘어갔습니다.

다음에 이러한 기시감을 느낀다면 끊임없이 나 자신을 의심하는 습관을 지녀야겠다고 생각했습니다.

profile
이제 막 개발 배우는 코린이

0개의 댓글