본문 바로가기

내일배움 캠프/TIL

2023 03 27 파이썬 터미널 RPG 만들기

파이썬을 이용해서 rpg게임을 만드는 개인 프로젝트가 있어서 어떠한 방식으로 알피지를만들지 고민을 했습니다.

 

처음에는 1 대 1로 단순히 싸우는 게임을 만들자로 시작을 해서 몬스터를 찾아서 싸우는 던전 방식으로 짜고자 생각을 하고

print('어떤 행동을 취할까?')
    print("------------------------")
    time.sleep(0.3)
    novice.show_user_status()
    print(f'상대 {monster.name}의 체력: {monster.hit_point}') if spawn else False
    time.sleep(0.4)
    print('1. 일반공격 2. 특수공격') if spawn else print('1.몬스터찾기 2.보스랑 싸우기 3.저장하기')
    print("------------------------")
    action = int(input())

    if not spawn:
        if action == 1:
            monster_spawn = random.randrange(0, len(stage_1_monster_col))
            monster = stage_1_monster_col[monster_spawn]
            print(f'당신은 {monster.name}을 만났다')
            time.sleep(0.5)
            spawn = True

        if action == 2:
            monster = KingSlime()
            print(f'당신은 {monster.name}을 만났다!')
            time.sleep(0.5)
            spawn = True

    elif spawn:
        if action == 1:
            novice.normal_attack(monster)
            user_turn = True
        elif action == 2:
            print('어떤 스킬을 사용할까?')
            print('1.더블어택 2.힐')
            specialattack = int(input())-1
            try:
                attacktype[specialattack]()
                user_turn = True
            except:
                pass
        else:
            pass

이런 방식으로 코드를 짜게되었습니다 

monster의 spawn값을 기준으로 나오는 코드가 다르게 하고 나오는 조건도 다르게 하여서

spawn이 안되어있을때는 몬스터를 찾고 spawn이 되어있을떄에는 몬스터를 공격하는 방식을 취했습니다

    def normal_attack(self,enemy):
        dmg_percentage = random.uniform(0.8,1.2)
        dmg=round(self.attack_power*dmg_percentage)
        enemy.hit_point -= dmg
        print(f'{self.name}의 공격!')
        print(f'{enemy.name}에게 {dmg}의 데미지')
        time.sleep(0.7)
        enemy.check_status()

일반 공격의 경우에는 random.uniform을 통해서 0.8배에서 1.2배의 데미지를 랜덤으로 주게 구현을 하였고 공격후에 

check status를 통해 몬스터가 죽었는지 살았는지 확인할수있는 방식을 선택해서 했습니다

def level_up(self):
        self.level+=1
        self.experience -= self.max_experience
        self.max_experience = self.max_experience*2
        self.max_hit_point += 10
        self.hit_point = self.max_hit_point
        self.max_magic_point += 10
        self.magic_point = self.max_magic_point
        self.attack_power += int(self.attack_power*0.1)
        self.magic_power += int(self.magic_power*0.1)
        print(f'당신의 레벨이 {self.level}이 되었습니다')
        time.sleep(0.2)
        print(f'당신의 체력이 전부 회복되었습니다')
        time.sleep(0.4)
        if self.experience>self.max_experience:
            self.level_up()

또 레벨업을 구현하고싶어서 이런방식을 취했었는데 코드를 이렇게 안해도 할수있는 방법이 있었을거 같아서 조금 아쉬웠습니다

그리고 만약에 얻은 경험치가 최대 경험치가 많을 경우에 재귀를 통해 레벨업을 여러번 할수있게 구현했습니다!