구글공룡게임

GitHub 소스 바로가기

기본문법

구글공룡게임에서는 python의 간단한 구조를 엿볼수 있습니다.

함수설정

함수란무엇인가?

반복적으로 사용되는 부분을 재사용하기 위해 미리 정의해 두는 것

파이썬의 함수 구조

def 함수명(매개변수):
    <수행할 문장1>
    ...

게임에서는 아래와 같은 함수를 볼수 있다.

def main():  # 함수정의 부분
    pass

namemain 일경우 위에서 정의된 함수 main()을 실행합니다.

if __name__ == '__main__': 
    main()

[문법] while

while <조건문>:  # 조건이 참(True)이면 실행
    <수행할 문장1>
    ...

[문법] if

if <조건문>:  # 조건이 참(True)이면 실행
    <수행할 문장1>
    ...

[문법] if-else

if <조건문>:  # 조건이 참(True)이면 실행
    <수행할 문장1>
    ...
else:
    <수행할 문장2>
    ...

[문법] if-elif-else

if <조건문>:  # 조건이 참(True)이면 실행
    <수행할 문장1>
    ...
elif <조건문>:  # 조건이 참(True)이면 실행
    <수행할 문장2>
    ...
else:
    <수행할 문장3>
    ...

공룡게임 본격적으로 소스분석을 해 보겠습니다. 먼저 전체 소스는 아래와 같습니다.

Full Source

import pygame
import sys

pygame.init()
pygame.display.set_caption('Jumping dino')
MAX_WIDTH = 800
MAX_HEIGHT = 400

def main():
    # set screen, fps
    screen = pygame.display.set_mode((MAX_WIDTH, MAX_HEIGHT))
    fps = pygame.time.Clock()

    # dino
    imgDino1 = pygame.image.load('assets/images/dino1.png')
    imgDino2 = pygame.image.load('assets/images/dino2.png')
    dino_height = imgDino1.get_size()[1]
    dino_bottom = MAX_HEIGHT - dino_height
    dino_x = 50
    dino_y = dino_bottom
    jump_top = 200
    leg_swap = True
    is_bottom = True
    is_go_up = False

    # tree
    imgTree = pygame.image.load('assets/images/tree.png')
    tree_height = imgTree.get_size()[1]
    tree_x = MAX_WIDTH
    tree_y = MAX_HEIGHT - tree_height

    while True:
        screen.fill((255, 255, 255))

        # event check
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if is_bottom:
                    is_go_up = True
                    is_bottom = False

        # dino move
        if is_go_up:
            dino_y -= 10.0
        elif not is_go_up and not is_bottom:
            dino_y += 10.0

        # dino top and bottom check
        if is_go_up and dino_y <= jump_top:
            is_go_up = False

        if not is_bottom and dino_y >= dino_bottom:
            is_bottom = True
            dino_y = dino_bottom

        # tree move
        tree_x -= 12.0
        if tree_x <= 0:
            tree_x = MAX_WIDTH

        # draw tree
        screen.blit(imgTree, (tree_x, tree_y))

        # draw dino
        if leg_swap:
            screen.blit(imgDino1, (dino_x, dino_y))
            leg_swap = False
        else:
            screen.blit(imgDino2, (dino_x, dino_y))
            leg_swap = True

        # update
        pygame.display.update()
        fps.tick(30)  # 초당 30번 실행


if __name__ == '__main__':
    main()

기본 구성

import pygame
import sys

pygame.init()
pygame.display.set_caption('Jumping Dino')
screen_width = 800
screen_height = 400

# color
WHITE = (255, 255, 255)

def main():
    screen = pygame.display.set_mode((screen_width, screen_height))
    fps = pygame.time.Clock()

    while True:
        # event check
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        screen.fill(WHITE)
        # update
        pygame.display.update()
        fps.tick(30)  # 초당 30번 실행

if __name__ == '__main__':
    main()

나무이미지를 로딩하고 좌측으로 움직이는 화면

def main():
    ..............
    # tree
    tree = pygame.image.load('assets/images/tree.png')
    tree_height = tree.get_size()[1]  # (width, height)
    tree_x = screen_width  # x 는 화면에 끝에 둔다
    tree_y = screen_height - tree_height  # y 는 화면의 높이에서 tree의 높이를 뺀 위치에 둔다.
    
     while True:
        ..............
        # tree move
        tree_x -= 12.0
        if tree_x <= 0:  # 만약 나무가 화면의 좌측끝(맨앞) 으로 오면 다시 화면의 뒤로 이동시킨다.
            tree_x = screen_width

        # draw tree
        screen.blit(tree, (tree_x, tree_y))
        ..............

공룡이미지를 로딩하고 뛰어가는 움직이는 효과

두개의 공룡 이미지를 번갈아 디스플레이 함으로서 공룡이 움직이는 듯한 효과를 준다.

def main():
    ..............
    # dinosour image
    dinosour1 = pygame.image.load('assets/images/dino1.png')
    dinosour2 = pygame.image.load('assets/images/dino2.png')
    dino_height = dinosour1.get_size()[1]
    dino_bottom = screen_height - dino_height
    dino_x = 50
    dino_y = dino_bottom
    leg_swap = True
    ..............
    while True:
    ..............
        # draw dino : 번갈아 공룡이미지를 표현
        if leg_swap:
            screen.blit(dinosour1, (dino_x, dino_y))
            leg_swap = False
        else:
            screen.blit(dinosour2, (dino_x, dino_y))
            leg_swap = True
    ..............

공룡 점프하기

아무키나 누르면 공룡이 점프하는 기능을 구현한다.

def main():
    ..............
    jump_top = 200  # 점프를 하면 200까지 올린다.
    is_bottom = True  # 점프중인지 아닌지 확인
    is_go_up = False  # 올라가는 중인지 내려오는 중인지 확인
    ..............
     while True:
        for event in pygame.event.get():
     ..............
            elif event.type == pygame.KEYDOWN:
                if is_bottom:  # 키보드를 누를때 현재 공룔이 바닥에 있으면
                    is_go_up = True
                    is_bottom = False
                    
                # dino jumping
        if is_go_up:  # 위로 올라가는 중이면
            dino_y -= 10.0
        elif not is_go_up and not is_bottom:  # 내려오지만 아직 바닥이 아닌 경우는
            dino_y += 10.0

        # dino top and bottom check
        if is_go_up and dino_y <= jump_top:  # 올라가는 중이고 점핑 한계에 도달하면
            is_go_up = False
            
        if not is_bottom and dino_y >= dino_bottom:  # 바닥보다 아래면
            is_bottom = True
            dino_y = dino_bottom

멋지게 달리고 나무를 뛰어넘는 무서운 공룡이 탄생했습니다. 부딛히거나 점수를 올리는 게임은 다른 게임 예제를 통해 말씀드리겠습니다.

평점을 남겨주세요
평점 : 2.5
총 투표수 : 1