파이썬, 스네이크 게임 예제
글. 오상문 sualchi@daum.net
유튜브 강좌에 있는 소스를 일부 수정한 예제입니다.
# 스네이크 게임 (Snake Game)
# 출처: Snake Game by @TokyoEdTech
# 수정: 오상문 sualchi@daum.net
import os
import turtle
import time
import random
delay = 0.1
score = 0
high_score = 0
segments = []
wn = turtle.Screen()
wn.title("Snake Game")
wn.bgcolor("green")
wn.setup(width=600, height=600)
wn.tracer(0) # 화면 갱신 중지
# 뱀 머리
head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("black")
head.penup()
head.goto(0,0)
head.direction = "stop"
# 음식
food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("red")
food.penup()
food.goto(0,100)
# 펜
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"
def move():
if head.direction == "up":
y = head.ycor()
head.sety(y + 20)
if head.direction == "down":
y = head.ycor()
head.sety(y - 20)
if head.direction == "left":
x = head.xcor()
head.setx(x - 20)
if head.direction == "right":
x = head.xcor()
head.setx(x + 20)
# 벽이나 자신에게 접촉한 경우 초기화 처리
def reset():
global score, delay
segments.clear()
score = 0
delay = 0.1
pen.clear()
pen.write("Score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))
# 키보드 값을 처리할 메소드 연결
wn.listen()
wn.onkeypress(go_up, "w")
wn.onkeypress(go_down, "s")
wn.onkeypress(go_left, "a")
wn.onkeypress(go_right, "d")
# 게임 처리 부분
while True:
wn.update() # 화면 갱신
# 벽 충돌 검사 처리
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)
# 뱀과 점수 초기화
reset()
# 음식을 먹었는지 검사 처리
if head.distance(food) < 20:
# 음식을 임의 위치에 새로 놓음(옮김)
x = random.randint(-270, 270)
y = random.randint(-270, 270)
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)
# 지연 시간 줄임
delay -= 0.001
# 점수 올리고, 최고 점수보다 높으면 갱신 처리
score += 10
if score > high_score:
high_score = score
pen.clear() # 점수 문자열 부분 지움
pen.write("Score: {} High Score: {}".format(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)
# 0번 몸통을 머리 위치로 이동
if len(segments) > 0:
x = head.xcor()
y = head.ycor()
segments[0].goto(x,y)
# 머리 이동 처리
move()
# 머리가 몸통과 접촉했는지 검사 처리
for segment in segments:
if segment.distance(head) < 20:
time.sleep(1)
head.goto(0,0)
head.direction = "stop"
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# Reset
reset()
time.sleep(delay) # 시간 지연
wn.mainloop()
[참고] 아래 첨부 파일은 과일 일정 수가 넘어가면 속도를 빠르게 수정한 버전인데, 몸통 처리 등에 시간을 뺏겨서인지 큰 차이는 없네요. 수정한 소스 파일이니 참고하세요.
<이상>
'Python 활용' 카테고리의 다른 글
파이썬, PyGame 설치 요약 (Windows) (0) | 2019.10.04 |
---|---|
파이썬, Invaders 게임 프로그래밍 동영상 (0) | 2019.02.08 |
윈도우에서 BeautifulSoup 파이썬 라이브러리 모듈 설치하기 (0) | 2018.09.06 |
파이썬, 입력/출력 인코딩 확인 예제 (0) | 2018.09.03 |
파이썬, 네이버 뉴스 크롤링 (0) | 2018.08.27 |