Форум сайта python.su
Всем доброго дня. Пытаюсь осилить змейку. Но никак не могу добиться того, чтобы отрисовывались последующие блоки. Может кто скажет, где я косячу? Заранее благодарен.
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)
Офлайн
Советую ознакомиться вот с этим материалом
Офлайн
Уже не сколько дней пытаюсь понять почему это не работает:
import pygame import random red = 255, 0, 0 green = 0, 255, 0 blue = 0, 0, 255 max_x = 900 max_y = 600 s = 30 x = max_x // 2 y = max_y // 2 direction = [0, 0] snake_blocks = [] pause = 400 score = 1 game_over = False pygame.init() screen = pygame.display.set_mode((max_x, max_y)) pygame.display.set_caption("snake") background = pygame.image.load('BG_2560_1600.jpg').convert() background = pygame.transform.scale(background, (max_x, max_y)) class Block(pygame.sprite.Sprite): def __init__(self, color, width, hight): super().__init__() self.image = pygame.Surface([width, hight]) # рисуем пустой прямоугольник self.image.fill(color) # заполняем цветом self.rect = self.image.get_rect() #берем контуры квадрата def move(direction): #делаем шаг длинной в s=30 global x, y x += direction[0] * s y += direction[1] * s target = Block(blue, s, s) #создаем цель змейки snake = Block(red, s, s) #создаем первый блок змейки snake_blocks.append(snake) screen.blit(snake_blocks[0].image, (x, y)) #отрисвовываем змейку def block_coord(target): #задаем рандомные координаты цели змейки target.rect.x = abs(random.randrange(max_x - s) // s) * s target.rect.y = abs(random.randrange(max_y - s) // s) * s block_coord(target) 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, -1] if event.key == pygame.K_DOWN: direction = [0, 1] if event.key == pygame.K_RIGHT: direction = [1, 0] if event.key == pygame.K_LEFT: direction = [-1, 0] screen.blit(background, (0, 0)) #рисуем задний фон screen.blit(target.image, (target.rect.x, target.rect.y)) if score == 1: move(direction) screen.blit(snake.image,(x, y)) else: move(direction) snake_blocks.insert(0, Block(red, s, s)) snake_blocks[0].rect.x, snake_blocks[0].rect.y = x, y del snake_blocks[-1] for i in snake_blocks: screen.blit(i.image, (i.rect.x, i.rect.y)) if pygame.sprite.collide_rect(target, snake_blocks[0]): block_coord() score += 1 snake_blocks.append(Block(red, s, s)) pygame.display.flip() pygame.time.delay(pause)
Офлайн