如何在pygame中产生随机性?

时间:2019-04-26 07:32:15

标签: python pygame

我正试图在pygame中创造一个繁星点点的夜晚。实际上,这是我在Eric撰写的Python速成课程之后的练习中给出的。到目前为止,我已经创建了一个协调的恒星舰队,但是根据任务,我需要使用randint随机放置恒星。我无法设想如何制作?我是初学者。它的python 3

到目前为止,我已经尝试删除可用空间并尝试用于rand int,但是我失败了。

        <ScrollView>
            <!-- The MenuItems -->
            <Grid RowSpacing="0"
                  ColumnSpacing="0"
                  Margin="0, 0, 0, 0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="200" />
                    <RowDefinition Height="20" />
                    <RowDefinition Height="350" />
                    <RowDefinition Height="300" />
                    <RowDefinition Height="300" />
                    <RowDefinition Height="300" />
                    <RowDefinition Height="300" />
                    <RowDefinition Height="200" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <!--<ColumnDefinition Width="*" /> -->
                </Grid.ColumnDefinitions>
<animatedViews:SavannahCanvasView HorizontalOptions="Center"
                                                  Grid.Row="0" />

                <Grid Grid.Row="2"
                      BackgroundColor="#fbc531">
                    <Image HeightRequest="100"
                           VerticalOptions="End"
                           HorizontalOptions="FillAndExpand"
                           Aspect="Fill"
                           Source="{imageExtensions:ImageResource Source=Cheetah.Forms.Assets.Images.Background_Torque.png, TheAssembly=Cheetah.Forms}" />

                    <StackLayout VerticalOptions="Center"
                                 HorizontalOptions="Center"
                                 Margin="0,-100,0,0">

                        <StackLayout.GestureRecognizers>
                            <TapGestureRecognizer Command="{Binding ShowMyPingsPageCommand}" />
                        </StackLayout.GestureRecognizers>

                        <Image Source="{imageExtensions:ImageResource Source=Cheetah.Forms.Assets.Images.Radar@256px.png, TheAssembly=Cheetah.Forms}"
                               HeightRequest="150"
                               WidthRequest="150" />
                        <Label VerticalOptions="Center"
                               HorizontalOptions="Center"
                               Style="{StaticResource WhiteLabel}"
                               Text="My Pings" />
                    </StackLayout>

                </Grid>
....

我需要一个随机放置的星星,但是我得到的只是代码中的协调星星。感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

现在,您正在为每一行创建固定数量的星星:

number_stars_x = int(available_space_x / (2 * star_width))

尝试将其设置为介于0和最大数之间的数字!

# number_stars_x = randint(0, max_number)
# Note: // will produce an int in python3
number_stars_x = randint(0, available_space_x // (2 * star_width))

这已经使它看起来很随机! 也可以随机放置位置,但是您将需要代码以确保它们也不会重叠。

在这种情况下,您可以以

开头
star.x = randint(star_width, available_space_x - star_width)

答案 1 :(得分:1)

这很大程度上取决于您所说的“随机”。

您也可以按照@Mars的建议,随机放置一些星星。

您还可以预定义一些“星星点”,并使用random.choice方法填充其中的任意数量

possible_x_stars = [star_width + 2 * star_width * i for i in star_number]
next_star.x = random.choice(possible_x_stars) # You will need to remove the chosen value afterward.

另一种方法可以是执行while循环(如果没有太多的星星),例如:

number_of_stars = 0
tries = 0
placed_stars = []
while number_of_stars < maximum_stars_wanted and tries < max_number_of_try: # To avoid taking too much time
    next_star_x = random.randint(0, screen.width)
    if does_not_overlap(next_star_x, placed_stars): # You will need to create this method
         placed_stars.append(next_star_x)
         number_of_stars += 1
    tries += 1
create_all_stars_from_x(placed_stars) # You will also need to create this method

答案 2 :(得分:0)

只需使用randint(min,max)。它会产生一个介于最小值和最大值之间的数字。

num_stars = randint(0, available_space_x / (2 * star_width))

要更复杂地使用随机数生成,建议使用随机模块(随机列表,浮点数,选择等)。

import random
num_stars = random.randrange(0, available_space_x / (2 * star_width))