Как создать змею в Pygame — Часть 2

Я остановился в своем последнем сообщении в блоге о создании 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 внизу — это то, что проверяет, пробежала ли голова змеи по еде или нет, и если она есть, она генерирует новую пищу где-то случайным образом и увеличивает длину змеи.

См. также:  Разработка языковых привязок с помощью xtensor

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

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

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

Больше контента на plainenglish.io

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: