업무에 파이썬 활용할 줄 알기

Day21 | 중급 | 뱀 게임 만들기 2편: 클래스 상속 & 리스트 슬라이싱 본문

Python/[Udemy] 100개의 프로젝트로 Python 개발 완전 정복

Day21 | 중급 | 뱀 게임 만들기 2편: 클래스 상속 & 리스트 슬라이싱

SEO 데이터분석가 2024. 1. 8. 19:07

21일차 목표: 오늘 하루 작업할 것

Inheritance, slicing and finishing the snake game

 

Detect collision with food

Create a scoreboard

Detect collision with wall

Detect collision with tail

클래스 상속

클래스 상속이란? 

새로운 클래스를 만들 때

(다른 어떤)기존 클래스의 속성(attribute)과 메서드(method)를 그대로 사용하는 것

 

클래스 상속하기위한 코드 작성법

 

뱀이 먹이를 먹었는지 알아내기

food.py의 역할

작은 원 화면에 만들기

뱀이 food를 터치할 때마다 food가 랜덤한 위치로 옮겨가기

 

Food class만들때 왜 굳이 Turtle 클래스를 상속하는가?

화면에 보이는 먹이는 터틀 객체인데, 이 객체를 클래스의 속성으로 만들게 되면 아래와 같이 작성하게 될 것이다

그렇지만 이 객체를 클래스의 속성으로 만들지 않고, 상속으로 만들어보자

그러면 이 Food 클래스는 터틀 클래스가 할 수 있는 모든 일을 할 수 있게 된다

food turtle import Turtle

class Food:

	def __init__(self):
    	self.food = Turtle()

 

코드 작성 방법

1. food.py에서 food가 랜덤한 위치에 표시되도록 Food클래스에서 속성 초기화를 작성해준다

2. main.py에서 food 객체를 선언해준다

3. food를 먹었을 때를 감지하고, food가 랜덤한 위치에 다시 위치할 수 있도록 한다 

 

 

점수판을 만들어 점수 기록하기

 

My solution

내가작성한 코드에서 score가 안보였던건 단지 컬러를 "white"로 지정해주지 않았기 때문

 

Angela's solution

scoreboard.py

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


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

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

 

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)

    #food와 snake가 언제 만났고, food를 새로운 랜덤 한 위치에 생성해주라고 어떻게 할것인가?
    #Detect collision with food > distance메서드를 이용
    if snake.head.distance(food) < 15: #distance(food) food의 x, y위치를 반환할 수 있도록 작성해야하는거 아닌가?
        # 우리가 원하는건 food가 새로운 랜덤 위치로 가야한다는 것
        food.refresh()
        scoreboard.increase_score()

        

    snake.move()

 

뱀이 벽에 부딪혔는지 알아내기

TODO 1. 벽에 부딪혔는지 여부

TODO 2. game over 화면에 알려주기

뱀이 자기 꼬리와 부딪혔는지 알아내기

TODO 1.food를 먹을 때마다 새로운 세그먼트를 추가해주기

→ 이 작업을 위해 아래 세개의 함수를 정의해야하는 이유

 

세그먼트추가하는 작업을

초반에 해줘야하는게 있고

음식먹을때 추가해줘야하는게 있음

따라서 세그먼트 추가하는 함수, 초반에 3개 세그먼트 만들기, food먹을 떄마다 꼬리 끝에 추가하는

개의 def문이 만들어지게 됨

 

TODO 2. 꼬리가 세그먼트 중 하나와 부딪혔을 때 게임종료

이렇게만 작성하게되면 게임이 시작하자마자 끝나는 문제가 생긴다

모든 세그먼트들에서 head가 첫번째 세그먼트 이기 떄문에 위 if문의 조건에 바로 충족되어버린다.

따라서 head는 패스하도록 코드를 추가해야한다

 

 

파이썬에서 리스트와 튜플 슬라이싱하기

튜플 슬라이싱 설명

슬라이싱 [a:b]에서 어떻게 a,b를 포함할 수 있는지 설명

piano_keys[2:5] = [c, d, e]

0부터 시작한다고했을 때 2번째에 위치하는 c, 5번째에 위치하는 e

여러가지 표기법

 

Challenge: 슬라이싱으로 표현하기

Challenge

 

My solution (정답)