[사전스터디] 졸라맨 번개 피하기 게임 - (2)

hyuckhoon.ko·2020년 4월 30일
0

What I learned in wecode

목록 보기
11/109

어제 못다한 부분을 마무리 지으려 한다.

  • 졸라맨 캐랙터가 피해야 할 번개들을 구현했다.
    (어제는 한 개만 만들었다.)

우선, Class 및 object를 사용해야할 필요성을 느꼈다. 왜냐하면 내가 원하는 만큼의 번개를 빠르게 생성해야 했고, 번개 개수는 증가해도 동일한 역할을 수행(메소드)해야 하기 때문이었다. 그래서 Enemy클래스에 관련 메소드들은 정의하였다.
그리고 막상 구현해보니, OOP가 왜 만들어졌는지에 대해서도 느낄 수 있었다.

# Enemy
class Enemy():
	# 초기화 시키는 함수이며, 번개의 x,y 좌료가 일정 범위 내에서 랜덤으로 설정
    def __init__(self):
        self.enemy_x = random.randint(0, 540)
        self.enemy_y = random.randint(0, 200)
	
	# 번개가 땅으로 떨어지게 하며, 그 변화가 스크린에 바로 나오도록 구현
    def enemy_play(self):
        self.enemy_y += 2
        screen.blit(enemy_img, (self.enemy_x, self.enemy_y))
        
	#번개가 땅바닥에 떨어진 여부를 알려주는 함수. 떨어졌을 경우, True 반환
    def is_fall(self):
        if self.enemy_y > 650:
            return True
	# 번개와 졸라맨의 충돌 여부를 알려주는 함수.
    def is_collision(self, player_x, player_y):
        dis_x = abs(player_x - self.enemy_x)
        dis_y = abs(player_y - self.enemy_y)
        distance = math.sqrt(math.pow(dis_x, 2) + math.pow(dis_y, 2))
        
        if distance < 30:
            print("번개와의 거리 ", distance)
            print("충돌")
            return True
        else:
            return False

클래스를 사용하며 느낀점은,

1) 그 전엔 main()함수의 loop문 안에 사요될 함수들을 전부 넣느라 코드 디버깅 및 수정을 할때 나조차도 지금 무엇을 하는지 '가끔' 헷갈렸었다. 예를들어, '이 함수는 무엇을 작동시키려고 하는 함수지? 졸라맨(플레이어)였던가, 번개였던가?'
그런데, enmey.is_fall() 등과 같은 메소드를 인지하고 사용하면서 '내가 지금 정확히 무엇을 하는지'의 과정이 명확해졌다.

2) 플레이어(user)의 알고리즘과 번개(enemy)의 알고리즘 구분이 명확해져서 코드의 가독성이 향상되었다. 향후 기능 추가를 할때, 확장성이 확보됐다는 느낌을 받았다. Class 정의한 부분에 가서 메소드 혹은 클래스 변수만 추가/수정하면 된다.

3) 객체의 생성과 삭제가 직관적이었다. 객체를 무한정 늘리는 것이 아니라, 리스트에 할당된 번개들만 사용하는 방식이 가능하다. 번개가 땅에 떨어지면 바로 그 객체를 삭제시키고 새로운 객체를 생성해서 전체 리스트 개수는 언제나 동일했다. 메소드의 활용을 통해 쉽게쉽게 생성/추가를 할 수 있다는 점이 재밌었다.

======================================================

아래는 main()함수에 작성된 번개 관련 코드다.

번개 개수를 25개로 (변수)선언했다.
그래고 loop함수에 진입 전에, enemy 객체를 생성했다.

 enemy_list = []
    num_of_enemies = 25
    for i in range(num_of_enemies):
        enemy = Enemy()
        enemy_list.append(enemy)

======================================================

main()함수 loop문 안의 코드는 아래와 같다.

# 생성해 둔 객체들을 play() 시킨다. 즉, 바닥을 향해 떨어지도록 구현하고
  이를 스크린에 반영되도록 하는 메소드다.
for i in range(num_of_enemies):
            enemy_list[i].enemy_play()

# 번개가 졸라맨을 건드리지 않고, 바닥에 닿았을 경우,
  is_fall() 메소드를 통해, 그 여부를 확인한다.
  바닥에 닿았다는 의미로 True값을 받을 경우, if문 작동.
  바닥에 닿은 번개는 번개 리스트에서 삭제되며, 다시 새로운 번개 객체를
  생성한다. 그래서 번개 개수가 항상 25개가 되도록 유지한다.
        for i in range(num_of_enemies):
            if enemy_list[i].is_fall():
                del enemy_list[i]
                print("바닥 닿았음")
                enemy = Enemy()
                enemy.enemy_play()
                enemy_list.append(enemy)
			
            
            # 번개가 졸라맨이 충돌했을 경우, is_collision() 메소드를 통해 확인한다. 
            collision = enemy_list[i].is_collision(player_x, player_y)
            if collision:
                player(player_dead_img, player_x, player_y)
                pygame.display.update()
                user_response = input(
                    "게임을 다시 시작하겠습니까? (y/n) : ").lower() == 'y'
                if user_response:
                    main()
                else:
                    print("게임을 종료합니다.")
                    game_status = True
                    break
            else:
                player(player_img, player_x, player_y)
                pygame.display.update()
                                   - One step at a time - 
  

0개의 댓글