делаем игру «Змейка» на Python
Инструкции
Помните аркадную игру «Змейка», в которую когда-то играли на неубиваемой нокии? Оказывается, что написать классическую «змейку» сможет каждый новичок. О том, как сделать змейку на Python и накормить ее яблоками, расскажет Настя Мартынова — веб-писатель REG.RU.
Змейка (Snake) — это игра, созданная Танели Арманто в 1997 году специально для телефона Nokia. Змейка стала переломным моментом в развитии мобильного гейминга и завоевала сердца миллионов людей. Несмотря на свою примитивность, даже спустя 25 лет эта игра остается популярной.
Хоть Танели Арманто и считается создателем змейки, идея игры ему не принадлежит. Первый вариант змейки появился аж в 1976 году и назывался Blockade. После были созданы десятки клонов этой игры с разными названиями. Арманто при создании игры вдохновился одним из таких клонов, который был установлен на его Apple Macintosh. А мы вдохновились Танели Арманто и решили рассказать, как сделать игру змейка самостоятельно! С этим справятся даже те, кто только недавно начал изучать программирование.
Для создания змейки можно использовать разные языки программирования. Мы будем использовать… питон 🐍! Язык программирования Python универсален: он подходит как для решения повседневных задач, так и для создания простых игр.
Змейку на Python можно написать несколькими способами. Первый — при помощи библиотеки Python PyGame, которую используют для создания игр. Второй — с помощью встроенной библиотеки Turtle. В статье мы опишем второй способ.
Помимо Turtle, мы будем использовать два других модуля:
- Time — для добавления задержки в выполнении программы.
- 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. |
Создаем экран игры
Теперь создадим экран игры — укажем размер экрана, цвет фона и название программы. В функции 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 12 13 14 15 16 17 18 19 20 |
# food in the game food = 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. 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») |
Реализуем игровой процесс
Теперь нам нужно реализовать геймплей. Он включает в себя следующие пункты:
- Длина змейки увеличивается каждый раз, когда она собирает еду. При этом хвост и голова змейки должны отличаться по цвету.
- Счет увеличивается каждый раз, когда змея подбирает еду. Наибольший результат записывается.
- Должна быть добавлена проверка на столкновение головы змейки с телом или стеной.
- Цвет и форма еды должны меняться при каждом перезапуске игры.
- Игра начинается заново, если змея столкнулась с собой или стеной.
- В случае столкновения счетчик обнуляется, наибольший результат сохраняется до перезапуска.
Добавим оставшуюся часть нашего 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].
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. 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. 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. 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 вместе с нами.
А какой рекорд в змейке поставили вы? Поделитесь в комментариях!
Подписаться на рассылку по блогу
Анастасия Мартынова
11 августа 2022
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, но сейчас, будучи технарями, нам наверняка хочется сделать игру так, чтобы комар носа не подточил. Именно об этом и пойдет речь в нашей статье.
Перед тем как двигаться дальше, давайте посмотрим на основные разделы нашей статьи:
- Установка Pygame.
- Создание экрана.
- Создание змейки.
- Движение змейки.
- «Game over» при достижении змейкой границы.
- Добавление еды.
- Увеличение длины змейки.
- Вывод счета на экран.
Установка Pygame
Первое, что нам надо сделать, это установить библиотеку Pygame. Это можно сделать, просто выполнив следующую команду:
pip install pygame
Выполнив это, просто импортируем эту библиотеку и приступим к разработке игры. Но перед этим давайте взглянем на основные функции данной библиотеки, которые мы будем использовать при создании игры.
Функция | Описание |
init() | Инициализирует все модули Pygame (возвращает кортеж в случае успеха или неудачи). |
display.set_mode() | Для создания поверхности принимает в качестве параметра либо список либо кортеж (кортеж предпочтительней). |
update() | Обновляет экран. |
quit() | Используется для деинициализации всех модулей. |
set_caption() | Устанавливает текст заголовка в верхней части экрана |
event.get() | Возвращает список всех событий. |
Surface.fill() | Заполняет пространство сплошным цветом. |
time.Clock() | Отслеживание времени |
font. | Задает шрифт 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
TikTokUpload
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, видео с описанием компании и т.

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».