Visual Basic Случайные числа Угадайка - PullRequest
0 голосов
/ 07 января 2019

Мне нужна помощь для задания в классе. Я пытаюсь создать игру с угадыванием случайных чисел, которая должна иметь цикл. По сути, вы вводите число в качестве предположения, и программа отобразит сообщение, сообщающее вам, является ли предположение слишком высоким, слишком низким или правильным, и оно будет повторяться до тех пор, пока вы не получите правильное предположение. Программа также считает количество ваших предположений.

Вот форма:

А вот код, который у меня есть:

Private Sub btnDisplay_Click(sender As Object, e As EventArgs) Handles btnDisplay.Click
    Dim decNumber As Decimal
    Dim rand As New Random
    Dim decGuess As Decimal
    Dim intCount As Integer = 0

    decGuess = CDec(txtGuess.Text)

    Do
        decNumber = rand.Next(1, 100)

        intCount += 1
        lblCount.Text = intCount.ToString

        If decNumber < decGuess Then
            lblResponse.Text = "Too low, try again."
        ElseIf decNumber > decGuess Then
            lblResponse.Text = "Too high, try again."
        ElseIf decNumber = decGuess Then
            lblResponse.Text = "Correct."
        End If

    Loop Until decGuess = decNumber

End Sub

Я не совсем уверен, в чем заключается ошибка в коде, но всякий раз, когда я нажимаю «Показать», счетчик догадок оказывается очень большим числом, и сообщение, отображаемое в метке, всегда просто «Правильно», поэтому мой вопрос как мне это исправить и правильно написать цикл?

Обновление:

Public Class Form1

Dim intNumber As Integer
Dim rand As New Random
Dim intGuess As Integer
Dim intCount As Integer

Private Sub btnNew_Click_1(sender As Object, e As EventArgs)
    lblResponse.Text = String.Empty
    txtGuess.Clear()
    lblCount.Text = String.Empty
    intNumber = rand.Next(1, 100)
End Sub

Private Sub btnGuess_Click(sender As Object, e As EventArgs) Handles btnGuess.Click

    intGuess = CInt(txtGuess.Text)

    If intNumber < intGuess Then
        lblResponse.Text = "Too high, try again."
    ElseIf intNumber > intGuess Then
        lblResponse.Text = "Too low, try again."
    ElseIf intNumber = intGuess Then
        lblResponse.Text = "Correct."
    End If

    intCount += 1
    lblCount.Text = intCount.ToString

End Sub

1 Ответ

0 голосов
/ 07 января 2019

В вашем коде довольно много ошибок:

1. Определение вашего случайного числа

Вы генерируете случайное число в каждом цикле, что означает, что вместо фиксированного числа, которое вы пытаетесь угадать, число меняется.

Даже если вы определяете случайное число вне цикла, число меняется каждый раз, когда вы нажимаете кнопку.

Вам потребуется определить ее как глобальную переменную вне подпрограмм и изменять ее только при нажатии кнопки сброса

2. Определение intcount

intcount устанавливается в 0 каждый раз, когда вы нажимаете кнопку, так как он определен в подпрограмме нажатия кнопки, что я не считаю желательным.

3. Тот факт, что вы используете цикл

Вам вообще не нужна петля. Если вы не хотите, чтобы ваша программа входила в бесконечный цикл и вылетала каждый раз, когда вы нажимаете кнопку, а ваше предположение неверно, вы должны удалить цикл и просто использовать код внутри него.

4. Использованы неверные типы данных

decnumber должен быть целым числом, поскольку random.next () возвращает целочисленное значение (вы также можете переименовать его в ToGuess)

decGuess = CDec(textGuess.Text)

должно быть

decGuess = CInt(textGuess.Text)

, так как если вы введете десятичную дробь, вы никогда не сможете угадать число


Причина, по которой программа всегда выводит «правильное», состоит в том, что вместо того, чтобы изменять свое предположение, чтобы оно совпадало со случайным числом, компьютер «угадывает» ваше предположение, изменяя случайное число, чтобы оно в конечном итоге стало ваше предположение, увеличивая число догадок каждый раз.

UPDATE:

Причина, по которой ваша новая кнопка не работает, заключается в том, что она не обрабатывает щелчок. Предполагая, что вы нажали новую кнопку btnNew, попробуйте заменить:

Private Sub btnNew_Click_1(sender As Object, e As EventArgs)

с:

Private Sub btnNew_Click_1(sender As Object, e As EventArgs) Handles btnNew.Click

В следующий раз при добавлении подпрограммы для нажатия кнопок попробуйте дважды щелкнуть кнопку в представлении дизайна в Visual Studio. Это автоматически сгенерирует подпрограмму click.

Другая проблема, с которой вы столкнулись, заключается в том, что вы не генерировали случайное число при загрузке формы. Чтобы решить эту проблему, дважды щелкните форму в представлении конструктора, чтобы сгенерировать подпрограмму загрузки, а затем программно нажмите кнопку

.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    btnNew.PerformClick()
End Sub

также, благодаря комментарию Джими, не забудьте установить intCount в 0 при нажатии btnNew

...