파이썬/파이썬(python) 중급

[24-1 파이썬] 뱀 게임 만들기 4(최고 점수 기록하기)

Olivia-BlackCherry 2022. 9. 3. 08:48

오늘은 업무 자동화의 기본기이기도 한 

파일 저장 기능을 배우는데

예제로 쓸 문제를 만들어보겠다.

 

이전에 만들었던 뱀 게임에 

새로운 변수 high_score를 추가하는 건데,

이전에 했던 게임 결과 중에 최고 점수를 보여주는 것이다.

 

이전과 다른 점은,

게임을 종료한 후에도 기록을 남겨

이전 플레이어의 최고 점수와 나의 점수를 비교할 수 있도록 만든다는 것이다.

 

아래는 유데미에서 다운로드한 최종 코드이다.

 

 

 

최종 영상은 아래와 같다.

 

 

 

1. 점수판에 점수를 기록하고, 뱀을 다시 생성한다.

main.py

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

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

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

screen.listen()
screen.onkey(snake.up, "Up")
screen.onkey(snake.down, "Down")
screen.onkey(snake.left, "Left")
screen.onkey(snake.right, "Right")

game_is_on = True
while game_is_on:
    screen.update()
    time.sleep(0.1)
    snake.move()

    #Detect collision with food.
    if snake.head.distance(food) < 15:
        food.refresh()
        snake.extend()
        scoreboard.increase_score()

    #Detect collision with wall.
    if snake.head.xcor() > 280 or snake.head.xcor() < -280 or snake.head.ycor() > 280 or snake.head.ycor() < -280:
        # 점수판에 점수를 기록하고, 뱀을 다시 생성한다.
        scoreboard.reset()
        snake.reset()

    #Detect collision with tail.
    for segment in snake.segments:
        if segment == snake.head:
            pass
        elif snake.head.distance(segment) < 10:
            # 점수판에 점수를 기록하고, 뱀을 다시 생성한다.
            scoreboard.reset()
            snake.reset()





screen.exitonclick()

 

 

2. game_over 메소드를 지우고, reset을 만든다.

뱀이 reset되어 다시 생성될 때,

기존에 있는 뱀이 화면에 그대로 멈춘 채로 있는데, 

이것을 없애줄 수 있는 방법은 2가지이다.

 

첫 번째로는 해당 뱀을 화면 밖으로 보내서

시야에서 사라지게 하는 것

def reset(self):
    for seg in self.segments:
        seg.goto(1000,1000)

두 번째는 해당 뱀에 hideturtle 메소드를 적용해서 

화면에서 보이지 않도록 하는 것이다.

def reset(self):
    for seg in self.segments:
         seg.hideturtle()

 

snake.py

from turtle import Turtle
STARTING_POSITIONS = [(0, 0), (-20, 0), (-40, 0)]
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 position in STARTING_POSITIONS:
            self.add_segment(position)

    def add_segment(self, position):
        new_segment = Turtle("square")
        new_segment.color("white")
        new_segment.penup()
        new_segment.goto(position)
        self.segments.append(new_segment)

    # game_over 메소드를 지우고, reset을 만든다.
    def reset(self):
        for seg in self.segments:
        #     seg.hideturtle()
            seg.goto(1000,1000)

        self.segments.clear()
        self.create_snake()
        self.head = self.segments[0]

    def extend(self):
        self.add_segment(self.segments[-1].position())

    def move(self):
        for seg_num in range(len(self.segments) - 1, 0, -1):
            new_x = self.segments[seg_num - 1].xcor()
            new_y = self.segments[seg_num - 1].ycor()
            self.segments[seg_num].goto(new_x, new_y)
        self.head.forward(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)

 

 

3. high_score 변수를 생성하고, reset함수를 만든다.

scoreboard.py

from turtle import Turtle
ALIGNMENT = "center"
FONT = ("Courier", 24, "normal")


class Scoreboard(Turtle):

    def __init__(self):
        super().__init__()
        self.score = 0
        self.high_score = 0
        self.color("white")
        self.penup()
        self.goto(0, 270)
        self.hideturtle()
        self.update_scoreboard()

    def update_scoreboard(self):
        self.clear()
        self.write(f"Score: {self.score}  high_score:{self.high_score}", align=ALIGNMENT, font=FONT)


    def reset(self):
        if self.score > self.high_score:
            self.high_score=self.score
        self.score = 0
        self.update_scoreboard()


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

 

 

(그대로 사용)

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):
        random_x = random.randint(-280, 280)
        random_y = random.randint(-280, 280)
        self.goto(random_x, random_y)

 

 

여기까지 기본 세팅이다!

 

위 코드의 문제점은

high_score가 다음 게임에서는 다시 0이 된다는 것이다. 

 

업무 자동화의 기본기이기도 한 

파일 저장 기능을 배워서,

이 문제를 해결해보자!