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

Змеиная игра, способ 2

3 способ прохождения игры

Добавить комментарий