뱀 게임

Malman Bunzirr·2022년 6월 13일

규칙

  1. 고득점을 목표로 하는 게임이다.
  2. 뱀이 먹이를 먹을 경우 점수를 획득하는 동시에 뱀의 꼬리가 길어진다.
  3. 먹이는 매번 랜덤한 위치에 배치된다.
  4. 사용자는 방향키로 뱀을 움직일 수 있다.
  5. 뱀은 벽이나 자신의 꼬리에 닿으면 사망한다.

코드

# main.py

from turtle import Screen
from snake import Snake
from food import Food
from socreboard import Scoreboard
import time

win = Screen()
win.setup(width=600, height=600)
win.bgcolor("black")
win.title("My Snake Game")
win.tracer(0)

scoreboard = Scoreboard()
food = Food()
snake = Snake()

win.onkeypress(snake.up, "Up")
win.onkeypress(snake.down, "Down")
win.onkeypress(snake.left, "Left")
win.onkeypress(snake.right, "Right")
win.listen()

game = True
while game:
    win.update()
    time.sleep(0.1)
    snake.move()
    x = snake.head.xcor()
    y = snake.head.ycor()
    if snake.head.distance(food) < 15:
        food.refresh()
        scoreboard.increase_score()
        snake.extend()
    for segment in snake.segments[1:]:
        if snake.head.distance(segment) <= 10:
            game = False
            scoreboard.game_over()
    if x >= 290 or x <= -290 or y >= 290 or y <= -290:
        game = False
        scoreboard.game_over()

win.exitonclick()
# snake.py

from turtle import Turtle

MOVE_DISTANCE = 20
UP = 90; DOWN = 270; LEFT = 180; RIGHT = 0

class Snake():
    def __init__(self):
        self.segments = []
        self.create_snake()
        self.head = self.segments[0]
        
    def create_snake(self):
        for _ in range(3):
            self.add_segment((0-20*_, 0))
    
    def add_segment(self, position):
        self.segments.append(Turtle("square"))
        self.segments[-1].color("white")
        self.segments[-1].penup()
        self.segments[-1].goto(position)
   
    def extend(self):
        self.add_segment(self.segments[-1].pos())

    def move(self):
        for segment in range(len(self.segments)-1, 0, -1):
            self.segments[segment].goto(self.segments[segment-1].pos())
        self.head.fd(MOVE_DISTANCE)
    def up(self):
        if(self.head.heading()!=DOWN):
            self.head.setheading(UP)
    def down(self):
        if(self.head.heading()!=UP):
            self.head.setheading(DOWN)
    def left(self):
        if(self.head.heading()!=RIGHT):
            self.head.setheading(LEFT)
    def right(self):
        if(self.head.heading()!=LEFT):
            self.head.setheading(RIGHT)
# food.py

from turtle import Turtle
import random

class Food(Turtle):
    def __init__(self):
        super().__init__()
        self.shape("circle")
        self.penup()
        self.shapesize(stretch_len=0.5, stretch_wid=0.5)
        self.color("blue")
        self.speed("fastest")
        self.refresh()

    def refresh(self):
        self.goto(random.randint(-280, 280), random.randint(-280, 280))
# scoreboard.py

from turtle import Turtle
ALIGNMENT = "center"
FONT = ("Arial", 20, "normal")

class Scoreboard(Turtle):
    def __init__(self):
        super().__init__()
        self.color("white")
        self.hideturtle()
        self.penup()
        self.goto(0, 270)
        self.score = 0
        self.update_scoreboard()
    
    def update_scoreboard(self):
        self.clear()
        self.write(f"Score : {self.score}", align="center", font=FONT)

    def game_over(self):
        self.home()
        self.write(f"GAME OVER", align="center", font=FONT)

    def increase_score(self):
        self.score += 1
        self.update_scoreboard()

실행 결과

0개의 댓글