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

[20-3 파이썬] 뱀 게임 만들기 3(이벤트리스너 listen(), onkey(), onclick())

Olivia-BlackCherry 2022. 8. 28. 14:05

오늘은 이벤트 리스너에 대해 배운다. 

 

이제부터 플레이어와 컴퓨터가 함께 협업한다!

즉, 

플레이어가 키보드이던, 마우스이던 어떤 신호를 주면

컴퓨터가 이를 확인하고 반응하는 형태의 프로그램을 짜보는 것이다. 

 

그러려면, 플레이어가 신호를 줄 때 컴퓨터가 확인하는 수단이 필요한데

 

그것이 바로 이벤트리스너이다. 

터틀에서 메소드는 listen()이다.

먼저 컴퓨터는 귀를 열고, 플레이어가 하는 말을 듣는다.

 

그리고 나면 플레이어는 다양한 메소드를 활용해서 신호를 준다.

 

onclick(fun, btn) 

onclick의 argument는 아래와 같다.

fun: 신호를 받았을 때 하는 행동이다.

btn :마우스로 신호를 준다는 뜻이다. 기본값은 마우스 왼쪽 버튼이다.

 

onkey(fun, key)

onkey의 argument는 아래와 같다.

fun: 신호를 받았을 때 하는 행동이다. 주의할 점은 이 함수는 인자가 없어야 한다!!!

key: 키보드 key이다. Up, Down, Left, Right, S, W, A, D 등

 

listen()과 onkey()를 활용하여 이번 미션을 해결해보자.

 

이번 미션은

1.이벤트리스너 사용하기
2. 키보드 방향키로 뱀이 움직이는 방향 조절하기
3. 반대방향으로 바로 가지는 못한다.
- 위에서 바로 아래로 갈 수 없고, 아래에서 바로 위로 갈 수 없다.
- 왼쪽에서 바로 오른쪽으로 갈 수 없고, 오른쪽에서 바로 왼쪽으로 갈 수 없다.

 

 

 

 

 

스스로 과제를 해결해보자!!!!




 

<최종코드>

1. main.py

from turtle import Turtle, Screen
from snake import Snake
import time

color_list = ["yellow", "red", "blue"]
screen = Screen()
screen.setup(height=600, width=600)
screen.bgcolor("black")
screen.title("Snake Game")
screen.tracer(0)


real_snake = Snake()

keep_going =True

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

while keep_going:
    screen.update()
    time.sleep(0.1)

    real_snake.move_snake()



screen.exitonclick()

 

2. snake.py

from turtle import Turtle
POSITIONS = [(0, 0), (-20, 0), (-40, 0)]
MOVE_DISTANCE = 20
UP = 90
DOWN = 270
RIGHT = 0
LEFT = 180

class Snake:  #Snake 클래스를 만들 때마다, 이닛함수에 있는 snakes와 create_snake, head가 만들어진다.
    def __init__(self):
        self.snakes = []
        self.create_snake()
        self.head = self.snakes[0]

    def create_snake(self):
        # 상수 이름은 모두 대문자로 쓴다.
        for position in POSITIONS:
            snake = Turtle(shape="square")
            snake.color("white")
            snake.penup()
            snake.goto(position)
            self.snakes.append(snake)
    def move_snake(self):
            for index in range(len(self.snakes)-1, 0, -1): #start=2,stop=1, step=-1
                x = self.snakes[index-1].xcor()
                y = self.snakes[index-1].ycor()
                self.snakes[index].goto(x, y)
            self.snakes[0].forward(MOVE_DISTANCE)

    def up(self):
        if self.head.heading() != DOWN:
            self.snakes[0].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)