Концепция игры «Змейка» возникла в 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:

