Концепция игры «Змейка» возникла в 1976 году и была разработана британской компанией Gremlin Interactive. Считается интересной и умелой игрой. Он популяризируется среди людей на протяжении нескольких поколений.
Змея в игре «Snake» управляется с помощью четырех направлений, и если змееголова ударится о стену или ударится о себя, то змея умрет, и игра закончится со счетом.
Основная цель игрока в игре — набрать как можно больше очков, собирая еду.
Обзор игры «Змейка»
В этом случае мы будем создавать игру Snake на Python, используя следующее:
- Turtle — это предустановленная библиотека Python, которая используется для создания фигур, изображений и игр.
- Time– используется для подсчета количества секунд, прошедших с эпохи.
- Random – этот модуль используется для генерации случайных чисел в Python с использованием модуля случайных чисел.
- penup() — останавливает рисование пера-черепахи.
- speed() — это целое значение в диапазоне от 0 до 10. Итак, 0 — самый быстрый, 10 — быстрый, 6 — нормальный, 3 — медленный и 1 — самый медленный. Если аргумент не указан, возвращает текущую скорость.
- color() — возвращает или устанавливает цвет пера и цвет заливки.
- shape() — устанавливает форму черепахи в соответствии с формой заданного имени.
- ideturtle() — делает черепаху невидимой.
- xcor() – Возвращает координату x черепахи.
- ycor() – Возвращает координату y черепахи.
Пошаговая инструкция
Шаг 1:
Во-первых, мы импортируем все модули в программу и зададим значение по умолчанию для игры.
import turtle import time import random delay = 0.1 score = 0 high_score = 0
Шаг 2:
- Теперь мы создадим ширму окна для игры, а также голову змеи и еду для змеи. Счет будет отображаться в заголовке игры.
- Функция Turtle.Screen() используется для создания окна. В этом коде наше окно предназначено для игры.
- Нам нужно дать окну имя с помощью функции «wn.title(«Змеиная игра»)».
- Чтобы установить цвет фона для окна, мы использовали «wn.bgcolor(‘black’)». Установите высоту и ширину окна с помощью функции «wn.setup(width=X, height=Y)». Здесь ширина=600 и высота=600.
- Функция window.tracer(0) отключает обновления экрана. Так как нам не нужны никакие обновления экрана, кроме табло, поэтому оно установлено в 0.
- Теперь мы создадим змееголову. По сути, это черепаха, которая будет змеей и будет передвигаться.
- Для создания черепахи мы будем использовать «turtle.Turtle()» и присвоим ей имя head. Скорость головы установлена на 0, поскольку мы только инициализируем, и голове не нужно двигаться.
- Давайте инициализируем форму и цвет головы, используя «head.shape(«круг»)» и «head.color(«зеленый»)».
- Функция «head.penup()» гарантирует, что путь, по которому движется змея, не будет нарисован.
- «head.goto(0,0)» используется для того, чтобы положение змеи было в центре окна, а направление остановки мы будем использовать head.direction = «stop».
- А функция «pen.write()» используется для записи текста в текущей позиции черепахи.
- Нам нужен функционал, который увеличивает тело змеи каждый раз, когда она касается еды. Итак, мы использовали для этого массивы. Мы создаем массив под названием «сегменты», который инициализируется пустым.
wn = turtle.Screen() wn.title("Snake Game") wn.bgcolor('black') wn.setup(width=600, height=600) wn.tracer(0) head = turtle.Turtle() head.speed(0) head.shape("circle") head.color("green") head.penup() head.goto(0,0) head.direction = "stop" food = turtle.Turtle() food.speed(0) food.shape("square") food.color("red") food.penup() food.goto(0,100) segments = [] pen = turtle.Turtle() pen.speed(0) pen.shape("square") pen.color("green") pen.penup() pen.hideturtle() pen.goto(0,260) pen.write("Score:0 High score:0", align = "center", font=("Courier", 24, "normal"))
Шаг 3:
- Теперь нам нужно определить функцию для каждого из этих направлений и установить для head.direction значения вверх, вниз, влево и вправо.
- После этого мы продолжим и заставим змею двигаться. Итак, мы определим функцию под названием move().
- Если голова поднимается вверх, координата «y» увеличивается, если голова опускается вниз, координата «y» уменьшается.
- Если голова движется вправо, координата «х» увеличивается, а если голова движется влево, координата «х» уменьшается.
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)
Шаг 4:
- Мы назначим ключ к движениям змеи. Нажимая ключевые слова, мы можем перемещать змею вверх, вниз, влево и вправо.
- Нам нужно, чтобы система прослушивала нажатие управляющей клавиши, поэтому мы добавим функцию wn.listen(), которая прослушивает нажатие клавиши.
- Каждое нажатие клавиши должно быть связано с функцией, выполняющей действие. Мы будем использовать функцию «wn.onkeypress(function, «key»)» для всех четырех. Здесь я использовал «y» для обозначения вверх, «h» для обозначения вниз, «g» для обозначения влево и «j» для обозначения вправо.
- Теперь мы можем управлять движением змеи на экране.
wn.listen() wn.onkeypress(go_up, "y") wn.onkeypress(go_down, "h") wn.onkeypress(go_left, "g") wn.onkeypress(go_right, "j")
Шаг 5:
- Итак, теперь функция ничего не делает, пока ее не вызовут. Нам нужно вызывать функцию каждый раз, когда мы обновляем экран или окно.
- Мы должны быть уверены, что змеи погибнут при столкновении с границей. У нас уже есть координаты границы. Итак, нам просто нужно сбросить положение змееголова, когда он касается координат.
- Кроме того, змее необходимо остановиться и, следовательно, изменить направление, чтобы остановиться.
- Чтобы замедлить движение змеи, нам нужно использовать модуль времени, иначе функция перемещения по умолчанию будет работать очень быстро.
- Итак, мы будем использовать функцию time.sleep(), чтобы уменьшить скорость черепахи.
- Сегмент должен исчезнуть, когда змея умрет.
- Итак, теперь нам нужно задать положение сегментов вне координат окна. Игра перезапускается и, следовательно, очищает список сегментов.
- Нам нужно добавлять сегмент к телу змеи каждый раз, когда она касается еды. Итак, у нас есть условие, проверяющее столкновение головы с пищей.
- Создайте новый_сегмент, определите его скорость, форму и цвет и добавьте его в массив сегментов.
- Теперь добавить сегмент к змееголову недостаточно. Эти сегменты должны двигаться при движении змееголова.
- Переместить последний сегмент, находящийся в позиции x, на x-1, x-1 на x-2 и так далее.
- Змее придется умереть, если она коснется самой себя. Итак, мы проверим, меньше ли расстояние между сегментом и головой 20. Если да, сбросим положение и направление головы.
- Наконец, нам нужно увидеть ситуацию, когда счет увеличивается. Первый – когда голова сталкивается с едой. Увеличьте оценку и обновите high_score.
- Мы использовали функцию pen.write(), чтобы записать счет на экране.
- Нам нужно сбросить счет при столкновении змееголова с границей и собственным хвостом.
- А затем вызовите функцию time.sleep(delay), чтобы уменьшить скорость черепахи.
while True: wn.update() if head.xcor()>290 or head.xcor()290 or head.ycor()<-290: time.sleep(1) head.goto(0,0) head.direction = "stop" for segment in segments: segment.goto(1000,1000) segments.clear() score = 0 delay = 0.1 pen.clear() pen.write("Score: {} High score: {}".format(score, high_score),align="center", font=("Courier", 24, "normal")) if head.distance(food) 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) 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" for segment in segments: segment.goto(1000,1000) segments.clear() score = 0 delay = 0.1 pen.clear() pen.write("Score: {} High score: {}".format(score,high_score), align="center", font=("Courier", 24, "normal")) time.sleep(delay) wn.mainloop()
Полный код игры Snake Game на Python с использованием черепахи:
import turtle import time import random delay = 0.1 score = 0 high_score = 0 wn = turtle.Screen() wn.title("Snake Game") wn.bgcolor('black') wn.setup(width=600, height=600) wn.tracer(0) head = turtle.Turtle() head.speed(0) head.shape("circle") head.color("green") head.penup() head.goto(0,0) head.direction = "stop" food = turtle.Turtle() food.speed(0) food.shape("square") food.color("red") food.penup() food.goto(0,100) segments = [] pen = turtle.Turtle() pen.speed(0) pen.shape("square") pen.color("green") 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) wn.listen() wn.onkeypress(go_up, "y") wn.onkeypress(go_down, "h") wn.onkeypress(go_left, "g") wn.onkeypress(go_right, "j") while True: wn.update() if head.xcor()>290 or head.xcor()290 or head.ycor()<-290: time.sleep(1) head.goto(0,0) head.direction = "stop" for segment in segments: segment.goto(1000,1000) segments.clear() score = 0 delay = 0.1 pen.clear() pen.write("Score: {} High score: {}".format(score, high_score),align="center", font=("Courier", 24, "normal")) if head.distance(food) 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) 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" for segment in segments: segment.goto(1000,1000) segments.clear() score = 0 delay = 0.1 pen.clear() pen.write("Score: {} High score: {}".format(score,high_score), align="center", font=("Courier", 24, "normal")) time.sleep(delay) wn.mainloop()
Выход 1:
Выход 2: