Как сделать из змейки: Какие фигуры можно сделать из «Змейки»

Содержание

делаем игру «Змейка» на Python

Инструкции

Помните аркадную игру «Змейка», в которую когда-то играли на неубиваемой нокии? Оказывается, что написать классическую «змейку» сможет каждый новичок. О том, как сделать змейку на Python и накормить ее яблоками, расскажет Настя Мартынова — веб-писатель REG.RU.

Змейка (Snake) — это игра, созданная Танели Арманто в 1997 году специально для телефона Nokia. Змейка стала переломным моментом в развитии мобильного гейминга и завоевала сердца миллионов людей. Несмотря на свою примитивность, даже спустя 25 лет эта игра остается популярной. 

Хоть Танели Арманто и считается создателем змейки, идея игры ему не принадлежит. Первый вариант змейки появился аж в 1976 году и назывался Blockade. После были созданы десятки клонов этой игры с разными названиями. Арманто при создании игры вдохновился одним из таких клонов, который был установлен на его Apple Macintosh. А мы вдохновились Танели Арманто и решили рассказать, как сделать игру змейка самостоятельно! С этим справятся даже те, кто только недавно начал изучать программирование.

Для создания змейки можно использовать разные языки программирования. Мы будем использовать… питон 🐍!  Язык программирования Python универсален: он подходит как для решения повседневных задач, так и для создания простых игр. 

Змейку на Python можно написать несколькими способами. Первый — при помощи библиотеки Python PyGame, которую используют для создания игр. Второй — с помощью встроенной библиотеки Turtle. В статье мы опишем второй способ. 

Помимо Turtle, мы будем использовать два других модуля:

  1. Time — для добавления задержки в выполнении программы.
  2. Random — для генерации случайного числа/цвета/формы.

Какие инструменты нам понадобятся:

  • редактор исходного кода на ваш выбор. Можно воспользоваться редактором VSCode или средой разработки PyCharm;
  • установленный Python 3.

Как работает игра «Змейка»

Игрок управляет змейкой при помощи кнопок направления — вверх, вниз, влево, вправо. Ползая, змейка должна собирать еду, за которую начисляются очки. Цель игры — набрать как можно больше очков. Игра заканчивается, если змейка врезается в стену или в себя.

Для написания игры мы проделаем следующие шаги:

  • импортируем модули в программу,
  • создадим экран игры с помощью модуля Turtle,
  • зададим кнопки направления движения змеи,
  • реализуем игровой процесс.

Прежде всего создайте файл snakegame.py в вашем редакторе кода. А затем приступайте к созданию змейки по нашей инструкции. 👇

Импортируем модули

В этой части кода мы импортируем 3 модуля — turtle, time и random. Помимо этого, мы зададим значения по умолчанию: 

  • начальный счет — score, 
  • наибольший счет — high score,  
  • время задержки — delay.

Добавим в Python строки кода:

import turtle import time import random score = 0 high_score = 0 delay = 0.1

1

2

3

4

5

6

7

import turtle

import time

import random

score = 0

high_score = 0

delay = 0. 1

Создаем экран игры

Теперь создадим экран игры — укажем размер экрана, цвет фона и название программы. В функции wind.tracer установим значение задержки обновления экрана.

# Creating a window screen wind = turtle.Screen() wind.title(«Snake Maze») wind.bgcolor(«green») # the width and height can be put as user’s choice wind.setup(width=600, height=600) wind.tracer(0)

1

2

3

4

5

6

7

8

# Creating a window screen

wind = turtle.Screen()

wind.title(«Snake Maze»)

wind.bgcolor(«green»)

# the width and height can be put as user’s choice

wind.setup(width=600, height=600)

wind.tracer(0)

После создадим змею. Метод penup() тут нужен для того, чтоб змейка не рисовала линию при движении, а goto(x,y) задает координаты, которые перемещают змею в абсолютное положение.

# head of the snake head = turtle.Turtle() head.shape(«square») head.color(«white») head.penup() head.goto(0, 0) head.direction = «Stop»

1

2

3

4

5

6

7

# head of the snake

head = turtle.Turtle()

head.shape(«square»)

head.color(«white»)

head.penup()

head.goto(0, 0)

head.direction = «Stop»

Также добавим еду и счетчик, который будет отображать текущий и рекордный счет. 

# food in the game food = turtle.Turtle() colors = random.choice([‘red’, ‘green’, ‘black’]) shapes = random.choice([‘square’, ‘triangle’, ‘circle’]) food.speed(0) food.shape(shapes) food.color(colors) food.penup() food.goto(0, 100) pen = turtle.Turtle() pen.speed(0) pen.shape(«square») pen.color(«white») pen.penup() pen.hideturtle() pen.goto(0, 250) pen.write(«Score : 0 High Score : 0″, align=»center», font=(«Arial», 24, «bold»))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# food in the game

food = turtle. Turtle()

colors = random.choice([‘red’, ‘green’, ‘black’])

shapes = random.choice([‘square’, ‘triangle’, ‘circle’])

food.speed(0)

food.shape(shapes)

food.color(colors)

food.penup()

food.goto(0, 100)

pen = turtle.Turtle()

pen.speed(0)

pen.shape(«square»)

pen.color(«white»)

pen.penup()

pen.hideturtle()

pen.goto(0, 250)

pen.write(«Score : 0  High Score : 0″, align=»center»,

font=(«Arial», 24, «bold»))

Если запустить программу сейчас, то окно будет выглядеть так:

Задаем кнопки направления движения змеи

Тут мы зададим клавиши направления, при нажатии на которые змейка будет двигаться. В нашем случае кнопки будут следующими: «W» — вверх, «A» — влево, «S» — вниз, «D» — вправо.

# assigning key directions def group(): if head.direction != «dowind»: head.direction = «up» def godowind(): if head.direction != «up»: head.direction = «dowind» def goleft(): if head. direction != «right»: head.direction = «left» def goright(): if head.direction != «left»: head.direction = «right» def move(): if head.direction == «up»: y = head.ycor() head.sety(y+20) if head.direction == «dowind»: 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) wind.listen() wind.onkeypress(group, «w») wind.onkeypress(godowind, «s») wind.onkeypress(goleft, «a») wind.onkeypress(goright, «d»)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

# assigning key directions

def group():

    if head. direction != «dowind»:

        head.direction = «up»

def godowind():

    if head.direction != «up»:

        head.direction = «dowind»

 

def goleft():

    if head.direction != «right»:

        head.direction = «left»

def goright():

    if head.direction != «left»:

        head.direction = «right»

 

def move():

    if head.direction == «up»:

        y = head.ycor()

        head.sety(y+20)

    if head.direction == «dowind»:

        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)

wind.listen()

wind.onkeypress(group, «w»)

wind.onkeypress(godowind, «s»)

wind.onkeypress(goleft, «a»)

wind.onkeypress(goright, «d»)

Реализуем игровой процесс

Теперь нам нужно реализовать геймплей. Он включает в себя следующие пункты:

  1. Длина змейки увеличивается каждый раз, когда она собирает еду. При этом хвост и голова змейки должны отличаться по цвету. 
  2. Счет увеличивается каждый раз, когда змея подбирает еду. Наибольший результат записывается.
  3. Должна быть добавлена проверка на столкновение головы змейки с телом или стеной.
  4. Цвет и форма еды должны меняться при каждом перезапуске игры.
  5. Игра начинается заново, если змея столкнулась с собой или стеной.
  6. В случае столкновения счетчик обнуляется, наибольший результат сохраняется до перезапуска.

Добавим оставшуюся часть нашего Python-кода:

segments = [] # Main Gameplay while True: wind.update() if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290: time.sleep(1) head.goto(0, 0) head.direction = «Stop» colors = random.choice([‘red’, ‘blue’, ‘green’]) shapes = random.choice([‘square’, ‘circle’]) 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=(«Arial», 24, «bold»)) if head.distance(food) < 20: x = random.randint(-270, 270) y = random.randint(-270, 270) food.goto(x, y) # Adding segment new_segment = turtle.Turtle() new_segment.speed(0) new_segment.shape(«square») new_segment.color(«orange») # tail colour new_segment.penup() segments.append(new_segment) delay -= 0.001 score += 10 if score > high_score: high_score = score pen.clear() pen.write(«Score : {} High Score : {} «.format( score, high_score), align=»center», font=(«Arial», 24, «bold»)) # Checking for head collisions with body segments 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» colors = random.choice([‘red’, ‘blue’, ‘green’]) shapes = random.choice([‘square’, ‘circle’]) for segment in segments: segment.goto(1000, 1000) segment.clear() score = 0 delay = 0.1 pen.clear() pen.write(«Score : {} High Score : {} «.format( score, high_score), align=»center», font=(«Arial», 24, «bold»)) time.sleep(delay) wind.mainloop()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

segments = []

 

# Main Gameplay

while True:

    wind. update()

    if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:

        time.sleep(1)

        head.goto(0, 0)

        head.direction = «Stop»

        colors = random.choice([‘red’, ‘blue’, ‘green’])

        shapes = random.choice([‘square’, ‘circle’])

        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=(«Arial», 24, «bold»))

    if head.distance(food) < 20:

        x = random.randint(-270, 270)

        y = random.randint(-270, 270)

        food.goto(x, y)

        # Adding segment

        new_segment = turtle.Turtle()

        new_segment.speed(0)

        new_segment.shape(«square»)

        new_segment. color(«orange»)  # tail colour

        new_segment.penup()

        segments.append(new_segment)

        delay -= 0.001

        score += 10

        if score > high_score:

            high_score = score

        pen.clear()

        pen.write(«Score : {} High Score : {} «.format(

            score, high_score), align=»center», font=(«Arial», 24, «bold»))

    # Checking for head collisions with body segments

    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»

            colors = random. choice([‘red’, ‘blue’, ‘green’])

            shapes = random.choice([‘square’, ‘circle’])

            for segment in segments:

                segment.goto(1000, 1000)

            segment.clear()

            score = 0

            delay = 0.1

            pen.clear()

            pen.write(«Score : {} High Score : {} «.format(

                score, high_score), align=»center», font=(«Arial», 24, «bold»))

    time.sleep(delay)

wind.mainloop()

Важно добавить функцию wind.mainloop() в конце, иначе окно будет закрываться сразу после запуска.

В этом фрагменте кода мы устанавливаем случайную позицию для еды на экране. Каждый раз, когда змея собирает пищу, ее тело увеличивается. Тело по цвету отличается от головы, в нашем случае оно будет оранжевым.

После того как змея соберет еду, еда появится в случайном месте в пределах 270 координат. Каждый раз, когда змея подбирает еду, счет игрока увеличивается на 10. Когда змея сталкивается с хвостом или стеной, счет игрока обнуляется, на экране сохраняется наибольший счет.

Теперь наша змейка на Python готова. 

⌘⌘⌘

Надеемся, вам было весело создавать игру и программировать на Python вместе с нами.

А какой рекорд в змейке поставили вы? Поделитесь в комментариях!

Подписаться на рассылку по блогу

Анастасия Мартынова

58

  • Инструкции
  • Онлайн-бизнес

3 ноября, 2022

Ноябрь — прекрасное время не только для тыквенных пирогов и облепихового чая, но и для запуска сайтов. Пока ваши клиенты…

Read More

  • Хостинг

1 ноября, 2022

В статье мы расскажем о том, что такое Python и как выбрать хостинг для проектов на этом языке. (далее…)

Read More

  • IT-сиеста

28 октября, 2022

За последнее десятилетие чат-боты незаметно влились в нашу жизнь и стали ее неотъемлемой частью. Siri поможет найти ответ на любой…

Read More

  • Домены

25 октября, 2022

Скоро Хэллоуин, и мы не смогли остаться в стороне от этого жуткого праздника. Ведь этот день идеально подходит для того,…

Read More

20 октября, 2022

Ссылочное продвижение — линкбилдинг — эффективный и популярный метод вывода сайтов в топ поисковой выдачи Яндекс и Google. Оно позволяет…

Read More

  • Лайфхаки
  • Онлайн-бизнес
  • Продуктивность

19 октября, 2022

На сегодняшний день в России насчитывается более 21 тысячи отелей разной звездности. Чтобы выдержать такую конкуренцию, нужна реклама. И чем…

Read More

  • Инструкции
  • Онлайн-бизнес

18 октября, 2022

Автоматизация бизнес-процессов помогает развиваться и получать больше прибыли не только крупным корпорациям, но и малому бизнесу. В статье мы расскажем,…

Read More

  • Лайфхаки

14 октября, 2022

Цветовая палитра — один из важнейших элементов любого сайта, ведь от правильно подобранных цветов зависит то, как его будут воспринимать…

Read More

  • Онлайн-бизнес
  • Продуктивность

11 октября, 2022

В статье мы расскажем про онбординг: что это такое, как его провести и какие инструменты для этого задействовать. (далее…)

Read More

  • IT-сиеста
  • Продуктивность

6 октября, 2022

Согласно исследованиям, к 2026 году четверть людей станет проводить в метавселенной не меньше часа в день. В сегодняшней статье разберемся,…

Read More

Змейка на Python

Я точно знаю, что в детстве вы все играли в игру «Змейка» и, конечно, всегда хотели выиграть. Будучи детьми, мы все любили искать баги в игре, чтобы никогда не видеть сообщение Game over, но сейчас, будучи технарями, нам наверняка хочется сделать игру так, чтобы комар носа не подточил. Именно об этом и пойдет речь в нашей статье.

Перед тем как двигаться дальше, давайте посмотрим на основные разделы нашей статьи:

  1. Установка Pygame.
  2. Создание экрана.
  3. Создание змейки.
  4. Движение змейки.
  5. «Game over» при достижении змейкой границы.
  6. Добавление еды.
  7. Увеличение длины змейки.
  8. Вывод счета на экран.

Установка Pygame

Первое, что нам надо сделать, это установить библиотеку Pygame. Это можно сделать, просто выполнив следующую команду:

pip install pygame

Выполнив это, просто импортируем эту библиотеку и приступим к разработке игры. Но перед этим давайте взглянем на основные функции данной библиотеки, которые мы будем использовать при создании игры.

ФункцияОписание

init()

Инициализирует все модули Pygame (возвращает кортеж в случае успеха или неудачи).

display.set_mode()

Для создания поверхности принимает в качестве параметра либо список либо кортеж (кортеж предпочтительней).

update()

Обновляет экран.

quit()

Используется для деинициализации всех модулей.

set_caption()

Устанавливает текст заголовка в верхней части экрана

event.get()

Возвращает список всех событий.

Surface.fill()

Заполняет пространство сплошным цветом.

time.Clock()

Отслеживание времени

font. SysFont()

Задает шрифт Pygame, используя системные ресурсы.

Создание экрана

Для создания экрана при помощи Pygame нужно воспользоваться функцией display.set_mode(). Также необходимо пользоваться методом init() для инициализации экрана в начале кода и методом quit() для его закрытия в конце. Метод update() используется для применения каких-либо изменений на экране. Еще существует метод flip(), который работает похожим с update() образом. Разница заключается лишь в том, что метод flip() переписывает весь экран целиком, а метод update() применяет именно изменения (хотя если его использовать без параметров, то он тоже переписывает весь экран) .

import pygame
pygame. init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.quit()
quit()

Результат:

Однако, когда вы запустите данный код, экран появится лишь на мгновение, а затем исчезнет. Чтобы исправить эту ошибку, мы воспользуемся циклом while, который будет работать до окончания игры:

import pygame
pygame.init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.display.set_caption('Snake game by Pythonist')
game_over=False
while not game_over:
    for event in pygame.event.get():
        print(event)   # выводит на экран все действия игры
 
pygame.quit()
quit()

Теперь, запустив этот код, вы увидите, что экран не пропадает, как раньше. На нем будут отображаться все действия игры. Мы этого добились благодаря функции event. get(). Также, при помощи функции display.set_caption(), мы вывели заголовок нашего экрана — ‘Snake game by Pythonist’.

Теперь у нас есть экран для игры, но когда вы кликнете по кнопке close, экран не закроется. Это потому, что мы не предусмотрели такого поведения. Для решения этой задачи в Pygame предусмотрено событие «QIUT», которое мы используем слеудющим образом:

import pygame
pygame.init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.display.set_caption('Snake game by Edureka')
game_over=False
while not game_over:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            game_over=True
 
pygame.quit()
quit()

Теперь, когда наш экран полностью подготовлен, нам предстоит нарисовать на нем змейку. Этому посвящен следующий раздел.

Английский для программистов

Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас

Скачать

×

Создание змейки

Перед тем как создать змейку, мы инициируем несколько цветовых переменных для раскрашивания самой змейки, еды и экрана. В Pygame используется цветовая схема RGB (RED, GREEN, BLUE). Установка всех цветов в 0 соответствует черному цвету, а в 255 — соответственно, белому.

Фактически, наша змейка является прямоугольником. Чтобы нарисовать прямоугольник в Pygame, можно воспользоваться функцией draw.rect(), которая нарисует нам прямоугольник заданного цвета и размера.

import pygame
pygame. init()
dis=pygame.display.set_mode((400,300))
 
pygame.display.set_caption('Snake game by Pythonist')
 
blue=(0,0,255)
red=(255,0,0)
 
game_over=False
while not game_over:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            game_over=True
    pygame.draw.rect(dis,blue,[200,150,10,10])
    pygame.display.update()
pygame.quit()
quit()

Результат:

Как можно увидеть, змейка создана в виде голубого прямоугольника. Теперь нам нужно научить ее двигаться.

Движение змейки

Чтобы передвигать змейку, мы будем использовать ключевые события из класса KEYDOWN библиотеки Pygame. События K_UP, K_DOWN, K_LEFT, и K_RIGHT заставят змейку двигаться вверх, вниз, влево и вправо соответственно. Также, цвет дисплея меняется от черного (по умолчанию) до белого при помощи метода fill().

Для сохранения изменений координат x и y мы создали две новых переменные: x1_change и y1_change.

import pygame
 
pygame.init()
 
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
 
dis = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Snake game by Pythonist')
 
game_over = False
 
x1 = 300
y1 = 300
 
x1_change = 0       
y1_change = 0
 
clock = pygame.time.Clock()
 
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x1_change = -10
                y1_change = 0
            elif event.key == pygame.K_RIGHT:
                x1_change = 10
                y1_change = 0
            elif event.key == pygame.K_UP:
                y1_change = -10
                x1_change = 0
            elif event. key == pygame.K_DOWN:
                y1_change = 10
                x1_change = 0
 
    x1 += x1_change
    y1 += y1_change
    dis.fill(white)
    pygame.draw.rect(dis, black, [x1, y1, 10, 10])
 
    pygame.display.update()
 
    clock.tick(30)
 
pygame.quit()
quit()

Результат:

«Game over» при достижении змейкой границы

В игре змейка игрок проигрывает, если касается границы экрана. Чтобы задать такое поведение, мы должны использовать инструкцию if, которая будет следить за тем, чтобы координаты x и y были меньше размеров экрана. Мы будем использовать для этого переменные, чтобы вы могли потом, при случае, легко внести какие-либо изменения в игру.

import pygame
import time
pygame.init()
 
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
 
dis_width = 800
dis_height  = 600
dis = pygame. display.set_mode((dis_width, dis_width))
pygame.display.set_caption('Snake game by Pythonist')
 
game_over = False
 
x1 = dis_width/2
y1 = dis_height/2
 
snake_block=10
 
x1_change = 0
y1_change = 0
 
clock = pygame.time.Clock()
snake_speed=30
 
font_style = pygame.font.SysFont(None, 50)
 
def message(msg,color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width/2, dis_height/2])
 
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x1_change = -snake_block
                y1_change = 0
            elif event.key == pygame.K_RIGHT:
                x1_change = snake_block
                y1_change = 0
            elif event.key == pygame.K_UP:
                y1_change = -snake_block
                x1_change = 0
            elif event.key == pygame.K_DOWN:
                y1_change = snake_block
                x1_change = 0
 
    if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
        game_over = True
 
    x1 += x1_change
    y1 += y1_change
    dis. fill(white)
    pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
 
    pygame.display.update()
 
    clock.tick(snake_speed)
 
message("You lost",red)
pygame.display.update()
time.sleep(2)
 
pygame.quit()
quit()

Результат:

Добавление еды

Теперь мы добавим немного еды для змейки, и когда она будет ее пересекать, мы будем выводить сообщение «Yummy!!”. Помимо этого, мы внесем небольшие изменения, которые дадут возможность игроку прекращать игру, а также начинать ее заново в случае поражения.

import pygame
import time
import random
 
pygame.init()
 
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
 
dis_width = 800
dis_height = 600
 
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Edureka')
 
clock = pygame. time.Clock()
 
snake_block = 10
snake_speed = 30
 
font_style = pygame.font.SysFont(None, 30)
 
 
def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width/3, dis_height/3])
 
 
def gameLoop():  # creating a function
    game_over = False
    game_close = False
 
    x1 = dis_width / 2
    y1 = dis_height / 2
 
    x1_change = 0
    y1_change = 0
 
    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
 
    while not game_over:
 
        while game_close == True:
            dis.fill(white)
            message("You Lost! Press Q-Quit or C-Play Again", red)
            pygame.display.update()
 
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event. key == pygame.K_c:
                        gameLoop()
 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0
 
        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
 
        x1 += x1_change
        y1 += y1_change
        dis.fill(white)
        pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])
        pygame. draw.rect(dis, black, [x1, y1, snake_block, snake_block])
        pygame.display.update()
 
        if x1 == foodx and y1 == foody:
            print("Yummy!!")
        clock.tick(snake_speed)
 
    pygame.quit()
    quit()
 
 
gameLoop()

Результат:

Terminal:

Увеличение длины змейки

Следующий код будет увеличивать длину змейки после поглощения ею еды. Также, если змейка сталкивается с собственным хвостом, игра заканчивается и выводится сообщение: “You Lost! Press Q-Quit or C-Play Again“. Длина змейки хранится в списке, а базовые значения заданы в следующем коде.

import pygame
import time
import random
 
pygame.init()
 
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
 
dis_width = 600
dis_height = 400
 
dis = pygame. display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Pythonist')
 
clock = pygame.time.Clock()
 
snake_block = 10
snake_speed = 15
 
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)
 
def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
 
 
def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])
 
 
def gameLoop():
    game_over = False
    game_close = False
 
    x1 = dis_width / 2
    y1 = dis_height / 2
 
    x1_change = 0
    y1_change = 0
 
    snake_List = []
    Length_of_snake = 1
 
    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
 
    while not game_over:
 
        while game_close == True:
            dis.fill(blue)
            message("You Lost! Press C-Play Again or Q-Quit", red)
 
            pygame. display.update()
 
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        gameLoop()
 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0
 
        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        dis. fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]
 
        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True
 
        our_snake(snake_block, snake_List)
 
 
        pygame.display.update()
 
        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1
 
        clock.tick(snake_speed)
 
    pygame.quit()
    quit()
 
 
gameLoop() 

Результат:

Вывод счета на экран

И последнее, но весьма важное дело: вам нужно отображать счет игрока. Для этого мы создали функцию Your_score. Это функция будет показывать размер змейки за вычетом 1 (так как это начальный размер змейки).

import pygame
import time
import random
 
pygame.init()
 
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
 
dis_width = 600
dis_height = 400
 
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Pythonist')
 
clock = pygame.time.Clock()
 
snake_block = 10
snake_speed = 15
 
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)
 
 
def Your_score(score):
    value = score_font.render("Your Score: " + str(score), True, yellow)
    dis.blit(value, [0, 0])
 
 
 
def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
 
 
def message(msg, color):
    mesg = font_style. render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])
 
 
def gameLoop():
    game_over = False
    game_close = False
 
    x1 = dis_width / 2
    y1 = dis_height / 2
 
    x1_change = 0
    y1_change = 0
 
    snake_List = []
    Length_of_snake = 1
 
    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
 
    while not game_over:
 
        while game_close == True:
            dis.fill(blue)
            message("You Lost! Press C-Play Again or Q-Quit", red)
            Your_score(Length_of_snake - 1)
            pygame.display.update()
 
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        gameLoop()
 
        for event in pygame. event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0
 
        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        dis.fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List. append(snake_Head)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]
 
        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True
 
        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)
 
        pygame.display.update()
 
        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1
 
        clock.tick(snake_speed)
 
    pygame.quit()
    quit()
 
 
gameLoop()

Результат:

Вот мы и дошли до конца нашей статьи. Мы надеемся, что она вам понравилась и все было понятно. Самое главное, не забывайте как можно больше практиковаться и использовать ваши знания на практике.

Английский для программистов

Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас

Скачать

×

Как сделать игру Snake Eats Apple на нулях

Автор: Райан | 15 июля 2022 г., 16:07

Snake — ​​это классическая игра, в которой игрок будет управлять маленькой змейкой, используя клавиши со стрелками. Когда змея съедает коллекционный предмет на карте, она увеличивается в длину.

Весело, правда? Давайте посмотрим, как легко создать Snake в Scratch.

Создание спрайтов

Для игры Snake необходимо создать два спрайта Scratch. Один — это спрайт змеи, а другой — предмет, за которым будет гоняться змея. В этом случае этим коллекционным предметом будет яблоко. Для создания спрайтов можно использовать Scratch Paint.

Создание змеи

Змея фактически будет разделена на два спрайта: голову и тело. Тело будет следовать за головным спрайтом по карте и расти по мере того, как змея собирает предметы.

1. Перейдите в Scratch > Create, чтобы начать новый проект под названием « Snake Game «.

2. Наведите указатель мыши на кнопку «Выбрать спрайт» и выберите Paint .

3. Нарисуйте круг для головы змеи, используя черный контур на фигуре.

4. Нарисуйте розовый язык для змеи и нажмите Назад , чтобы поместить его под голову змеи.

Нарисуйте тело

Тело змеи будет нарисовано отдельно, чтобы оно могло расти по мере того, как змея собирает больше предметов, не затрагивая голову змеи.

1. Наведите курсор на . Нажмите кнопку Sprite и выберите Paint , чтобы создать новый спрайт .

2. Нарисуйте круг без контуров тела змеи.

Выровняйте змею

Теперь, имея две части змеи — голову и туловище — вы можете выстроить их в ряд в окне предварительного просмотра игры (возможно, вам потребуется изменить их размер).

1. Настройте спрайты змей так, чтобы они были маленькими и располагались по центру экрана.

2. Слегка переместите тело влево от головы, чтобы они выглядели соединенными.

Совет: тело змеи должно быть примерно 1/3 размера головы. Он также должен немного перекрывать голову, чтобы он был похож на шею.

Спрайты на экране должны быть маленькими, чтобы у игрока было достаточно места для перемещения и сбора предметов.

Движение змеи

Для ясности, в этой игре змея будет постоянно двигаться вперед. Затем игрок должен управлять направлением змеи с помощью клавиш со стрелками.

Движение

Чтобы создать движение:

1. Выберите спрайт Snake Head и добавьте при нажатии флажка  в область кода.

2. Прикрепите точку в направлении 90 и перейдите к x, y 0, 0 к блоку.

3. Прикрепите навсегда блок с переместить 5 шагов внутри.

Управление

Для управления змеей:

1. При нажатии клавиши пробела добавьте и установите его на стрелку вверх.

2. Прикрепите точку в направлении 0 к блоку.

3. Щелкните правой кнопкой мыши и дублируйте блок и установите его на стрелку вниз с направлением 180 .

4. Продублируйте блок еще два раза.

5. Установите один на стрелка вправо с направлением 90 и стрелка влево на -90 .

Как видно на изображении выше, тело змеи не следует за головой. Это потому, что к нему еще не прикреплен какой-либо код, поэтому тело не знает, что делать.

Чтобы тело выглядело связанным, его нужно закодировать так, чтобы оно соответствовало спрайту головы.

Следуйте за лидером

Выберите спрайт Snake Body и добавьте , когда флажок установлен, в область кода.

Прикрепите точку в направлении 90 и перейдите к блоку x, y .

Прикрепите навсегда ↺ блок с точкой к и переместите 5 шагов внутрь.

Выберите Snake Head из выпадающего списка для указывает на блок .

Изменение длины

Напоминаем, что для того, чтобы змея росла, ей нужно собирать предметы (например, яблоко). В этой игре каждый раз, когда змея ест яблоко, ее хвост удлиняется.

Чтобы отслеживать длину змеи, необходимо создать переменную. Эта переменная будет отслеживать, сколько яблок съест змея, что будет равно длине змеи.

Переменные

В этой игре будут использоваться две переменные: счет и переменная длины, которые будут определять длину змеи.

На вкладке Code выберите Variables и щелкните Make a Variable .

Создайте переменную с именем score и переменную с именем length .

Установка длины

Тело змеи будет расти каждый раз, когда она съедает яблоко. Для этого он создаст своих клонов, равных количеству съеденного.

1. Выберите спрайт Snake Body .

2. Прикрепите блок set length  to 0 к началу его кода.

3. Перетащите блок создать клон себя в блок  навсегда ↺ (внизу).

4. Добавьте , когда я начинаю как клон , в область кода.

5. Прикрепить ждать и удалить этот клон к блоку.

6. Перетащите переменную длины в блок ожидания .

Длина установлена, но в настоящее время длина всегда будет равна 0, поскольку переменная не изменяется. Чтобы изменить переменную, создайте и закодируйте коллекционный предмет.

Сбор предметов

Чтобы змея росла, вам нужно создать спрайт предмета, который змея сможет съесть.

Создайте предмет коллекционирования

В этом примере используется яблоко, но вы можете создать любой коллекционный предмет, который захотите!

1. Наведите курсор на Выберите кнопку Sprite и выберите Paint , чтобы создать новый спрайт.

2. Нарисуйте коллекционный предмет.

Установить позицию

Яблоко будет появляться в случайных точках на карте, поэтому невозможно предсказать, где оно появится в следующий раз!

1. Выберите спрайт Apple и прикрепите при нажатии флажка к области кода.

2. Прикрепите набор очков к блоку 0 . Поедание яблок принесет игроку очки.

3. Прикрепите к случайной позиции , если на ребре, отскочите и укажите в направлении 90 к коду.

Сбор яблок

Когда змея касается яблока, переменные score и length увеличиваются. Яблоко тоже исчезнет, ​​а потом снова появится в новом месте.

1. Добавьте при нажатии флажка с блоком навсегда ↺ в область кода.

2. Прикрепите блок if then <> с  в скобках.

3. Внутри оператора if добавьте hide с измените длину на 0,1 и измените счет на 10. Сбросить Apple «.

Сброс Apple

1. Добавить , когда я получу Сброс Apple в область кода.

2. Дублировать переход к случайной позиции кодовых блоков в блок приема.3

3. Прикрепить показать  блок в коде.

И все! Теперь у вас должна быть игра Snake, в которую можно играть с нуля. Думаете, какими могут быть следующие шаги? Дети могут подумать о таких вещах, как добавление «игра окончена», если касается своего тела или границы карты.  

Если они застряли и нуждаются в помощи, рассмотрите наши многочисленные онлайн-курсы по программированию для детей или летние лагеря Scratch.

how to make a paper snake

TikTok

Upload

For You

Following

tintaferris

♡tintaferris♡

Reply to @the_sanrio_addict_leah here you go i guess #art #artsandcrafts #papersnake #tutorial #fyp

383 лайков, 9 комментариев. Видео TikTok от ♡tintaferris♡ (@tintaferris): «Ответьте @the_sanrio_addict_leah, ну вот, думаю, #art #artsandcrafts #papersnake #tutorial #fyp». LOST IN PARADISE (заглавная музыкальная тема дзю-дзюцу кайсен).

7437 просмотров|

LOST IN PARADISE (Jujutsu Kaisen Ending Theme Song) — ALI0019 #TrendingVideo
#papercraft #ViralCreators #Handicrafts #Forkids #LifeHacks

Tiktok Video от jessica cadatal (@digigogo_ph_ph). #трендовоевидео #поделки из бумаги #виралкреаторы #поделки #форкиды #лайфхаки». оригинальный звук — jessica cadatal.

8440 просмотров|

original sound — jessica c cadatal

jeylordbayno

dodoy

Как легко сделать змейку из бумаги? #tiktokskwela #learnontiktok #ahamazinglearning #doynatics #papersnake

5,3 тыс. лайков, 11 комментариев. Видео TikTok от dodoy (@jeylordbayno): «Как легко сделать бумажную змею? #tiktokskwela #learnontiktok #ahamazinglearning #doynatics #papersnake». 2,5 см х 11 см (9 шт.) | 2,5 см х 11 см (8 шт.) | 2,5 см х 21 х м | …. Лучшая фоновая музыка для корпоративного CM, видео с описанием компании и т.д..

183,3 тыс. просмотров|

Лучшая фоновая музыка для корпоративного CM, видео с описанием компании и т.
д. — harryfaoki . Как легко сделать змейку из бумаги 🐍 | Согнутая скрепка | Поверните вокруг карандаша | …. ПОЧУВСТВУЙТЕ ПАЗ.

2508 просмотров|

FEEL THE GROOVE — Queens Road, Fabian Graetz

craft.forkids

Craft For Kids

How To Make Easy Paper SNAKE #craft #craftforkids #viral

TikTok video from Craft For Kidscraft.To Makeforkids): » Бумажная ЗМЕЯ #craft #craftforkids #viral». оригинальный звук.

5790 просмотров|

оригинальный звук — Craft For Kids

craftz_talent

Craftz Talent

#fyp #foryou #foryoupage #youtube #4U #4upage #FYP シ #Trend #kawaii #5minutecrafts #tonni

Видео TikTok от Craftz Talent (@craftz_talent): «#fyp #foryou #foryoupage #youtube #4u #4upage #fypシ #trending #tiktok #cute #viral #kids #howto #papercraft #diy #kawaii #5minutecrafts #tonni».