| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- sql
- REDIS
- 2주차
- WebSocket
- 마스킹
- 프로그래머스
- 장고
- WHERE절
- 개발일지
- Class
- 백준
- 정보처리기사실기
- channels
- Git
- js
- 정보처리기사
- vscode
- poetry
- WIL
- 가상환경
- github
- resnet50
- 알고리즘
- 1주차
- 채팅
- 파이썬
- 미니프로젝트
- re-id
- 프로젝트
- Commpot
- Today
- Total
개발일기
좀비 턴제 게임 만들기 #3 1대 다수 플레이 구현하기 본문
게임을 구상할 때, 플레이어들이 각 스테이지별로 좀비를 죽이면서 최종 목적지까지 가기로 했다.
6명의 플레이어 중 4명을 골라 플레이어를 하고,
스테이지 5를 통과하면 보상으로 전직 마법사인 교통경찰을 추가해주는 식으로 시스템을 잡았다.
코딩을 하기 전, 내게 큰 고민이 있었으니!!
플레이 중에 캐릭터가 죽으면 그 캐릭터는 사라져야하고.. 더 이상 전투에 참여할 수 없고..
5스테이지에서 한 명이 추가되니 추가되는 캐릭터도 전투에 참여하도록 해야겠군..!
또 각 스테이지를 통과할 때마다 보상으로 레벨업과 스킬업을 해야 하니 그 부분도 신경써야함
좀비의 공격방식.. hp가 가장 큰 플레이어를 공격하는 것으로 프로그래밍해야함
어떻게 구현을 해야 할까.. 리스트로 구현을 할 수 있을까.. for문과 리스트를 활용하여 문제를 해결해보았다.
시도1. 캐릭터가 죽으면 리스트 자체에서 없애버리자
그러나 이 방법은, 매 스테이지마다 어떤 캐릭터가 죽을지.. 리스트의 어떤 요소가 사라지는지 파악해야 하고, 파악하는 것 자체도 너무 힘들다는 걸 깨달으면서 포기..
시도2. 캐릭터가 죽으면 hp = 0으로 만들어버리고, 플레이 자체가 hp가 0 초과할 때만 가능하도록 프로그래밍을 하자. 결과적으로 이 방법으로 만듦!
첫번째 스테이지에서의 전투장면 코드를 간단히 보여주면서, 어떻게 프로그래밍을 했는지 얘기해보자.
print("이제 준비는 끝났다. 출..ㅂ..ㅏ..",
"어? 좀비가 옥상까지 기어올라왔다. 싸워서 이 곳을 탈출하자", '\n', sep='\n')
# 스테이지1(바람)
fight1(wind) #wind = WindMonster() 바람 속성 좀비 클래스를 wind 변수에 저장해서 사용함
if character[0].hp <= 0 and character[1].hp <= 0 and character[2].hp <= 0 and character[3].hp <= 0:
print("게임종료..", "이쉽게도 당신은 생존하지 못했습니다..", '\n', sep='\n')
break
print('='*70, '좀비와의 전투에서 승리했습니다! 보상: 레벨업, 스킬업', '\n', sep='\n')
for i in character:
levelup(i)
check(i)
time.sleep(5)
전투장면의 코드가 많이 중복되고 반복이 되어서, 자주 반복되는 부분을 fight1()함수로 만들었다.
# 싸움장면 (반복되서 함수로 만듦)
# 4대 1 전투
# 여기서 characters는 모든 캐릭터들을 저장한 리스트
# a 자리에 좀비가 들어감
def fight1(a):
while (characters[0].hp > 0 or characters[1].hp > 0 or characters[2].hp > 0 or characters[3].hp > 0) and a.hp > 0:
for player in characters:
if player.hp > 0 and a.hp > 0:
player.attack(a)
else:
pass
a.status_check()
if a.hp > 0:
a.attack(zombie_attack(characters))
time.sleep(2)
for i in characters:
check(i)
for문을 활용해서 캐릭터 리스트에 담겨있는 캐릭터가 하나씩 for문을 돌면서..
hp가 0을 초과하고, 좀비의 hp도 0을 초과할 때는 캐릭터가 좀비를 공격할 수 있게 프로그래밍했다.
그런 뒤에 좀비의 상태를 체크하고, 좀비의 hp가 0을 초과할 때, 플레이어를 공격할 수 있도록 했다.
이때의 zombie_attack 함수는..
def zombie_attack(a):
max_hp = a[0].hp # 첫번째 캐릭터의 hp를 맥스값으로 적용함
target = a[0]
for i in a:
if max_hp < i.hp:
target = i
return target
최댓값 찾기 알고리즘을 활용하여 프로그래밍했다.
만약 좀비의 공격으로 캐릭터가 죽으면, 캐릭터의 hp를 0으로 만들어야한다.
그러기 위해 check()함수를 만들었다.
def check(a):
if a.hp > 0:
a.status()
else:
a.hp = 0
print(f"{a.name}은(는) 죽음..")
마지막으로 스테이지를 통과할 때마다 레벨업과 스킬업을 해야하므로,
level up() 함수를 만들었다.
def levelup(a):
if a.hp > 0:
a.character_level()
# character_level()은 클래스 안에서 지정한 함수로..
def character_level(self):
self.exp += 50
if self.exp % 100 == 0:
self.level += 1
self.hp += self.hp*0.1
self.atk += self.atk*0.1
self.def_ += self.def_*0.1
# 다음과 같이 경험치는 50만큼 커지고, 경험치가 다 차면 레벨, hp, 공격력, 방어력이 올라가도록 코드를 만들었다.
시도3. 새로운 캐릭터가 등장하면..? fight1()함수를 아주 살짝 변형해서 전투장면에 응용함!
스테이지 5 (보스전)을 통과하면 교통경찰이 추가된다.
# 스테이지6 (가스)
print("힘겨운 싸움 끝에 자동차를 얻었다.", "어? 근데 범상치 않은 교통경찰이 우리를 향해 다가온다???",
"전직 마법사였던 교통경찰.. 그와 함께한다면 항구까지 가기 더 수월할거다.", "그럼 이제 출~~바...ㄹ.... ㅇㅔ??",
"기름이 없다...", "기름을 얻으러 주유소로 가자", '\n', sep='\n')
# hp, mp, eng, atk, int_, def_, agi, vit, rem, rst, level, exp
# 교통경찰추가!!
character.append(TraffiselfPolice('이세계 마법사였지만 마법세계에서 퇴출을 당하고 마법부에 쫓기고 있는 교통경찰',
700, 150, 0, 120, 200, 150, 0.15, 20, 120, 0, 3, 0))
이렇게 characters 리스트 안에는 총 5명의 캐릭터가 저장이 된다.
전투코드는 위에 fight1()과 거의 완전 똑같다.
최종 결과물)
https://github.com/jisukim908/zombie_game.git
GitHub - jisukim908/zombie_game
Contribute to jisukim908/zombie_game development by creating an account on GitHub.
github.com
'Project Portfolio' 카테고리의 다른 글
| 게시글 자세히보기/삭제하기/댓글 작성하기/삭제하기 기능 (0) | 2023.04.13 |
|---|---|
| 장고 팀프로젝트 #1 Commpot 기획 (0) | 2023.04.11 |
| 좀비 턴제 게임 만들기 #2 제거할 캐릭터 선택하기(리스트 활용) (0) | 2023.03.30 |
| 좀비 턴제 게임 만들기 #1 게임 계획 (0) | 2023.03.30 |
| 떠나보조) 추천여행지 글쓰기 기능 만들기 (1) | 2023.03.17 |