Я остановился в своем последнем сообщении в блоге о создании Snake в Pygame с перемещением вашего плеера по экрану дисплея. Следующие шаги будут заключаться в создании границ для игрока, создании еды и заставлении змеи расти за счет потребления пищи. Когда змея выбегает за пределы поля, игра должна закончиться, потому что она наткнулась на «стену», которая завершает игру.
import pygame import time pygame.init() white = (255, 255, 255) blue = (0, 0, 255) red = (255, 0, 0) display_width = 800 display_height = 600 display = pygame.display.set_mode((display_height, display_width)) x1 = display_width/2 y1 = display_height/2 snake_block = 10 x1_change = 0 y1_change = 0 clock = pygame.time.Clock() snake_speed = 30 pygame.display.update() game_over = False font_style = pygame.font.SysFont(None, 50) def message(msg, color): mesg = font_style.render(msg, True, color) display.blit(mesg, [diplay_width/2, display_height/2]) while not game_over: for event in pygame.event.get(): if event == pyagme.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 if x1>=display_width or x1<0 or y1>=display_height or y1<0: game_over = True x1 += x1_change y1 += y1_change display.fill(white) pygame.draw(display, 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()
Вы можете заметить, что некоторые вещи были изменены с помощью переменных, все, что я сделал, это создал многоразовые переменные, чтобы мое приложение было гибким, если я хотел изменить размер отображения, теперь все, что мне нужно сделать, это изменить две переменные, а не проходить все приложение и изменить несколько вещей.
В добавленном мной выражении if я проверил, было ли положение змейки больше, чем размер дисплея, или меньше 0, и, если true, установил game_over
variable в True, таким образом завершив игру. Когда игра закончится, отобразится сообщение «Вы проиграли», следующим шагом будет добавление еды.
import pygame import random import time pygame.init() white = (255, 255, 255) blue = (0, 0, 255) red = (255, 0, 0) display_width = 800 display_height = 600 display = pygame.display.set_mode((display_height, display_width) snake_block = 10 clock = pygame.time.Clock() snake_speed = 30 pygame.display.update() game_over = False font_style = pygame.font.SysFont(None, 50) def our_snake(snake_block, snake_list): for x in snake_list: pygame.draw.rect(display, black, [x[0], x[1], snake_block, snake_block]) def message(msg, color): mesg = font_style.render(msg, True, color) display.blit(mesg, [diplay_width/2, display_height/2]) def gameLoop(): game_over = False game_close = Flase x1 = display_width/2 y1 = display_height/2 x1_change = 0 y1_change = 0 snake_List = [] Length_of_snake = 1 foodx=round(random.randrange(0,display_width-snake_block)/10.0)*10 foody=round(random.randrange(0,display_width-snake_block)/10.0)10 while not game_over: while game_close = True: display.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 == pyagme.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 if x1>=display_width or x1<0 or y1>=display_height or y1<0: game_over = True x1 += x1_change y1 += y1_change display.fill(white) pygame.draw(display, blue, [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, display_width-snake_block)/10)*10 foody = round(random.randrange(0, display_height-snake_block)/10)*10 Length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() gameLoop()
Создавая еду, вам нужно будет взять длину змеи и добавить к ней одну, вы можете сделать это, создавая прямоугольник каждый раз, когда змея проходит над едой. Выше того, что я сделал, я создал метод, который отслеживает длину змеи и рисует прямоугольник для каждой длины змеи. Оператор if внизу — это то, что проверяет, пробежала ли голова змеи по еде или нет, и если она есть, она генерирует новую пищу где-то случайным образом и увеличивает длину змеи.
Я также создал метод, который отслеживает, окончена ли игра или закрыта. Этот метод также позволяет пользователю воспроизвести игру нажатием клавиши, а не закрывать окно при закрытии игры. Теперь у вас есть функционирующая игра-змейка, которую можно воспроизвести одним нажатием клавиши, и ее не нужно открывать повторно после завершения игры.
Если вы хотите отобразить счет на экране, вы можете создать метод, который отслеживает длину змеи, чтобы увидеть, сколько кусочков еды съел пользователь, и отображать это минус один, чтобы показать длину за вычетом змееголова.
Вот ресурсы, которые я использовал, чтобы помочь мне создать это небольшое приложение:
- Https://www.edureka.co/blog/snake-game-with-pygame/
- Https://www.geeksforgeeks.org/snake-game-in-python-using-pygame-module/
Больше контента на plainenglish.io