728x90
2023-11-08 45th Class
파이썬 클래스를 사용해 게임 만들기
#️⃣ 프로그램 entry point : GameLauncher
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
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)
반응형
'Education > 새싹 TIL' 카테고리의 다른 글
새싹 AI데이터엔지니어 핀테커스 10주차 (금) - Loss Function & Differentiation (0) | 2023.11.10 |
---|---|
새싹 AI데이터엔지니어 핀테커스 10주차 (목) - Artificial Neuron & MLP (2) | 2023.11.09 |
새싹 AI데이터엔지니어 핀테커스 10주차 (화) - DL Preliminaries (Logic Gates using Class) (0) | 2023.11.07 |
새싹 AI데이터엔지니어 핀테커스 10주차 (월) - DL Preliminaries (Perceptron & Logic Gates) (2) | 2023.11.06 |
새싹 AI데이터엔지니어 핀테커스 9주차 (금) - PJT 5 Marketing Strategy (0) | 2023.11.03 |