import pygame import random red = 255, 0, 0 green = 0, 255, 0 blue = 0, 0, 255 max_x = 900 max_y = 600 direction = [0,0] pause = 300 score = 0 coor = 0 game_over = False snake_list = [] s = 30 #размер блока змейки pygame.init() screen = pygame.display.set_mode((max_x, max_y)) pygame.display.set_caption("pidorskii python") class Block(pygame.sprite.Sprite): def __init__(self, color, width, hight, speed = 0): super().__init__() self.speed = speed self.image = pygame.Surface([width, hight]) #рисуем пустой прямоугольник self.image.fill(color) #заполняем цветом self.rect = self.image.get_rect() #берем контуры квадрата block = Block(green, s, s) def block_coord(): block.rect.x = abs(random.randrange(max_x - s) // s) * s block.rect.y = abs(random.randrange(max_y - s) // s) * s def draw_snake_block(score, x, y): for i in range(score): screen.blit(snake.image, (snake.rect.x, snake.rect.y)) screen.blit(snake_list[i + 1].image, (x, y)) x, y= snake_list[i+1].rect.x, snake_list[i+1].rect.y def move(direction): snake.rect.x += direction[0] snake.rect.y += direction[1] block_coord() snake = Block(blue, s, s, 1) snake_list.append(snake) snake_x = snake.rect.x = max_x / 2 snake_y = snake.rect.y = max_y / 2 background = pygame.image.load('BG_2560_1600.jpg').convert() background = pygame.transform.scale(background, (max_x, max_y)) clock = pygame.time.Clock() while game_over == False: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: direction = [0, -s] coor = 1 if event.key == pygame.K_DOWN: direction = [0, s] coor = 2 if event.key == pygame.K_RIGHT: direction = [s, 0] coor = 3 if event.key == pygame.K_LEFT: direction = [-s, 0] coor = 4 if snake.rect.x > max_x or snake.rect.x < 0 or snake.rect.y > max_y or snake.rect.y < 0: game_over = True if pygame.sprite.collide_rect(snake, block): block_coord() score += 1 snake_list.append(Block(red, s, s, 1)) screen.blit(background, (0, 0)) screen.blit(block.image, (block.rect.x, block.rect.y)) screen.blit(snake.image, (snake.rect.x, snake.rect.y)) snake_x = snake.rect.x snake_y = snake.rect.y move(direction) draw_snake_block(score, snake_x, snake_y) pygame.display.flip() pygame.time.delay(pause)
Логика, вроде как, такая: рисуем бэкграунд, рисуем блок (который надо собрать змейкой, “яблоко”), рисуем первый блок самой змейки, делаем шаг, если у нас уже есть собранные яблоки (то есть длинна змейки больше чем 1), тогда мы записываем координаты головы змеи, делаем шаг. Уже в функции draw_snake_block() мы заново отрисовываем голову, потом отрисовываем по координатам головы блок, который создался в этом условии:
if pygame.sprite.collide_rect(snake, block):
block_coord()
score += 1
snake_list.append(Block(red, s, s, 1))
запоминаем координаты, нового блока змеи (последнего отрисованного), цикл повторятеся. Но последующие блоки мне отрисовываются в левом верхнем углу (0, 0).
Хэлп, спать не могу из-за этого.
P.S. когда засовывю move() в функцию draw_snake_block() питон начинает делать что-то невнятное.