728x90

2023-11-08 45th Class

파이썬 클래스를 사용해 게임 만들기

#️⃣ 프로그램 entry point : GameLauncher

main.py

import os  
  
from chap3_deep_learning.dl_03_mini_project.utils import Utils  
from game_objects import Character  
from game_objects import SAVED_PATH  
  
  
class GameLauncher:  
    def __init__(self):  
        self.char = None  
        self.utils = None  
  
    def __call__(self):  
        while True:  
            print("======================================")  
            next_move = int(input("SeSAC 온라인에 오신 것을 환영합니다.\n"  
                                  "1. 새로운 게임 시작하기 \n"  
                                  "2. 지난 게임 불러오기 \n"  
                                  "3. 게임 종료하기 \n"  
                                  "다음 중 어떤 것을 하시겠습니까?"  
                                  ))  
  
            if next_move == 1:  
                print("새로운 캐릭터를 생성합니다.")  
                self.char = Character()  
                self.char.print_states()  
                self.utils = Utils()  
                self.utils.game_main(self.char)  
  
            elif next_move == 2:  
                if os.path.exists(SAVED_PATH):  
                    print("저장된 파일을 불러옵니다.")  
                    self.char = Character()  
                    self.char.load_states()  
                    self.char.print_states()  
                    self.utils = Utils()  
                    self.utils.game_main(self.char)  
  
                print("저장된 파일이 없습니다. 메인 화면으로 돌아갑니다.")  
                continue  
  
            elif next_move == 3:  
                print("게임을 종료합니다.")  
                break  
  
  
if __name__ == '__main__':  
    launcher = GameLauncher()  
    launcher()

#️⃣ 메인 화면 : Utils

utils.py

from chap3_deep_learning.dl_03_mini_project.game_objects import Character  
from chap3_deep_learning.dl_03_mini_project.game_objects import Slime  
  
  
class Utils:  
    def __init__(self, char=Character()):  
        self.char = char  
        self.slime = Slime()  
  
    @staticmethod  
    def exit_game():  
        print("============ 게임 종료 ===========")  
        print("====== 메인화면으로 이동합니다. =====")  
        return -1  
  
    def game_main(self, char=None):  
        if char is not None:  
            self.char = char  
  
        while True:  
            print("======================================")  
            next_move = input("1. 몬스터 잡기 \n"  
                              "2. 현재 상태 확인 \n"  
                              "3. 물약 사기(30원) \n"  
                              "4. 물약 마시기 \n"  
                              "5. 게임 저장하기 \n"  
                              "0. 게임 종료 \n"  
                              "다음 중 어떤 것을 하시겠습니까?"  
                              )  
  
            moves = {  
                "1": lambda x=self.slime: self.char.attack_monster(x),  
                "2": self.char.print_states,  
                "3": self.char.buy_potion,  
                "4": self.char.drink_potion,  
                "5": self.char.save_states,  
                "0": self.exit_game  
            }  
            result = moves[next_move]()  
  
            if result == -1:  
                break

#️⃣ 게임 Unity별 행동 : GameObject

game_objects.py

import os  
import pandas as pd  
  
SAVED_PATH = "./data/save_file.csv"  
BASE_DIR = "./data/"  
  
  
def create_directory(directory):  
    try:  
        if not os.path.exists(directory):  
            os.makedirs(directory)  
    except OSError:  
        print("Error: Failed to create the directory.")  


class GameObject:  
    def __init__(self):  
        self.hp = 0  
        self.damage = 0  
  
    def get_hp(self):  
        return self.hp  
  
    def set_hp(self, new_hp):  
        self.hp = new_hp  
  
  
class Character(GameObject):  
    def __init__(self):  
        super().__init__()  
        base_attr = {  
            'lv': 1,  
            'exp': 0,  
            'hp': 100,  
            'max_hp': 100,  
            'damage': 10,  
            'money': 100,  
            'n_potion': 10  
        }  
  
        for k, v in base_attr.items():  
            setattr(self, k, v)  
  
    def print_states(self):  
        to_print = ("--------------- \n "                    f"현재 레벨: {self.lv} \n "  
                    f"현재 경험치: {self.exp} \n "  
                    f"다음 레벨을 위한 경험치: {self.lv * 100} \n "  
                    f"HP: {self.hp} \n "  
                    f"HP 최대치: {self.max_hp} \n "  
                    f"공격력: {self.damage} \n "  
                    f"돈: {self.money} \n "  
                    f"포션: {self.n_potion} \n "  
                    "---------------")  
  
        print(to_print)  
  
    def save_states(self):  
        states = vars(self)  
        df = pd.DataFrame(states, index=[0])  
        if not os.path.exists(SAVED_PATH):  
            create_directory(BASE_DIR)  
  
        df.to_csv(SAVED_PATH, index=False)  
        print("saved")  
  
    def load_states(self):  
        df = pd.read_csv(SAVED_PATH)  
        states = df.iloc[0, :].to_dict()  
        for k, v in states.items():  
            setattr(self, k, v)  
  
  
    def check_level_up(self):  
        if self.exp >= self.lv * 100:  
            self.lv += 1  
            print(f"LEVEL UP -> Lv.{self.lv}")  
  
            self.max_hp += 10  
            self.set_hp(self.max_hp)  
            self.damage += 3  
  
    def attack_monster(self, slime):  
        print(f"Before Attack >> char: {self.get_hp()}, slime: {slime.get_hp()}")  
        # 사람 공격  
        slime_hp = slime.get_hp()  
        slime_hp -= self.damage  
        slime.set_hp(slime_hp)  
  
        # 슬라임을 잡았으면  
        if slime_hp <= 0:  
            kill_exp = slime.get_kill_exp()  
            kill_money = slime.get_kill_money()  
            self.exp += kill_exp  
            self.money += kill_money  
            print(f"경험치: {kill_exp}, 돈: {kill_money} 획득!")  
            slime.__init__()  
            self.check_level_up()  
            return  
  
        # 슬라임 반격  
        char_hp = self.get_hp()  
        char_hp -= self.damage  
        self.set_hp(char_hp)  
        print(f"After Attack >> char: {self.get_hp()}, slime: {slime.get_hp()}")  
  
    def buy_potion(self):  
        self.n_potion += 1  
        self.money -= 30  
        print(f"잔액: {self.money}, 현재 물약: {self.n_potion}개")  
  
    def drink_potion(self):  
        new_hp = self.get_hp() + 50  
        self.set_hp(min(new_hp, self.max_hp))  
        self.n_potion -= 1  
        print(f"물약을 마셨습니다. 잔여 체력: {self.get_hp()}")  
  
  
class Monster(GameObject):  
    def __init__(self):  
        super().__init__()  
        base_attr = {  
            'hp': 0,  
            'damage': 0,  
            'kill_exp': 0,  
            'kill_money': 0  
        }  
  
        for k, v in base_attr.items():  
            setattr(self, k, v)  
  
    def get_kill_exp(self):  
        return self.kill_exp  
  
    def get_kill_money(self):  
        return self.kill_money  


class Slime(Monster):  
    def __init__(self):  
        super().__init__()  
        base_attr = {  
            'hp': 30,  
            'damage': 2,  
            'kill_exp': 50,  
            'kill_money': 10  
        }  
  
        for k, v in base_attr.items():  
            setattr(self, k, v)
반응형