[Python]Class_응용하여 게임 만들기!
출처 - 문제와 코드는 양정은 강사님 수업을 바탕으로 제작됨.
STEP.1 게임 시작화면 만들기
import os # 운영체제와 상호 작용하기 위한 모듈을 가져옵니다.
while True: # 무한 루프를 시작합니다. 이것은 사용자가 원할 때까지 게임 메뉴를 계속 표시할 것입니다.
# 사용자로부터 다음 동작을 선택하도록 안내하는 메시지를 출력합니다.
next_move = int(input(“\nSeSac 온라인에 오신 것을 환영합니다.\n\n"
"1. 새로운 게임 시작하기\n"
"2. 지난 게임 불러오기\n"
"3. 게임 종료하기\n"
"다음 중 어떤 것을 하시겠습니까? ")
if next_move == 1:
print("\n새로운 캐릭터를 생성합니다."
break
elif next_move == 2:
if os.path.exists("save_file.csv')
print("\n저장된 파일을 불러옵니다.")
break
else:
print("\n저장된 파일이 없습니다. 메인 화면으로 돌아갑니다.")
continue
elif next_move == 3:
print("\n게임을 종료합니다.")
break
- 사용된 개념
- os (운영체제):
- "os"는 컴퓨터 운영체제와 상호 작용하기 위해 사용되는 도구나 도서관 같은 것입니다.
- 컴퓨터에서 파일을 찾거나 만들거나 삭제하는 등의 작업을 할 때 도움이 됩니다.
- 코드에서의 사용: 코드의 import os 부분은 컴퓨터 운영체제와 상호 작용하는 도구를 불러오는 부분입니다.
- while (반복문):
- 중학생 설명: "while"은 특정 조건이 참인 동안 계속해서 같은 작업을 반복하는 것과 관련이 있습니다. 어떤 조건이 참인지 검사하고, 조건이 거짓이 될 때까지 반복 작업을 수행합니다.
- 코드에서의 사용: 코드의 while True: 부분은 사용자가 게임 메뉴에서 선택을 계속하고자 할 때 반복적으로 메뉴를 보여주는 역할을 합니다.
- if 및 elif (조건문):
- 중학생 설명: "if" 및 "elif"는 조건을 검사하여 특정 동작을 수행하는 데 사용됩니다. "if"는 주어진 조건이 참이면 특정 작업을 수행하고, "elif"는 이전 조건이 거짓이면 다른 조건을 검사하고 해당 조건이 참이면 해당 작업을 수행합니다.
- 코드에서의 사용: 코드의 if next_move == 1:는 사용자가 1을 선택했을 때 어떤 작업을 수행할지를 결정합니다. "elif"는 2와 3을 선택했을 때의 작업을 결정하는데 사용됩니다.
- break (루프 종료):
- 중학생 설명: "break"는 반복문을 중단하고 루프를 빠져나가는 역할을 합니다. 특정 조건이 충족될 때, 반복문을 종료하고 다음 코드로 이동합니다.
- 코드에서의 사용: 코드의 break는 사용자가 게임을 시작하거나 종료하거나 불러오는 등의 작업을 선택했을 때, 메뉴를 종료하고 해당 동작을 수행합니다
STEP.2 케릭터 클래스의 초깃값
Q. 다음의 초깃값의 데이터를 가지는 Character 클래스를 만드세요.
class Character:
# 생성하면서 변수에 값을 저장
def __init__(self):
self.lv = 1
self.now_exp = 0
self.next_exp = 100
self.HP = 100
self.max_HP = 100
self.damage = 10
self.money = 100
- Character 클래스는 게임 캐릭터의 속성을 나타내는 것이며, __init__ 메서드를 가지고 있습니다. __init__ 메서드는 객체가 생성될 때 자동으로 호출되며, 클래스의 속성을 초기화합니다.
- self.lv, self.now_exp, self.next_exp, self.HP, self.max_HP, self.damage, 그리고 self.money는 클래스의 속성(또는 멤버 변수)으로, 캐릭터의 레벨, 경험치, 체력, 공격력, 그리고 게임 머니를 나타냅니다.
- 초깃값은 각각의 속성에 대해 이미 설정되어 있으며, 모든 새로운 캐릭터 객체가 이러한 초깃값을 가지게 됩니다. 예를 들어, 모든 새로운 캐릭터 객체는 레벨 1, 현재 경험치 0, 최대 체력 100, 등을 가집니다.
이 클래스를 사용하면 게임에서 다양한 캐릭터를 만들고 관리할 수 있으며, 각 캐릭터의 속성을 추적하고 수정할 수 있습니다. 예를 들어, 새로운 캐릭터를 만들려면 다음과 같이 할 수 있습니다.
- 사용된 개념
Class 에 대한 정의
1. 클래스 정의 (Class Definition):
- 먼저, 클래스를 정의합니다. 이 클래스는 자동차 객체를 만들기 위한 설계도입니다.
class Car:
def __init__(self, make, model, year):
self.make = make # 제조사
self.model = model # 모델
self.year = year # 생산년도
self.speed = 0 # 현재 속도
이 클래스는 Car라는 이름으로 정의되며, 자동차 객체의 속성으로 make (제조사), model (모델), year (생산년도), 그리고 speed (현재 속도)를 가집니다. __init__ 메서드를 통해 객체가 생성될 때 속성들을 초기화합니다.
2. 객체 생성 (Object Creation):
- 이제 클래스를 기반으로 실제 자동차 객체를 만들어봅니다.
my_car = Car("Toyota", "Camry", 2020)
your_car = Car("Honda", "Civic", 2022)
위 코드에서 my_car와 your_car는 각각 Car 클래스의 객체입니다. my_car는 Toyota의 Camry 모델로 2020년에 생산된 자동차를 나타내고, your_car는 Honda의 Civic 모델로 2022년에 생산된 자동차를 나타냅니다.
3. 객체의 속성과 메서드 사용 (Using Object's Attributes and Methods):
- 이제 객체를 사용하여 속성에 접근하고 메서드를 호출할 수 있습니다.
print(f"My car is a {my_car.year} {my_car.make} {my_car.model}.")
print(f"Your car is a {your_car.year} {your_car.make} {your_car.model}.")
my_car.speed_up(30)
your_car.speed_up(20)
4. 결과 출력 (Output):
- 마지막으로, 객체의 속성과 메서드를 사용하여 얻은 결과를 출력할 수 있습니다.
my_car.print_speed()
your_car.print_speed()
이렇게 클래스를 정의하고 객체를 생성하여 객체의 속성과 메서드를 사용함으로써, 우리는 현실 세계의 개념을 프로그램으로 모델링하고 조작할 수 있습니다. 클래스는 프로그램을 구조화하고 코드를 재사용하기 쉽게 만드는 강력한 도구 중 하나입니다.
Step.3 캐릭터의 정보출력 기능
다음과 같이 캐릭터의 정보를 출력하는 print_states 메서드를 만드세요.
Q. 다음과 같이 캐릭터의 정보를 출력하는 print_states 메서드를 만드세요.
----------
현재 레벨:1
현재 경험치: 0
다음 레벨을 위한 경험치: 100 HP: 100
HP 최대치: 100 공격력: 10
돈: 100
----------
이때 다음 레벨을 위한 경험치는 레벨에 100배값으로 설정합니다.
class Character:
# 생성하면서 변수에 값을 저장
def __init__(self):
self.lv = 1
self.now_exp = 0
self.next_exp = 100
self.HP = 100
self.max_HP = 100
self.damage = 10
self.money = 100
# 저장되어 있는 값을 출력
def print_states(self):
print(f"현재 레벨:{self.lv},현재 경험치:{self.now_exp},다음 레벨을 위한 경험치 :{self.next_exp},HP :{self.HP},HP 최대치:{self.max_HP},공격력 :{self.damage},돈 :{self.money}")
이미 __init__으로 초기화 된 값을 print method를 만들어서 출력을 한다,
이떄 f-string을 사용하여 print문을 만들었다.
-> 좀 더 효율적이고 한줄로 간결하게 출력을 할수 있어서 사용함.
Step.4 캐릭터 저장 기능
캐릭터에 대한 다음의 save_file.csv를 만드는 save_states 메서드를 만드세요.
lv
|
1
|
exp
|
0
|
HP
|
100
|
max_HP
|
100
|
damage
|
10
|
money
|
100
|
def save_states(self):
# 이 파일을 이름 대상으로 쓰기 모드/ 무슨 말이 있든 무시하고 덮어쓰기 => 여러가지 기능
# open이라는거는 open이라는 method
with open('save_files.csv','w') as f: #alies
# close 를 안해도 되는 이유는 with 있어서 (원래는 open을 쓰는 경우에는 무조건 close를 해주어야함)
f.write(f"lV,{self.lv}\n"
f"now_exp,{self.now_exp}\n"
f"next_exp,{self.next_exp}\n"
f"HP,{self.HP}\n"
f"max_HP,{self.max_HP}\n"
f"damage,{self.damage}\n"
f"money,{self.money}")
- 사용된 개념
open()
파일을 생성하기 위해 파이썬 내장 함수 open
# newfile.py
f = open("새파일.txt", 'w')
f.close()
파일_객체 = open(파일_이름, 파일_열기_모드)
파일열기모드설명
r | 읽기 모드: 파일을 읽기만 할 때 사용한다. |
w | 쓰기 모드: 파일에 내용을 쓸 때 사용한다. |
a | 추가 모드: 파일의 마지막에 새로운 내용을 추가할 때 사용한다. |
쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고 해당 파일이 존재하지 않으면 새로운 파일이 생성된다.
위 예에서는 디렉터리에 파일이 없는 상태에서 ‘새파일.txt’ 파일을 쓰기 모드인 'w'로 열었기 때문에 ‘새파일.txt’라는 이름의 새로운 파일이 현재 디렉터리에 생성되었다.
새파일.txt’ 파일을 C:/doit 디렉터리에 생성하고 싶다면 다음과 같이 작성
# newfile2.py
f = open("C:/doit/새파일.txt", 'w')
f.close()
위 예에서 f.close()는 열려 있는 파일 객체를 닫아 주는 역할을 한다. 사실 이 문장은 생략해도 된다. 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일의 객체를 자동으로 닫아 주기 때문이다. 하지만 close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다. 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문이다. (이를 생략하기 위한 방법으로 with가 있다.)
Step.5 캐릭터 불러오기 기능
save_file.csv에서 캐릭터의 정보를 불러오는 load_states 메서드를 만드세요.
# 'save_files.csv' 파일을 읽기 모드('r')로 열고 파일을 자동으로 닫기 위해 'with'를 사용
def load_staes(self):
# 파일의 모든 줄을 읽어서 lines 리스트에 저장합니다.
with open('save_files.csv','r') as f:
lines = f.readlines()
# csv는 콤마 기준으로 분리된다. 줄을 분리하고 값은 values 리스트에 저장한다.
values = [line.rstrip().split(',')[1]for line in lines]
# values 리스트의 각 항목을 해당 캐릭터 속성에 할당합니다. (attribute)
self.lv = int(values[0])
self.now_exp = int(values[1])
self.next_exp = int(values[2])
self.HP = int(values[3])
self.max_HP = int(values[4])
self.damage = int(values[5])
self.money = int(values[6])