Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2018 12:21:24

ArtyomZaitsev
Зарегистрирован: 2018-01-28
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Змейка на pygame

Всем доброго дня. Пытаюсь осилить змейку. Но никак не могу добиться того, чтобы отрисовывались последующие блоки. Может кто скажет, где я косячу? Заранее благодарен.

 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() питон начинает делать что-то невнятное.

Офлайн

#2 Фев. 11, 2018 12:33:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Змейка на pygame

Советую ознакомиться вот с этим материалом



Офлайн

#3 Фев. 20, 2018 21:27:50

ArtyomZaitsev
Зарегистрирован: 2018-01-28
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Змейка на pygame

Уже не сколько дней пытаюсь понять почему это не работает:

 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)
Может все-таки найдется кто-то, кто скажет где косяк? Заранее спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version