Размещение объектов в случайных местах в pygame

#python #random #pygame

#python #Случайный #pygame

Вопрос:

Привет, я пишу простую змеиную игру на python, используя pygame. Есть одна вещь, которую я не могу понять, а именно: как поместить объект в случайное место на экране, чтобы он не мерцал.

Вот немного моего кода:

 class Food(object):

    def __init__(self):
        self.eaten = False

    def food_spawn(self):
        self.food_x = random.randrange(0, 800, 1)
        self.food_y = random.randrange(0, 800, 1)

    def food_drawing(self):
        self.food_spawn()
        pygame.draw.circle(win, (0, 255, 0), (self.food_x, self.food_y), 15)


def window_drawing():
    # Filling the window with the background color to make the block move and not to draw longer and longer stripes
    win.fill((0,0,0))


    # Drawing the Food and the snake
    player.snake_drawing()
    apple.food_drawing()

    pygame.display.update()



player = Snake(300, 50)
apple = Food()
  

Я знаю, что проблема в том, что я вызываю random.randrange(0,800,1) каждый раз, когда я вызываю apple.food_drawing() , и, следовательно, новую позицию с каждой итерацией. Однако я не могу найти способ, как сделать положение еды случайным, не используя randrange.

У вас есть какие-либо идеи, как заставить это работать?

Это весь мой код, если вы хотите попробовать его:

 import pygame
import random

pygame.init()
screen_widht = 800
screen_height = 800

pygame.display.set_caption('Snake Game')
win = pygame.display.set_mode((screen_widht, screen_height))

clock = pygame.time.Clock()

snake_vel = 5
mainLoop = True
snake_moving = True




class Snake(object):

    def __init__(self, snake_x, snake_y):
        # self.colour = colour
        self.snake_x = snake_x
        self.snake_y = snake_y
        self.snake_widht = 25
        self.snake_height = 25

    def snake_drawing(self):
        pygame.draw.rect(win, (255,0,0),(self.snake_x, self.snake_y, self.snake_widht, self.snake_height))


    def move_snake(self):
        pass


class Food(object):

    def __init__(self):
        self.eaten = False

    def food_spawn(self):
        self.food_x = random.randrange(0, 800, 1)
        self.food_y = random.randrange(0, 800, 1)

    def food_drawing(self):
        self.food_spawn()
        pygame.draw.circle(win, (0, 255, 0), (self.food_x, self.food_y), 15)


def window_drawing():
    # Filling the window with the background color to make the block move and not to draw longer and longer stripes
    win.fill((0,0,0))


    # Drawing the Food and the snake
    player.snake_drawing()
    apple.food_drawing()

    pygame.display.update()



player = Snake(300, 50)
apple = Food()

snake_dir_x = False
snake_dir_y = False
snake_dir_neg_x = False
snake_dir_neg_y = False


while mainLoop:
    clock.tick(30)

    # creates a list of pressed keys
    keys = pygame.key.get_pressed()


    # creates a list of events, ex: mouse click events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainLoop = False

    # Pauses the game(more accureatly the snakes movment)
    if keys[pygame.K_p]:
        snake_dir_x = False
        snake_dir_y = False
        snake_dir_neg_x = False
        snake_dir_neg_y = False


    # Control of the snake: the for loop and the break statments are so that the snake can not move side ways
    for _ in range(1):

        if keys [pygame.K_RIGHT] and player.snake_x < screen_widht - player.snake_widht:
            player.snake_x  = snake_vel
            snake_dir_x = True
            snake_dir_y = False
            snake_dir_neg_x = False
            snake_dir_neg_y = False
            break

        if keys[pygame.K_LEFT] and player.snake_x > 0:
            player.snake_x -= snake_vel
            snake_dir_x = False
            snake_dir_y = False
            snake_dir_neg_x = True
            snake_dir_neg_y = False
            break

        if keys[pygame.K_DOWN] and player.snake_y < screen_height - player.snake_height:
            player.snake_y  = snake_vel
            snake_dir_x = False
            snake_dir_y = False
            snake_dir_neg_x = False
            snake_dir_neg_y = True
            break

        if keys[pygame.K_UP] and player.snake_y > 0:
            player.snake_y -= snake_vel
            snake_dir_x = False
            snake_dir_y = True
            snake_dir_neg_x = False
            snake_dir_neg_y = False
            break

        else:
            if snake_dir_x and player.snake_x < screen_widht - player.snake_widht:
                player.snake_x  = snake_vel
            if snake_dir_neg_x and player.snake_x > 0:
                player.snake_x -= snake_vel
            if snake_dir_neg_y and player.snake_y < screen_height - player.snake_height:
                player.snake_y  = snake_vel
            if snake_dir_y and player.snake_y > 0:
                player.snake_y -= snake_vel


    window_drawing()

  

Любая помощь приветствуется, спасибо.

Комментарии:

1. Вызов food_spawn() в конструкторе ( __init__ ), а не в food_drawing()

Ответ №1:

Вызывается food_spawn() в конструкторе ( __init__ ), а не в food_drawing() . Таким food_x образом, food_y атрибуты and устанавливаются при создании экземпляра объекта, и они не меняются каждый кадр:

 class Food(object):

    def __init__(self):
        self.eaten = False
        self.food_spawn()

    def food_spawn(self):
        self.food_x = random.randrange(0, 800, 1)
        self.food_y = random.randrange(0, 800, 1)

    def food_drawing(self):
        pygame.draw.circle(win, (0, 255, 0), (self.food_x, self.food_y), 15)
  

Комментарии:

1. Спасибо, это решило проблему, и еще раз спасибо!