안녕하세요. 바로 전 블로그에 이어서 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 |
---|