5.6 플래피버드 게임 추가기능 구현하기 (점수기능)
Last updated
Last updated
지금부터 구현해 보는 기능은 더 나은 게임성을 위해 추가되는 내용으로 보너스 챕터로 생각해도 좋을 것이다. 코딩도 배우고 완성도 높은 게임을 원하는 사람에게 참고가 되길 바란다. 먼저 아래와 같이 플래피버드가 파이프 통과를 성공하면, 화면상단 중앙에 성공한 횟수를 점수화해서 표시되는 코드를 추가해 보자.
이를 적용한 코드는 크게 3부분인데 먼저 10번 라인에서 score를 global 변수로 생성했고, 42-43번 라인에서 파이프가 화면빠져나갈 때까지 플래피버드가 죽지않았다면 점수를 증가시키고, 58번 라인에서 게임이 재시작하는 시점에서 다시 점수도 0부터 시작하도록 초기화했다.
여기까지 잘 구현되었다면 이번 챕터 맨 처음의 게임실행화면 예시처럼 파이프 통과시 화면상단에 점수(score)가 잘 증가하며 보여지는 것을 확인할 수 있다. 이제 다음으로 게임성을 높이기 위해 구현해 볼 것은 매번 파이프의 등장마다 위치를 랜덤화 시켜 게임의 흥미를 높이는 것이 남아있다.
점수를 추가하는 것은 어떤 시점에 점수가 얻어지게 되는지에 대한 알고리즘만 잘 고민하면 구현자체는 크게 어려운 것은 없다. 플래피버드가 파이프를 잘 통과한 시점이 점수을 얻어야 하는 시점인데, 사실 엄밀하게 생각하면 애니메이션 중인 플래피 버드와 파이프 둘의 현재 위치를 동시에 파악해 플래피버드가 살아있는 상태로 플래피버드의 좌측면(flappy_bird.left)이 파이프 객체의 우측면(pipe.right) 위치정보를 지났는가를 계속 검사해야 하는가 등으로 다소 복잡해 질 수도 있는데, 그렇게까지 엄밀하게 고려하지 않더라도 간략화시켜 생각해보면 플래피버드의 위치가 게임화면 좌측에서 크게 떨어져 있지 않다라는 것에 전제하여, 파이프의 이동하다가 게임화면 좌측에 도달해 다시 게임화면 우측의 초기위치로 순환하는 시점까지 플래피버드가 죽지않고 살아만 있다면, 결국 플래피버드가 파이프에 닿지 않고 무사통과했다라고 봐도 크게 무방하지 않다. 이런 단순한 알고리즘을 가져가면, 구현자체도 손쉬워지고 매순간 위치계산의 연산비교량이 증가해 게임의 퍼포먼스가 떨어질 수 있는 문제도 동시에 극복할 수 있게 된다.
이제 남은 코드는 점수를 화면에 그려주는 부분이다. 이것을 위해 라이브러리의 screen객체 안에 준비된 함수가 있는데 draw.text 함수이다. draw.text 함수의 자세한 사용법은 라이브러리 문서를 참조하고, 24-28번 라인에서 보는 것처럼 해당 함수에는 총 5개의 인자값(argument)을 넘겨 사용하는데, 첫번째는 화면에 출력할 텍스트 그 자체로 우리는 score 값을 그릴 건데 문제는 score의 데이터형태가 숫자값이라 텍스트형태(스트링)은 아니기 때문에, 데이터형태를 문자형으로 변경해주는 파이썬의 내장함수인 str 함수를 사용해 데이터타입을 변경한 후 값을 전달하고 있다. 두번째는 텍스트의 색깔, 세번째는 화면상에 그려질 위치로 화면의 상단의 중앙값(midtop)을 적용했고, 네번째는 폰트의 크기, 마지막 shdow 값은 그려질 텍스트에 그림자같은 것을 함께 그려주어 텍스트의 입체적 효과를 만드는 것으로 튜플형태로 넘긴 (1, 1)의 의미는 그림자가 원본으로부터 x, y 방향으로 얼마나 떨어져 그려져야 하는지에 대한 값을 넘긴 것이다.