Гоночная машина, которая находит первое, второе и третье место - PullRequest
0 голосов
/ 06 июля 2019

Я нашел этот код на YouTube для игры в гоночный автомобиль. Код довольно прост и перемещает графическое окно влево, пока не достигнет определенного места в форме. И первым пересечь указанное место объявляется победитель. Я хотел бы расширить этот код, чтобы я мог объявить второе и третье место финишером. После нескольких недель попыток сделать это я не смог выполнить эту задачу, кроме использования нескольких операторов If-Then.

Я попробовал операторы If-Then, чтобы выполнить эту задачу, однако это слишком громоздко и не работает, если вы хотите добавить больше автомобилей.

Вот мой текущий код:

Private Sub btnGo_Click(sender As System.Object, e As System.EventArgs) Handles btnGo.Click
    timRace.Enabled = True
End Sub

Private Sub timRace_Tick(sender As System.Object, e As System.EventArgs) Handles timRace.Tick
    Randomize()

    picCar1.Left += Rnd() * 6
    picCar2.Left += Rnd() * 6
    picCar3.Left += Rnd() * 6
    picCar4.Left += Rnd() * 6

    If picCar1.Left > 600 Then
        timRace.Enabled = False
        MsgBox("Car 1 Wins")
    End If

    If picCar2.Left > 600 Then
        timRace.Enabled = False
        MsgBox("Car 2 Wins")
    End If

    If picCar3.Left > 600 Then
        timRace.Enabled = False
        MsgBox("Car 3 Wins")
    End If

    If picCar4.Left > 600 Then
        timRace.Enabled = False
        MsgBox("Car 4 Wins")
    End If
End Sub

1 Ответ

3 голосов
/ 07 июля 2019

Одна вещь, которую вы можете сделать, это добавить все «машины» в массив и перебрать этот массив, чтобы «переместить машины», а также получить те, которые находятся на втором и третьем местах.

Вот пример использованията же самая техника, которую вы сейчас используете:

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

Однако япобудил бы вас научиться использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...