매일 업데이트
2022-10-04 13:43 8 min

Python으로 뱀 게임을 만드는 방법

파이썬으로 만드는 간단한 뱀 게임

뱀 게임을 좋아하시는 분이라면 이 글이 매우 흥미로울 것입니다.

이 글에서는 파이썬 초보자도 쉽게 따라 할 수 있는 간단한 뱀 게임 제작 과정을 안내합니다.

뱀 게임을 만드는 방법은 다양하지만, 여기서는 파이썬의 '거북이' 라이브러리를 사용하여 구현할 것입니다. 이 라이브러리는 파이썬 설치 시 기본적으로 제공되며, 사용자가 가상 캔버스에서 도형과 그림을 그릴 수 있게 해줍니다.

또한, '시간' 모듈과 '무작위' 모듈도 함께 사용할 것입니다.

  • 시간 모듈: 이전 시간으로부터 경과된 시간 (초)을 추적하는 데 사용됩니다.
  • 무작위 모듈: 파이썬에서 무작위 숫자를 생성하는 데 사용됩니다.

이 외에도 텍스트 편집기 (본 글에서는 VSCode를 사용)와 파이썬 3이 필요합니다. 파이썬 3이 없으면 컴퓨터에 설치하거나 koreantech.org 컴파일러를 활용할 수 있습니다.

자, 이제 재미있게 시작해 봅시다!

뱀 게임 작동 방식

이 게임의 목표는 플레이어가 뱀을 조작하여 화면에 나타나는 음식을 획득하고, 높은 점수를 얻는 것입니다.

플레이어는 뱀의 이동 방향을 제어하기 위해 네 방향 키를 사용합니다. 뱀이 벽이나 자신의 몸에 부딪히면 게임은 종료됩니다.

게임 구현 단계는 다음과 같습니다:

  • 필요한 모듈 (거북이, 시간, 무작위)을 가져옵니다.
  • 거북이 모듈을 사용하여 게임 화면을 만듭니다.
  • 뱀의 이동 방향을 제어하는 키를 설정합니다.
  • 게임 플레이를 구현합니다.

구현 코드는 `snakegame.py` 파일에 작성합니다.

모듈 가져오기

다음 코드는 파이썬에 내장된 거북이, 시간, 무작위 모듈을 가져옵니다. 또한 플레이어의 초기 점수, 최고 점수, 이동 지연 시간 기본값을 설정합니다. 시간 모듈은 지연 시간 계산에 사용됩니다.

import turtle
import random
import time

player_score = 0
highest_score = 0
delay_time = 0.1

게임 화면 만들기

거북이 모듈을 활용하여 게임 창으로 사용할 가상 캔버스를 만듭니다. 여기에 뱀의 몸과 뱀이 먹을 음식을 그립니다. 또한 플레이어의 점수도 표시합니다.

# 창 화면 생성
wind = turtle.Screen()
wind.title("뱀 미로🐍")
wind.bgcolor("red")

# 화면 크기 설정
wind.setup(width=600, height=600)


# 뱀 생성
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"

# 음식 생성
snake_food = turtle.Turtle()
shapes = random.choice(['triangle','circle'])
snake_food.shape(shapes)
snake_food.color("blue")
snake_food.speed(0)
snake_food.penup()
snake_food.goto(0, 100)

pen = turtle.Turtle()
pen.speed(0)
pen.shape('square')
pen.color('white')
pen.penup()
pen.hideturtle()
pen.goto(0, 250)
pen.write("점수: 0 최고 점수: 0", align="center", font=("Arial", 24, "normal"))
turtle.mainloop()

위 코드는 거북이 화면을 초기화하고, 제목과 배경색을 설정합니다. 화면 크기를 정의한 후 캔버스에 뱀 모양을 그립니다. `penup()` 메소드는 거북이가 이동할 때 선을 그리지 않도록 펜을 올립니다. `goto(x,y)` 메소드는 거북이를 해당 좌표로 이동시킵니다.

다음으로, 뱀이 먹을 음식을 만듭니다. 뱀이 음식을 먹을 때마다 플레이어 점수와 최고 점수를 표시하기 위해 `pen.write()` 메소드를 사용합니다. `hideturtle()` 메소드는 점수 표시를 위해 사용된 거북이 아이콘을 숨깁니다.

코드 마지막에 `turtle.mainloop()`를 추가하면 화면이 유지되어 사용자와 상호작용할 수 있습니다.

파일을 실행하면 다음과 같은 결과가 표시됩니다.

뱀 방향키 설정

이제 화면에서 뱀의 움직임을 제어할 키를 설정합니다. 왼쪽은 'L', 오른쪽은 'R', 위쪽은 'U', 아래쪽은 'D' 키를 사용합니다. 거북이 객체의 방향 기능을 사용하여 방향을 구현합니다.

# 방향 설정
def moveleft():
    if snake.direction != "right":
        snake.direction = "left"

def moveright():
    if snake.direction != "left":
        snake.direction = "right"

def moveup():
    if snake.direction != "down":
        snake.direction = "up"

def movedown():
    if snake.direction != "up":
        snake.direction = "down"

def move():
    if snake.direction == "up":
        coord_y = snake.ycor()
        snake.sety(coord_y+20)

    if snake.direction == "down":
        coord_y = snake.ycor()
        snake.sety(coord_y-20)

    if snake.direction == "right":
        coord_x = snake.xcor()
        snake.setx(coord_x+20)

    if snake.direction == "left":
        coord_x = snake.xcor()
        snake.setx(coord_x-20)

wind.listen()
wind.onkeypress(moveleft, 'L')
wind.onkeypress(moveright, 'R')
wind.onkeypress(moveup, 'U')
wind.onkeypress(movedown, 'D')

위의 `move()` 함수는 뱀을 설정된 좌표 값 내에서 움직이게 합니다.

`listen()` 함수는 사용자가 키를 누르면 뱀을 특정 방향으로 이동시키는 메소드를 호출하는 이벤트 리스너입니다.

뱀 게임 플레이 구현

기본적인 게임 구조가 완성되었으니, 게임을 실시간으로 만들어 보겠습니다.

다음과 같은 기능을 구현합니다:

  • 음식을 먹을 때마다 뱀의 길이가 늘어나고 색깔이 바뀝니다.
  • 음식을 먹을 때마다 플레이어 점수가 증가하고, 최고 점수를 기록합니다.
  • 뱀이 벽이나 자기 몸에 부딪히면 게임이 종료됩니다.
  • 게임이 종료되면 점수는 초기화되고, 최고 점수는 유지됩니다.
segments = []

# 게임 플레이 구현
while True:
    wind.update()
    if snake.xcor() > 290 or snake.xcor() < -290 or snake.ycor() > 290 or snake.ycor() < -290:
        time.sleep(1)
        snake.goto(0, 0)
        snake.direction = "Stop"
        snake.shape("square")
        snake.color("green")

        for segment in segments:
            segment.goto(1000, 1000)
        segments.clear()
        player_score = 0
        delay_time = 0.1
        pen.clear()
        pen.write("점수: {} 최고 점수: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    if snake.distance(snake_food) < 20:
        coord_x = random.randint(-270, 270)
        coord_y = random.randint(-270, 270)
        snake_food.goto(coord_x, coord_y)

        # 몸통 추가
        added_segment = turtle.Turtle()
        added_segment.speed(0)
        added_segment.shape("square")
        added_segment.color("white")
        added_segment.penup()
        segments.append(added_segment)
        delay_time -= 0.001
        player_score += 5

        if player_score > highest_score:
            highest_score = player_score
        pen.clear()
        pen.write("점수: {} 최고 점수: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))


    # 충돌 감지
    for i in range(len(segments)-1, 0, -1):
        coord_x = segments[i-1].xcor()
        coord_y = segments[i-1].ycor()
        segments[i].goto(coord_x, coord_y)

    if len(segments) > 0:
        coord_x = snake.xcor()
        coord_y = snake.ycor()
        segments[0].goto(coord_x, coord_y)
    move()

    for segment in segments:
        if segment.distance(snake) < 20:
            time.sleep(1)
            snake.goto(0, 0)
            snake.direction = "stop"
            snake.color('white')
            snake.shape('square')

        for segment in segments:
            segment.goto(1000, 1000)
            segments.clear()
            player_score = 0
            delay_time = 0.1
            pen.clear()
            pen.write("점수: {} 최고 점수: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))


    time.sleep(delay_time)

turtle.mainloop()

위 코드에서 뱀이 먹을 음식의 위치를 화면 내 무작위로 설정합니다. 뱀이 음식을 먹을 때마다 몸통 길이가 늘어나고 색깔이 바뀝니다 (흰색). 게임이 시작되면 뱀은 녹색으로 표시됩니다.

뱀이 벽에 부딪히거나 자기 몸에 부딪히지 않고 음식을 먹으면, 음식은 화면 크기 내에서 무작위 위치로 재설정됩니다. 음식을 먹을 때마다 플레이어의 점수가 5점씩 증가합니다. 뱀이 충돌하면 플레이어의 점수는 0으로 초기화되고, 화면에는 최고 점수가 유지됩니다.

이제 파이썬 파일을 실행하면 다음과 같은 거북이 화면이 표시됩니다.

결론 🐍

거북이 라이브러리를 사용하는 것은 이 글에서 본 것처럼 간단하고 재미있게 뱀 게임을 만들 수 있는 방법 중 하나입니다. PyGame 라이브러리를 사용하여 동일한 게임을 구현할 수도 있습니다. 여기에서 PyGame 튜토리얼을 확인하여 다양한 게임 구현 방법을 살펴보세요.

파이썬을 사용하여 숫자 맞추기 게임을 만들거나 JSON 데이터 처리 방법을 학습해 볼 수도 있습니다.
코딩을 즐기세요!

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.