개발일기

좀비 턴제 게임 만들기 #3 1대 다수 플레이 구현하기 본문

Project Portfolio

좀비 턴제 게임 만들기 #3 1대 다수 플레이 구현하기

츄98 2023. 4. 2. 18:00

게임을 구상할 때, 플레이어들이 각 스테이지별로 좀비를 죽이면서 최종 목적지까지 가기로 했다.

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