从常量列表中随机选择而不重复?

问题描述 投票:0回答:1

我正在制作乌龟过街游戏,遇到了一个我不知道如何解决的问题。我在这里阅读了几个有关类似问题的主题,但由于我使用的是常量列表,因此它们并没有真正帮助我的特定情况,因此 random.shuffle() 选项对我不起作用。

这是有问题的课程:

from turtle import Turtle
import random

COLORS = ["red", "orange", "yellow", "green", "blue", "purple"]
STARTING_MOVE_DISTANCE = random.randint(3, 6)
MOVE_INCREMENT = 2
CAR_LANES_BOTTOM = [-220, -190, -160, -130, -100, -70, -40]
CAR_LANES_TOP = [40, 70, 100, 130, 160, 190, 220]


class CarManager:

    def __init__(self):
        self.bottom_cars = []
        self.top_cars = []

    def create_car_bottom(self):
        random_chance = random.randint(1, 20)
        if random_chance == 1:
            new_car = Turtle('square')
            new_car.shapesize(stretch_wid=1, stretch_len=2)
            new_car.penup()
            new_car.color(random.choice(COLORS))
            random_lane = random.choice(CAR_LANES_BOTTOM)
            new_car.goto(300, random_lane)
            self.bottom_cars.append(new_car)

    def create_car_top(self):
        random_chance = random.randint(1, 20)
        if random_chance == 1:
            new_car = Turtle('square')
            new_car.shapesize(stretch_wid=1, stretch_len=2)
            new_car.penup()
            new_car.color(random.choice(COLORS))
            random_lane = random.choice(CAR_LANES_TOP)
            new_car.goto(-300, random_lane)
            self.top_cars.append(new_car)

    def move_left(self):
        for car in self.bottom_cars:
            car.backward(random.randint(3, 6))

    def move_right(self):
        for car in self.top_cars:
            car.forward(random.randint(3, 6))

我经常让汽车在同一条车道上生成,而且它们重叠,所以我想找到一种方法以某种方式减少重复。

我尝试过使用时间或增加 random_chance 范围,但它并没有真正影响最终结果。经过所有测试后,我得出的结论是,唯一的选择是以某种方式确保这一点:

random_lane = random.choice(CAR_LANES_BOTTOM)

不重复车道,但考虑到列表是恒定的,我不知道该怎么做。 我会感激任何适合像我这样的初学者的想法。

python list random constants
1个回答
0
投票

您可以使用 while 循环操作随机元素。如果您不想从列表中获取相同的元素,您可以创建一个 1 元素列表作为used_coord,并且该元素不应位于 CAR_LANES_BOTTOM 中。

之后,您可以获得随机值并检查used_coord的最后一个元素是否与您的random_coord匹配,选择另一个坐标直到它们不匹配。它可以帮助您避免连续获得相同的坐标。您可以将此代码改编到您的代码中。此代码的工作原理只是不从连续列表中获取元素。希望对您有帮助。

示例代码:

used_coord = [1]
while(True):
        
    random_cord = random.choice(CAR_LANES_BOTTOM)

    try : 
        if used_coord[-1] != random_cord:
            used_coord.append(random_cord)
            break
        
    except : 
        print("Some Error")


            
© www.soinside.com 2019 - 2024. All rights reserved.