개발일기

개인과제) 게임만들기 본문

오늘의 공부일기/파이썬 공부일기

개인과제) 게임만들기

츄98 2023. 3. 28. 15:58

어제 오늘, 개인과제로 게임만들기를 했다.

어제 아파서..  과제도 많이 못하고..  TIL도 적지 못했다ㅠㅠ (몸관리 잘하자ㅠㅠ)

어제 하고 싶었던 말까지 TIL에 열심히 적도록 하자!!

 

개인과제는, class 상속 연습할 때 만들어둔 게임을 좀 더 발전시켜서 완성했다.

https://github.com/jisukim908/game.git

 

GitHub - jisukim908/game

Contribute to jisukim908/game development by creating an account on GitHub.

github.com

자세한 코드는 위에 깃허브에 들어가면 볼 수 있다.

여기서는 일부 코드만 가지고 의도한 점, 시도한 점, 느낀 점 등을 작성하도록 하겠다.

 

 

지난 번과 다른 점

  • 치유스킬, 공격스킬(일반, 마법)을 추가
  • 랜덤성을 준 요소들을 추가
  • 비슷한 코드는 함수로 만들어서 코드 줄이기
  • 스토리라인을 더 탄탄하게..
  • 지난 번엔 확률게임이었지만, 지금은 전투게임의 성격을 가진다. 공격방식을 잘 선택하면 이길 수 있다.

 

#power를 기준으로 데미지 값이 변하도록 설정했다.
#비슷하게 heal를 기준으로 회복값도 변하도록 설정했다.
damage = random.randint(self.power-5,self.power+1)
plus = random.randint(self.heal-2,self.heal+5)

#이렇게 데미지값이 파워값에서 3을 뺀 값보다 작으면 공격 miss라는 메세지를 주도록 했다.
#일반공격의 경우, 약간의 hp회복이 있도록 했다.
#마법공격은 데미지가 강하다.
if damage < self.power-3:
    print(f'{self.name}의 공격 miss!! {other.name}에게 {damage}의 데미지를 입혔습니다. {self.name}은 {heal}의 hp를 회복했습니다.')
else:
    print(f'{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다. {self.name}은 {heal}의 hp를 회복했습니다.')

클래스 상속을 활용하여 악당, 플레이어들의 속성을 설정했다.

여러 번 게임을 실행해보면서.. 게임의 난이도를 조절했다.

약간은 어렵지만 플레이어가 이길 수 있도록 랜덤값(악당 hp, 플레이어 공격데미지값, 회복값 등등)을 조절했다.

 

 

#스토리라인
player = input("환영합니다. 당신의 이름은?").strip()
print(f"{player}님! 다시 한 번 환영합니다~ 이곳은 몬스터 세상! 당신의 몬스터를 고르세요.")
time.sleep(1)
print("물 속성 몬스터(1): power= 10, heal=12 / 불 속성 몬스터(2): power = 12, heal = 10")
time.sleep(1)
choice = input("당신의 선택은? 1 또는 2를 입력하세요.").strip()

나는 포켓몬몬스터라는 게임을 재밌게 했었기 때문에..

모험을 떠나는 지후처럼 ㅎㅎ 모험을 떠나는 플레이어의 설정을 가지고 스토리를 만들었다.

 

 

#전투
#자주 나오는 코드라서 함수로 만들었다.
def test(fight, a, b):
    if fight == "1":
        a.attack(b)
        time.sleep(1)
        if b.hp>0:
            print(f'드래곤의 반격')
            b.attack(a)
            time.sleep(1)
        a.status_check(b)
        time.sleep(2)
    elif fight == "2":
        a.special_attack(b)
        time.sleep(1)
        if b.hp>0:
            print(f'드래곤의 반격')
            b.attack(a)
            time.sleep(1)
        a.status_check(b)
        time.sleep(2)
    elif fight == "3":
        a.healing()
        time.sleep(1)
        if b.hp>0:
            print(f'드래곤의 반격')
            b.attack(a)
            time.sleep(1)
        a.status_check(b)
        time.sleep(2)
    else:
        print("잘못 입력하셨습니다. 다시 입력하세요.")

전투장면에는 while문과 if문을 활용했으며, 전투 코드 중에서 반복되는 코드가 있어서 이렇게 함수로 만들었다. 

공격방식을 선택하면 fight라는 값이 받고, a, b는 각각 플레이어와 악당을 지칭하는 요소이다. 

이 과정은 alive=False가 될 때까지 반복되고, alive=False가 되면  break로 while문이 끝난다.

원래는 함수가 아니라 if문 안에 코드가 다 들어가있었는데, 그렇게 하니 코드가 너무 길어지고.. 보기 힘들어서 함수를 이용해서 코드를 정리하였다.

 

 

#물 속성 몬스터를 선택한 경우
if choice == "1":
    mname = input("당신의 몬스터의 이름을 지어주세요.")
    time.sleep(1)
    print(f'준비는 끝났습니다. {player}님과 {mname}, 모험을 떠나세요!')
    e = EvilMonster()
    w = WaterMonster(mname)
    print(f'앗.. 출발하자마자 드래곤을 발견!!! 드래곤이 {mname}을(를) 사냥하려고 한다!! 싸워서 당신의 몬스터를 지키세요. 드래곤 hp: {e.max_hp}')
    time.sleep(2)
    while(True):
        print('공격스킬 1: 물총쏘기(일반+약간의 hp 회복), 2 : 용오름(마법), 3: 족욕타임(hp회복)')
        fight = input(f'{player}님, 공격방식을 고르세요. (1/2/3)').strip()
        time.sleep(1)
        test(fight, w, e)
        if w.alive == False or e.alive == False:
            break

 

게임을 여러 번 해보면서, 되도록 플레이어가 이길 수 있는 환경을 만들어두었다. 

둘 중 하나가 죽을 때까지 서로 공격과 수비를 주고받으면서 게임이 진행된다.

 

 

느낀 점

코드에 차이를 조금 준 것일뿐인데 게임의 성격이 완전히 바뀌었다니 신기하다. 지난 번에는 정말 확률게임이었는데, 지금은 플레이어의 선택에 따라 승부가 갈린다. 선택을 개똥같이 하지 않는 한, 이길 수 있도록 프로그래밍이 되었고, 그렇다고 너무 쉽게 이기진 않도록 hp, heal, damage의 값을 조절했다. 전보다 스토리라인이 좀 더 생겨서 게임같은 게임이 된 것은 같은데.. 아쉬움은 여전히 남는다ㅠㅠ

이틀이라는 시간이 주어졌지만.. 요 며칠 몸이 좋지 못해서 원래 만들어둔 게임을 조금 변형해서 제작했다는 점이 아쉽다. 클래스를 활용해서 좀 더 좋은 게임을 만들어볼 수 있을텐데..  새로운 시도를 하지 못한 점이 걸린다. 그래도 전과 비교해서 정교화되었으니 이만하고, 몸이 좀 더 좋아지면 다시 해보는 걸로 하자.