Как мне случайным образом выбрать 5 из 10 игроков, и у каждого из них разные случайно выбранные координаты y из списка?

#python #list #random #pygame #sprite

#python #Список #Случайный #pygame #спрайт

Вопрос:

Итак, я пытаюсь создать игру «скачки», и я хочу случайным образом выбрать 5 игроков из списка из 10 игроков, и у 5 из них разные случайно выбранные координаты y из списка. Я попробовал свой код, но y иногда совпадают. Я немного застрял, и я очень признателен, если вы, ребята, сможете мне помочь.

 class Player1(pygame.sprite.Sprite):      #Player1 class ( 2-10 are the same)
    def __init__(self, pos_x, pos_y):
        super().__init__()
        self.sprites = []
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/1.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/2.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/3.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/4.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/5.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/6.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/7.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/8.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/9.png").convert_alpha(), (80, 60)))
        self.sprites.append(pygame.transform.scale(pygame.image.load("image/pig/non/10.png").convert_alpha(), (80, 60)))
    
        self.current_sprite = 0
        self.image = self.sprites[self.current_sprite]

        self.rect = self.image.get_rect(center = (pos_x, pos_y))

    def update(self):
        self.current_sprite  = 0.1
        if self.current_sprite >= len(self.sprites):
            self.current_sprite = 0
        self.image = self.sprites[int(self.current_sprite)]

player_x = 100

random_y = [sf_height-200, sf_height - 290,sf_height-345,sf_height - 420,sf_height - 470]  

player1 = Player1(player_x,random.choice(random_y))
player2 = Player2(player_x,random.choice(random_y))
player3 = Player3(player_x,random.choice(random_y))
player4 = Player4(player_x,random.choice(random_y))
player5 = Player5(player_x,random.choice(random_y))
player6 = Player6(player_x,random.choice(random_y))
player7 = Player7(player_x,random.choice(random_y))
player8 = Player8(player_x,random.choice(random_y))
player9 = Player9(player_x,random.choice(random_y))
player10 = Player10(player_x,random.choice(random_y))

player_list = [player1, player2, player3, player4, player5, player6, player7, player8, player9, player10]

player_group = pygame.sprite.Group()
player_group.add(random.sample(player_list, 5))

 

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

1. positions = random.shuffle(random_y) для создания копии списка случайным образом перемешивается. Player1(player_x,positions.pop()) возьмите и удалите первый случайный элемент для каждого игрока

2. @TheLazyScripter Проблема в том, что random_y имеет только 5, а не 10 записей. Я думаю, нам нужно увидеть больше Player1-10 (разве индекс не должен быть параметром?) прежде чем прийти к решению.

3. Ах, вы правы, я думаю, я не заметил, что было только 5 y-позиций. Имело бы смысл назначить y_pos после выбора случайного игрока. Является ли player1-10 объектом или fn?

4. player1-10 — это объект @TheLazyScripter

5. Я бы сказал, установите ypo после инициализации. players = random.sample(player_list, 5) затем установите ypo после перемешивания. random.shuffle(random_y) . for x in players:x.set_y(random_y.pop()) . set_y затем метод создаст rect . Можно сделать копию random_y , чтобы сохранить исходные позиции, random_y_copy = random_y.copy() а затем перетасовать и извлечь из копии вместо оригинала! Надеюсь, это поможет!

Ответ №1:

Вы можете назначить каждую из 5 y координат 5 Player1 объектам класса. Сначала это не будет случайным, но оно будет автоматически перетасовано при использовании random.sample в списке:

 player_x = 100
random_y = [sf_height - 200, sf_height - 290, sf_height - 345, sf_height - 420, sf_height - 470]  

five_players = [Player1(player_x,random.choice(y)) for y in random_y]
all_players = [...]
player_group = pygame.sprite.Group()
player_group.add(random.sample(five_players, 5))