tak.lol
15 январь 2025
3
0
Не нравится 0 Нравится

Игра "Змейка"

Змейка – не просто развлечение, но и отличный способ научиться программированию, а также потренировать свои навыки в работе с графикой и логикой. Готов? Поехали!

Шаг 1: Подготовка


Для начала нам понадобится библиотека Pygame. Это мощный инструмент для создания игр на Python. Установи её, если ещё не сделал этого:


pip install pygame


Теперь, когда у нас есть Pygame, давай создадим файл snake_game.py. В этом файле мы будем писать код нашей игры.



Шаг 2: Инициализация Pygame


Первое, что нужно сделать, это импортировать библиотеку и инициализировать её:


import pygame
import time
import random

pygame.init()  # Инициализация Pygame


Здесь мы импортируем необходимые модули. time пригодится для управления временем в игре, а random – для случайного появления еды для змейки.



Шаг 3: Настройка экрана


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


width, height = 600, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Змейка на Python')  # Заголовок окна


Вот и всё! Мы создали окно размером 600x400 пикселей и установили заголовок. Теперь у нас есть место для нашей змейки и еды!



Шаг 4: Определяем цвета и начальные параметры


Пора добавить немного цвета! Давай определим цвета и начальные параметры змейки:


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

snake_block = 10
snake_speed = 15


Теперь у нас есть цвета для фона, змейки и еды. snakeblock определяет размер блока змейки, а snakespeed – скорость её движения.



Шаг 5: Создание змейки


Теперь давай создадим функцию для рисования змейки:


def oursnake(snakeblock, snake_list):
    for x in snake_list:
        pygame.draw.rect(screen, green, [x[0], x[1], snakeblock, snakeblock])


Эта функция принимает размер блока и список сегментов змейки. Она рисует каждый сегмент на экране. Простое и элегантное решение!



Шаг 6: Основной игровой цикл


Теперь пора создать основной игровой цикл. Это сердце нашей игры:


def game_loop():
    game_over = False
    game_close = False

    x1 = width / 2
    y1 = height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Lengthofsnake = 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

    while not game_over:

        while game_close == True:
            screen.fill(red)
            font_style = pygame.font.SysFont("bahnschrift", 25)
            mesg = font_style.render("Ты проиграл! Нажми C для перезапуска или Q для выхода", True, white)
            screen.blit(mesg, [width / 6, height / 3])
            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:
                        game_loop()

        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:
                    x1change = -snakeblock
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1change = snakeblock
                    y1_change = 0
                elif event.key == pygame.K_UP:
				y1change = -snakeblock
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1change = snakeblock
                    x1_change = 0

        if x1 >= width or x1 < 0 or y1 >= height or y1 < 0:
            game_close = True

        x1 += x1_change
        y1 += y1_change
        screen.fill(blue)
        pygame.draw.rect(screen, white, [foodx, foody, snakeblock, snakeblock])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snakeList.append(snakeHead)
        if len(snakeList) > Lengthof_snake:
            del snake_List[0]

        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True

        oursnake(snakeblock, snake_List)

        pygame.display.update()

        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
            Lengthofsnake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

clock = pygame.time.Clock()
game_loop()


В этом коде мы обрабатываем события клавиатуры для управления змейкой и проверяем столкновения с границами экрана и самой собой. Если змейка съедает еду, она становится длиннее! Это классика жанра.





Шаг 7: Запуск игры


Теперь ты готов запустить свою игру! Просто выполни команду:


python snake_game.py


Если всё сделано правильно, ты увидишь окно с игрой "Змейка". Управляй стрелками на клавиатуре и наслаждайся!



Интересные факты



  • Змейка была одной из первых игр на мобильных телефонах – она появилась на Nokia в конце 90-х!

  • Существует множество вариаций игры: от простых до сложных с множеством уровней и препятствий.

  • Создание "Змейки" – это отличный способ научиться основам программирования и логики игры.



Теперь ты знаешь, как создать свою собственную "Змейку" на Python! Надеюсь, ты получил удовольствие от этого процесса. Удачи с твоими будущими проектами!



Весь код целиком:
import pygame
import time
import random

# Инициализация Pygame
pygame.init()

# Настройки экрана
width, height = 600, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Змейка на Python')

# Определение цветов
black = (0, 0, 0)
white = (255, 255, 255)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# Параметры змейки
snake_block = 10
snake_speed = 15

# Функция для рисования змейки
def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(screen, green, [x[0], x[1], snake_block, snake_block])

# Основной игровой цикл
def game_loop():
    game_over = False
    game_close = False

    x1 = width / 2
    y1 = height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Length_of_snake = 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

    clock = pygame.time.Clock()

    while not game_over:

        while game_close == True:
            screen.fill(red)
            font_style = pygame.font.SysFont("bahnschrift", 25)
            mesg = font_style.render("Ты проиграл! Нажми C для перезапуска или Q для выхода", True, white)
            screen.blit(mesg, [width / 6, height / 3])
            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:
                        game_loop()

        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 >= width or x1 < 0 or y1 >= height or y1 < 0:
            game_close = True

        x1 += x1_change
        y1 += y1_change
        screen.fill(blue)
        pygame.draw.rect(screen, white, [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, width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

game_loop()
Комментарии к материалу
Комментировать
Ваш комментарий: