본문 바로가기
프로그래밍

파이썬기초 - 파이썬을 이용해 턴제 게임 만들기

by 킹부자 2020. 11. 15.
728x90
반응형
SMALL

클래스를 활용해서 메이플스토리 몬스터와 캐릭터를 만들어서 싸움을 붙여보겠습니다.

클래스를 총 3개 만들어 보겠습니다.

class Unit:
    hp = None
    normal_attack_dmg = None

    def attack(self, enemy_hp):
        return enemy_hp - self.normal_attack_dmg


class Warrior(Unit):
    hp = 200
    normal_attack_dmg = 10

    power_strike_dmg = 20

    def power_strike(self, enemy_hp):
    	print("파워 스트라이크!!!")
        return enemy_hp - self.power_strike_dmg

    def drink_potion(self):
    	print("체력회복!!!")
       	self.hp = self.hp + 10


class Slime(Unit):
    hp = 300
    normal_attack_dmg = 15

    body_attack_dmg = 25

    def body_attack(self, enemy_hp):
    	print("몸통박치기!!!")
        return enemy_hp - self.body_attack_dmg

Unit class, Warrior class, Slime class를 만들었습니다.

전사와 슬라임이 공통적으로 가지고 있는 체력, 일반 공격, 일반 공격 대미지는 Unit class에 만들어놓고 Warrior class와 Slime class에 상속시켰습니다.

 

Unit class를 보면 attack 함수가 있습니다. 함수를 실행할 때 상대방의 체력을 받아서 norma_attack_dmg만큼 체력을 깎습니다.

 

Warrior class는 Unit class를 상속받았으므로 attack 함수를 사용할 수 있습니다. 추가로 적의 체력을 power_strike_dmg만큼 깎는 power_strike 함수와 자신의 hp를 회복하는 drink_potion 함수가 있습니다. 그리고 멋을 위해 스킬명을 외치는 국 룰을 추가했습니다.

 

power_strike 역시 attack 함수처럼 적의 체력을 함수 외부에서 받아와야 합니다.

 

Slime class도 Unit class를 상속받았으므로 attack함수를 사용할 수 있습니다. 추가로 적의 체력을 body_attack_dmg만큼 깎는 body_attack함수가 있습니다.

 

이제 Warrior, Slime 인스턴스를 만들어서 싸움을 붙여보겠습니다.

warrior = Warrior()
slime = Slime()

print("전사 체력 :", warrior.hp) # 전사 체력 200
warrior.hp = slime.body_attack(warrior.hp) # 슬라임 몸통박치기 사용
print("전사 체력 :", warrior.hp) # 전사 체력 175

print("") # 결과를 편하게 보기위해 여백을 넣음

print("슬라임 체력 :", slime.hp) # 슬라임 체력 300
slime.hp = warrior.power_strike(slime.hp) # 전사 파워스트라이크 사용
print("슬라임 체력 :", slime.hp) # 슬라임 체력 280

슬라임(Slime)과 전사(Warrior) 인스턴스를 만든 후 슬라임이 먼저 몸통 박치기로 먼저 공격합니다. 전사 체력은 200이었지만 몸통 박치기를 맞고 175가 됩니다. 이번에는 전사가 공격합니다. 파워 스트라이크를 맞은 슬라임은 체력이 300에서 280으로 감소합니다.

 

이제 게임 종료 조건을 넣어봅시다. 둘 중하나가 쓰러질 때까지 싸우게 합니다.

warrior = Warrior()
slime = Slime()

while True:

    print("전사 체력 :", warrior.hp)
    warrior.hp = slime.body_attack(warrior.hp)
    print("전사 체력 :", warrior.hp)
    
    if warrior.hp <= 0: # 전사 체력이 0 이하라면 반복문 탈출.
        break
    
    print("")
    
    print("슬라임 체력 :", slime.hp)
    slime.hp = warrior.power_strike(slime.hp)
    print("슬라임 체력 :", slime.hp)
    
    if slime.hp <= 0: # 슬라임 체력이 0 이하라면 반복문 탈출.
        break
        
print("게임을 종료합니다.")

둘 중 하나가 죽을 때까지 싸워야 하므로 전투를 계속 반복해야 합니다. 그래서 반복문을 추가했습니다. while을 이용해 무한반복 진행합니다.

상대 체력을 깎은 후 상대의 남은 체력을 출력합니다. 실행하면 항상 슬라임이 이깁니다. 역시 킹 라임.

 

전사는 공격, 파워 스트라이크, 포션 마시기 3가지 함수가 있고, 슬라임은 공격, 몸통 박치기 2가지 함수가 있습니다. 현재 예제에서는 계속 같은 기술만 사용합니다. 좀 더 게임스럽게 사용할 기술을 고를 수 있도록 만들어보겠습니다.

warrior = Warrior()
slime = Slime()

while True:

    print("슬라임이 공격합니다.")
    print("1. 일반공격")
    print("2. 몸통박치기")

    slime_input = input('사용할 스킬의 번호를 입력세요. ')

    print("전사 체력 :", warrior.hp)
    if slime_input == "1":
        warrior.hp = slime.attack(warrior.hp)
    elif slime_input == "2":
        warrior.hp = slime.body_attack(warrior.hp)

    print("전사 체력 :", warrior.hp)

    if warrior.hp <= 0:  # 전사 체력이 0 이하라면 반복문 탈출.
        break

    print("")

    print("전사가 공격합니다.")
    print("1. 일반공격")
    print("2. 파워스트라이크")
    print("3. 포션사용")

    warrior_input = input("사용할 스킬의 번호를 입력하세요. ")

    print("슬라임 체력 :", slime.hp)

    if warrior_input == "1" :
        slime.hp = warrior.attack(slime.hp)
    elif warrior_input == "2" :
        slime.hp = warrior.power_strike(slime.hp)
    elif warrior_input == "3" :
        warrior.drink_potion()
        print("전사 체력 :", warrior.hp)

    print("슬라임 체력 :", slime.hp)

    if slime.hp <= 0:  # 슬라임 체력이 0 이하라면 반복문 탈출.
        break

print("게임을 종료합니다.")

이제 게임을 실행해보면 slime_input에서 유저의 입력을 기다리고 있습니다. input 함수를 이용해서 입력을 받고, 조건문을 이용하여 입력받은 숫자에 따라서 실행되는 함수가 달라지도록 수정했습니다. 

 

여기서 좀 더 게임처럼 만들 수 있습니다. MP를 추가해서 스킬 사용을 제한한다던지, 랜덤 하게 공격 순서를 바꾼다던지 방법은 다양할 것입니다. 여러분의 입맛대로 한번 게임을 마무리해보는 것도 좋을 거 같습니다.

 

728x90
반응형
LIST

'프로그래밍' 카테고리의 다른 글

아마존 웹 서비스(AWS) 소개  (0) 2020.11.16
파이썬 기초 - 패키지와 추천 패키지  (0) 2020.11.16
파이썬기초 - 클래스  (0) 2020.11.15
파이썬기초 - 반복문  (0) 2020.11.15
파이썬기초 - 조건문  (0) 2020.11.15

댓글