Рубрики
Без рубрики

Построить змею с Python

Привет, читатели, давайте создадим игру с помощью Python. Да, вы слышали это правильно! Мы будем строить SIMP … Tagged с Python, Gamedev, программированием.

Привет, читатели, давайте создадим игру с помощью Python. Да, вы слышали это правильно! Мы будем создавать простую игру Snake, используя библиотеку Pygame.

Помните старые времена, когда все играли в культовую игру Snake. Давайте возродим эти старые времена и построим один сам по себе! Итак, в этом уроке мы будем строить эту культовую игру.

Итак, давайте начнем создавать нашу игру. Мы сделаем это шаг за шагом, чтобы понять каждую часть игры и какую цель в нашей игре! Итак, начнем:

Импорт библиотек

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

import pygame
import time
import random

Pygame: Эта библиотека поможет нам получить все графические компоненты для создания игры.

случайный: Эта библиотека поможет нам нерестовать еду в случайных местах в игре.

время: Это помогает нам с функциональными возможностями, связанными с временем, в игре, как скорость змеи.

Запуск игры и настройка графика

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

pygame.init()

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

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

white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

Затем мы должны определить размер дисплея, на котором будет запущена наша игра. Таким образом, в этом случае мы определили бы высоту 600px, а ширина – 800px.

width = 800
height = 600

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

dis = pygame.display.set_mode((width, height))
pygame.display.set_caption('Shubham Snake Game')

Определение переменных, используемых в игре

Теперь мы инициализируем нашу переменную часы, которая будет использовать пакет Time, который мы импортировали ранее. Эти переменные «часы» позаботятся обо всех связанных с временем запросов в нашем полном коде.

clock = pygame.time.Clock()

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

snake_block = 10
snake_speed = 12

Затем мы опишем размер шрифта и стиль шрифта для отображения счетов и для отображения другой информации, например, чтобы уведомить, что вы проиграли игру или хотите снова играть.

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]

Далее мы будем определять нашу змею. Без змеи наша игра не имеет значения. Итак, давайте сделаем самую важную часть нашей игры, змеи. Мы определим цвет и положение змеи и ее размера, т.е. Snake_block Анкет

Функция ниже принимает Snake_block и Snake_list в качестве ввода. Мы будем определять Snake_list после включения в нашу программу. Так что не волнуйтесь, если вы сейчас ничего не получите.

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])

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

Эта вспомогательная функция принимает MSG и цвет в качестве входного параметра. Мы установим шрифт, а затем отобразим сообщение в требуемом цвете. Нам нужно будет указать позицию, где сообщение будет отображаться на игровом дисплее.

def message(msg, colour):
 mesg = font_style.render(msg, True, colour)
 dis.blit(mesg, [width / 6, height / 3])

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

Теперь мы начинаем создавать компоненты игры, которые заставляют ее работать и отвечать на входы пользователей через клавиатуру. Начнем с определения двух логических переменных: Game_over и game_close Анкет Они опишут состояния игры.

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

game_over = False
game_close = False

На следующем шаге мы стремимся определить другие переменные, которые нам понадобятся в игре.

Мы будем определять x1 и Y1 Обозначать позицию змеи в нашей игре. Мы инициализируем их ширину/2 и высоту/2 соответственно. Кроме того, мы будем определять переменные x1_change и y1_change который будет использоваться для обозначения изменений в положении змеи на основе ввода, предоставленного пользователем.

x1 = width / 2
y1 = height / 2

x1_change = 0
y1_change = 0

Кроме того, нам нужно определить snake_list и переменные snake_length для хранения всех положений головы змеи и длины змеи соответственно.

snake_List = []
snake_length = 1

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

foodx = round(random.randrange(0, width — snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height — snake_block) / 10.0) * 10.0

Затем мы запустим цикл, который будет работать, пока Game_over не станет правдой.

В этом цикле мы сначала определили бы инструкции, которые будут выполнены в случае, если переменная Game_close верна.

Ниже приведен код, который поможет нам справиться с этой ситуацией, когда Game_close равен True.

while game_close == True:
 dis.fill(blue)
 message("Oops! Your snake died! Press P to play again or Q to quit", red)
 Your_score(snake_length — 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_p:
       gameLoop()

Как вы можете видеть выше, мы определили много вещей. Мы заполняем дисплей синим цветом (вы наверняка выбираете свой). Затем мы отображаем сообщение, показывающее, что человек проиграл игру, и мы должны спросить, хочет ли человек играть в нее снова или покинуть игру.

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

Если пользователь вводит «P», то мы просто продолжим наш игровой цикл. Если пользователь вводит «Q», тогда нам нужно покинуть игру.

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

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 or event.key == pygame.K_a:
     x1_change = -snake_block
     y1_change = 0
   elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
     x1_change = snake_block
     y1_change = 0
   elif event.key == pygame.K_UP or event.key == pygame.K_w:
     y1_change = -snake_block
     x1_change = 0
   elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
     y1_change = snake_block
     x1_change = 0

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

Далее мы определили бы состояние для проигрыша игры. Кроме того, мы обновляем значения X1 и Y1 с помощью x1_change и y1_change. Мы также заполняем весь дисплей синим цветом и нарисуем змею и пищу, передавая положение их появления на дисплее.

 if x1 >= width or x1 < 0 or y1 >= 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, который будет хранить значения головы змеи после каждой итерации. Мы добавляем к нему значения X1 и Y1. Затем мы добавляем эту Snake_head в Snake_list.

Затем мы проверяем условия проверкой, превышает ли длина Snake_list, чем snake_length. Если да, удалите первый элемент в Snake_list.

Затем мы проверяем, равен ли этот текущий Snake_head любому из элементов Snake_list, за исключением того, который добавляется вновь, то есть проверяется Snake_head. Если да, то мы закрываем игру, и игрок проигрывает.

Это связано с тем, что появление Snake_head в Snake_list означает, что он был добавлен в Snake_list, и поиск того же значения снова означает, что Snake Bits сам. Итак, игрок должен проиграть в тот момент.

Затем мы называем функцию нашего_SNAKE и your_score (определено ранее) и передаем необходимые параметры в эти функции, чтобы отобразить обновленную змею и счет игрока.

 snake_Head = []
 snake_Head.append(x1)
 snake_Head.append(y1)
 snake_List.append(snake_Head)
 if len(snake_List) > snake_length:
   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(snake_length — 1)

 pygame.display.update()

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

Затем мы даем скорость змеи в качестве параметра на часы.

if x1 == foodx and y1 == foody:
  foodx = round(random.randrange(0, width — snake_block) / 10.0) * 10.0
  foody = round(random.randrange(0, height — snake_block) / 10.0) * 10.0
  snake_length += 1

clock.tick(snake_speed)

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

  pygame.quit()
  quit()
gameLoop()

Итак, мы завершили нашу змею. Вот полный код для игры Snake:

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 = 800
dis_height = 600

dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Shubham Snake Game')

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()

Итак, надеюсь, вам понравилось читать эту статью. Надеюсь, вы узнали что -то новое из этой статьи. Попробуйте самостоятельно и попробуйте изменить функции и реализовать лучшую модель этого. Некоторые примеры улучшений могут заключаться в том, чтобы иметь различные уровни сложности с различными скоростями змеи и шириной. Это может быть сделано более интерактивным и красивым.

Иди, попробуй и сделай из этого что -то новое. Посетите Репозиторий GitHub этого проекта Для получения дополнительной информации об этом.

Спасибо, что прочитали это. Надеюсь, тебе это понравилось!

Первоначально опубликовано в среде

Оригинал: “https://dev.to/shubham1710/build-a-snake-game-with-python-23an”