我正试图在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>
....
我需要一个随机放置的星星,但是我得到的只是代码中的协调星星。感谢您的帮助!
答案 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))