Turtle 그래픽을 활용한 파이썬 미니 게임 4가지 만들기

안녕하세요! 감코딩입니다

이번 시간에는 Turtle 모듈을 활용하여 재미있는 미니 게임 4가지를 만들어보겠습니다. Turtle은 기본적으로 그림을 그리는 용도로 많이 사용되지만, 이를 활용하면 간단한 게임도 쉽게 만들 수 있습니다. 이번 글에서는 다음과 같은 프로젝트를 다뤄볼 거예요.

  1. 스네이크 게임
  2. 자동차 레이싱 게임
  3. 만다라 패턴 그리기
  4. 클릭 게임

1. Turtle로 스네이크 게임 만들기 🐍

스네이크 게임은 방향키로 조작하며, 먹이를 먹을 때마다 길이가 길어지는 게임입니다.

🔹 구현할 기능

  • 방향키로 뱀 조작하기
  • 먹이를 먹으면 길이 증가
  • 점수 시스템 추가

🔹 코드 예제

import turtle
import time
import random

# 화면 설정
wn = turtle.Screen()
wn.title("스네이크 게임")
wn.bgcolor("black")
wn.setup(width=600, height=600)
wn.tracer(0) # 화면 수동 업데이트

# 뱀 머리
head = turtle.Turtle()
head.shape("square")
head.color("white")
head.penup()
head.goto(0, 0)
head.direction = "stop"

# 먹이
food = turtle.Turtle()
food.shape("circle")
food.color("red")
food.penup()
food.goto(0, 100)

# 뱀 몸통 리스트
segments = []

# 점수
score = 0
high_score = 0

# 점수 표시
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Score: 0 High Score: 0", align="center", font=("Courier", 24, "normal"))

# 키보드 입력 함수
def go_up():
if head.direction != "down":
head.direction = "up"

def go_down():
if head.direction != "up":
head.direction = "down"

def go_left():
if head.direction != "right":
head.direction = "left"

def go_right():
if head.direction != "left":
head.direction = "right"

# 키보드 바인딩
wn.listen()
wn.onkeypress(go_up, "w")
wn.onkeypress(go_down, "s")
wn.onkeypress(go_left, "a")
wn.onkeypress(go_right, "d")

# 뱀 이동
def move():
if head.direction == "up":
head.sety(head.ycor() + 20)
if head.direction == "down":
head.sety(head.ycor() - 20)
if head.direction == "left":
head.setx(head.xcor() - 20)
if head.direction == "right":
head.setx(head.xcor() + 20)

# 메인 게임 루프
while True:
wn.update()

# 먹이와 충돌 체크
if head.distance(food) < 20:
# 먹이 위치 랜덤 이동
x = random.randrange(-290, 290, 20)
y = random.randrange(-290, 290, 20)
food.goto(x, y)

# 새 몸통 추가
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("grey")
new_segment.penup()
segments.append(new_segment)

# 점수 증가
score += 10
if score > high_score:
high_score = score
pen.clear()
pen.write(f"Score: {score} High Score: {high_score}", align="center", font=("Courier", 24, "normal"))

# 몸통 이동
for index in range(len(segments) - 1, 0, -1):
x = segments[index - 1].xcor()
y = segments[index - 1].ycor()
segments[index].goto(x, y)

if len(segments) > 0:
x = head.xcor()
y = head.ycor()
segments[0].goto(x, y)

move()

# 벽 충돌 체크
if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
for segment in segments:
segment.goto(1000, 1000) # 화면 밖으로 이동
segments.clear()
score = 0
pen.clear()
pen.write(f"Score: {score} High Score: {high_score}", align="center", font=("Courier", 24, "normal"))

# 몸통 충돌 체크
for segment in segments:
if segment.distance(head) < 20:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
for segment in segments:
segment.goto(1000, 1000)
segments.clear()
score = 0
pen.clear()
pen.write(f"Score: {score} High Score: {high_score}", align="center", font=("Courier", 24, "normal"))

time.sleep(0.1)

위 코드를 확장하여 먹이를 추가하고 충돌 감지 기능을 넣어주면 더욱 완성도 높은 게임이 됩니다!


2. Turtle로 자동차 레이싱 게임 만들기 🚗

레이싱 게임에서는 여러 개의 자동차(거북이)를 랜덤한 속도로 이동시키면서 누가 먼저 결승선을 통과하는지 확인하는 방식으로 진행됩니다.

🔹 구현할 기능

  • 여러 개의 자동차(거북이) 생성
  • 랜덤한 속도로 움직이기
  • 결승선 통과 확인

🔹 코드 예제

import turtle
import random
import time

# 창 설정
turtle.setup(width=500, height=400)
screen = turtle.Screen()
screen.title("거북이 레이싱 게임")

# 결승선 그리기
finish_line = 200 # 결승선 x 좌표
pen = turtle.Turtle()
pen.speed(0)
pen.penup()
pen.goto(finish_line, 150)
pen.pendown()
pen.goto(finish_line, -150)
pen.hideturtle()

# 자동차(거북이) 생성
colors = ["red", "blue", "green", "yellow", "purple"]
racers = []

for i in range(5):
racer = turtle.Turtle()
racer.shape("turtle")
racer.color(colors[i])
racer.penup()
racer.goto(-200, 100 - (i * 50)) # 시작 위치 설정
racers.append(racer)

# 우승자 발표용 펜
winner_pen = turtle.Turtle()
winner_pen.hideturtle()
winner_pen.penup()
winner_pen.goto(0, 160)
winner_pen.color("black")

# 레이싱 시작
winner = None
while True:
for racer in racers:
# 랜덤한 속도로 이동
racer.forward(random.randint(1, 5))

# 결승선에 도달했는지 체크
if racer.xcor() >= finish_line:
winner = racer.color()[0] # 우승 거북이의 색상
break

# 우승자가 결정되면 루프 종료
if winner:
break

screen.update() # 화면 갱신
time.sleep(0.01) # 속도 조절

# 우승자 발표
winner_pen.write(f"우승자: {winner} 거북이!", align="center", font=("Arial", 20, "bold"))

# 창 유지
screen.mainloop()

자동차의 속도를 랜덤하게 설정하여 매번 다른 결과가 나오도록 할 수 있습니다!


3. Turtle로 만다라 패턴 그리기 🎨

Turtle의 반복문을 활용하면 아름다운 대칭적인 패턴을 쉽게 만들 수 있습니다.

🔹 구현할 기능

  • 반복문을 활용한 대칭 패턴 그리기
  • 다양한 색상 적용
  • 랜덤 패턴 생성 기능 추가

🔹 코드 예제

import turtle
import random

# 설정
t = turtle.Turtle()
t.speed(0)
colors = ["red", "blue", "green", "yellow", "purple", "orange"]

# 패턴 그리기
for i in range(36):
t.color(random.choice(colors))
t.circle(100)
t.left(10)

이 코드를 실행하면 마치 예술 작품처럼 보이는 멋진 패턴이 완성됩니다!


4. Turtle로 클릭 게임 만들기 🖱

마우스로 특정 지점을 클릭하면 점수가 올라가는 간단한 게임을 만들어볼 수 있습니다.

🔹 구현할 기능

  • 마우스 클릭 감지
  • 점수 시스템 추가
  • 제한 시간 내 최대한 높은 점수 획득

🔹 코드 예제

import turtle
import random

# 설정
screen = turtle.Screen()
screen.title("클릭 게임")
screen.setup(width=600, height=400)

# 점수 변수 및 표시
score = 0
score_pen = turtle.Turtle()
score_pen.hideturtle()
score_pen.penup()
score_pen.goto(0, 170)
score_pen.write(f"점수: {score}", align="center", font=("Arial", 20, "normal"))

# 클릭 대상 (타겟) 생성
target = turtle.Turtle()
target.shape("circle")
target.color("red")
target.penup()
target.speed(0)
target.goto(random.randint(-280, 280), random.randint(-180, 180))

# 클릭 이벤트 함수
def click(x, y):
global score
# 타겟을 클릭했는지 체크
if target.distance(x, y) < 20: # 타겟 반지름 내 클릭 시
score += 1
score_pen.clear()
score_pen.write(f"점수: {score}", align="center", font=("Arial", 20, "normal"))
# 타겟을 랜덤 위치로 이동
target.goto(random.randint(-280, 280), random.randint(-180, 180))

# 화면 클릭 이벤트 연결
screen.onclick(click)
screen.listen() # 이벤트 감지 활성화

# 게임 루프
screen.mainloop()

위 코드를 확장하여 제한 시간 기능을 추가하면 더욱 재미있는 게임이 됩니다!


마무리

이번 글에서는 Turtle을 활용하여 4가지 미니 게임을 만들어보았습니다. Turtle은 간단한 게임을 만들기에도 유용한 모듈이니, 직접 실습하면서 원하는 기능을 추가해 보세요!

📌 다음에도 유익한 파이썬 강좌로 찾아오겠습니다! 😊

One comment

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다