본문 바로가기

Python/Python Pygame 02 - Snake Game

Python Pygame 02 - Snake Game 01

안녕하세요. 바로 전 블로그에 이어서 Snake Game을 마무리하겠습니다.

 

 

일단 개발을 해서 위에처럼 가능하게 만들었습니다. 마지막에 코드를 첨부하겠습니다.

 

어떻게든 위에처럼 만들어서 완료는 했습니다. 다른 사람들이 한 것을 보면 Object-oriented program 객체 지향형을 많이들 사용했습니다. 제가 생각해봐도 그렇게 하는 것이 무조건 편한 것 같습니다. 저는 그냥 List로 만들어서 저장해서 만들었는데, 중간에 좀 이상해져서 다시 지우고 코딩을 했습니다. 아직 실력이 부족해서 깔끔하고 멋있게 코딩을 못하고 있네요. 얼른 연습을 해서 실력을 향상해야겠습니다. 그럼 안뇽~ 

 

#Snake Game

import math
import random
import pygame

def DrawMapLines(gamewindow,rows, width):
    x = 0
    y = 0
    for i in range(rows):
        x = x + 25
        y = y + 25
        pygame.draw.line(gamewindow, (255,255,255), (x,0),(x,width))
        pygame.draw.line(gamewindow, (255,255,255), (0,y),(width,y))

def DrawSnake(gamewindow,snake,ratio):
    for i in range(len(snake)):
        pygame.draw.rect(gamewindow, (255,0,0), (snake[i][0]*ratio+1,snake[i][1]*ratio+1, 24, 24))

def DrawSnack(gamewindow,snack,ratio):
    pygame.draw.rect(gamewindow, (255,255,0), (snack[0]*ratio+1,snack[1]*ratio+1, 24, 24))

def DrawGame(gamewindow,rows,width,ratio,snake,snack):
    #Draw Map
    DrawMapLines(gamewindow,rows, width)
    #Draw Snake
    DrawSnake(gamewindow,snake,ratio)
    #Draw Snack
    DrawSnack(gamewindow,snack,ratio)
    pygame.display.update()

def GetKeyBoardInput():
    LeftOrRight = 0
    flag_key_pressed = 0
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()   
        keys = pygame.key.get_pressed()
        for key in keys:
            if keys[pygame.K_LEFT]:
                LeftOrRight = 1
                break
            elif keys[pygame.K_RIGHT]:
                LeftOrRight = 2
                break
            else:
                break
        if flag_key_pressed != 0:
            break
    return LeftOrRight

def UpdateSnakeDir(snake_dir):
    LeftOrRight = GetKeyBoardInput()
    next_snake_dir = 0
    if LeftOrRight != 0:
        #Left
        if snake_dir == 1:
            if LeftOrRight == 1:
                next_snake_dir = 2
            elif LeftOrRight == 2:
                next_snake_dir = 4
        #Up
        elif snake_dir == 2:
            if LeftOrRight == 1:
                next_snake_dir = 3
            elif LeftOrRight == 2:
                next_snake_dir = 1
        #Right
        elif snake_dir == 3:
            if LeftOrRight == 1:
                next_snake_dir = 4
            elif LeftOrRight == 2:
                next_snake_dir = 2
        #Down
        elif snake_dir == 4:
            if LeftOrRight == 1:
                next_snake_dir = 1
            elif LeftOrRight == 2:
                next_snake_dir = 3
    else:
        next_snake_dir = snake_dir
    return next_snake_dir

def UpdateSnakeBody(snake,snake_dir,eat_status):
    next_snake = snake
    new_eat_status = eat_status
    if eat_status == 0:
        for i in range(len(snake)):
            if i == len(snake)-1:
                if snake_dir == 1:#Left
                    next_snake[i][0] = snake[i][0] - 1
                    next_snake[i][1] = snake[i][1]
                elif snake_dir == 2:#Up
                    next_snake[i][0] = snake[i][0] 
                    next_snake[i][1] = snake[i][1] + 1
                elif snake_dir == 3:#Right
                    next_snake[i][0] = snake[i][0] + 1
                    next_snake[i][1] = snake[i][1] 
                elif snake_dir == 4:#Down
                    next_snake[i][0] = snake[i][0] 
                    next_snake[i][1] = snake[i][1] - 1
            else:
                next_snake[i][0] = snake[i+1][0]
                next_snake[i][1] = snake[i+1][1]
    else:
        for i in range(len(snake)):
            if i == len(snake)-1:
                if snake_dir == 1:#Left
                    next_snake[i][0] = snake[i][0] - 1
                    next_snake[i][1] = snake[i][1]
                elif snake_dir == 2:#Up
                    next_snake[i][0] = snake[i][0] 
                    next_snake[i][1] = snake[i][1] + 1
                elif snake_dir == 3:#Right
                    next_snake[i][0] = snake[i][0] + 1
                    next_snake[i][1] = snake[i][1] 
                elif snake_dir == 4:#Down
                    next_snake[i][0] = snake[i][0] 
                    next_snake[i][1] = snake[i][1] - 1
            else:
                next_snake[i][0] = snake[i][0]
                next_snake[i][1] = snake[i][1]
    
    return next_snake,new_eat_status

def UpdateSnakeStatus(snake,snake_dir,eat_status):
    next_snake_dir = UpdateSnakeDir(snake_dir)
    next_snake_body,new_eat_status = UpdateSnakeBody(snake,next_snake_dir,eat_status)
    return next_snake_dir, next_snake_body,new_eat_status

def WaitUntilSnakeEatsSnack(snake,snack):
    ans = 0
    if (snake[len(snake)-1][0] == snack[0]) and (snake[len(snake)-1][1] == snack[1]):
        ans = 1
    return ans

def GenerateNewSnack(snake,snack):
    while True:
        x = random.randrange(1,21)
        y = random.randrange(1,21)
        if [x,y] not in snake:
            
            if (x != snack[0] and y !=snack[1]):
                break
    return x,y

def SnackStatus(snake,snack):
    new_snack_x = snack[0]
    new_snack_y = snack[1]
    eat = 0
    if WaitUntilSnakeEatsSnack(snake, snack):
        new_snack_x,new_snack_y = GenerateNewSnack(snake,snack)
        snake.append([0,0])
        snake[len(snake)-1][0] = snack[0]
        snake[len(snake)-1][1] = snack[1]
        eat = 1
    else:
        eat = 0
    return eat,new_snack_x,new_snack_y,snake

def GameOverStatus(snake):
    GameOver = 0
    if snake[len(snake)-1][0] > 20 or snake[len(snake)-1][0] < 0:
        GameOver = 1
    elif snake[len(snake)-1][1] > 20 or snake[len(snake)-1][1] < 0:
        GameOver = 1
    return GameOver

def main():
    clock = pygame.time.Clock()
    width = 500
    rows = 20
    ratio = width // rows
    gamewindow = pygame.display.set_mode((width, width))
    #1 -> Left, 2-> Up, 3-> Right, 4->Down
    snake_dir = 1
    snake = [[10,10],[10,11]]
    snack = [5,11]
    GameOver = 0
    eat_status = 0
    while GameOver == 0:
        pygame.time.delay(150)
        clock.tick(20)
        gamewindow.fill((0,0,0))
        #Update Snake
        snake_dir, snake,eat_status = UpdateSnakeStatus(snake,snake_dir,eat_status)
        #Generate Snack
        eat_status,snack[0],snack[1],snake = SnackStatus(snake,snack)
        #GameOver
        GameOver = GameOverStatus(snake)
        #Draw Game
        DrawGame(gamewindow,rows,width,ratio,snake,snack)
    pygame.quit()
main()

'Python > Python Pygame 02 - Snake Game' 카테고리의 다른 글

Python Pygame 02 - Snake Game 00  (0) 2019.07.22