Одна вещь, которую вы можете сделать, это добавить все «машины» в массив и перебрать этот массив, чтобы «переместить машины», а также получить те, которые находятся на втором и третьем местах.
Вот пример использованията же самая техника, которую вы сейчас используете:
Private Cars As PictureBox()
Private Finishers As List(Of PictureBox)
Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
' We use the `Tag` property to store the name of the car.
picCar1.Tag = "Car 1"
picCar2.Tag = "Car 2"
picCar3.Tag = "Car 3"
picCar4.Tag = "Car 4"
' Add all the four cars into the array.
Cars = {picCar1, picCar2, picCar3, picCar4}
Finishers = New List(Of PictureBox)
timRace.Enabled = True
End Sub
Private Sub timRace_Tick(sender As Object, e As EventArgs) Handles timRace.Tick
Dim remainingCars = Cars.Except(Finishers).ToArray()
If remainingCars.Count > 0 Then
For Each car As PictureBox In remainingCars
Randomize()
car.Left += Rnd() * 6
If car.Left > 600 Then Finishers.Add(car)
Next
Else
timRace.Enabled = False
MsgBox($"{Finishers(0).Tag} Wins" & vbNewLine &
$"{Finishers(1).Tag} finished second." & vbNewLine &
$"{Finishers(2).Tag} finished third.")
End If
End Sub
Результат:
![Race result](https://i.stack.imgur.com/CXLYG.gif)
Однако япобудил бы вас научиться использовать Random
класс вместо использования устаревшего способа (т. е. Randomize
и Rnd()
).
В этом случае код будетвыглядеть примерно так:
Private Rand As New Random()
Private Sub timRace_Tick(sender As Object, e As EventArgs) Handles timRace.Tick
Dim remainingCars = Cars.Except(Finishers).ToArray()
If remainingCars.Count > 0 Then
For Each car As PictureBox In remainingCars
car.Left += Rand.Next(1, 10)
' ...
Next
Else
' ...
End If
End Sub