Шаг 3. Добавление таймера с обратным отсчетом
В третьей части этого учебника вам предстоит добавить таймер обратного отсчета для отслеживания количества секунд, оставшихся у игрока на решение задач викторины.
Примечание |
---|
Этот раздел входит в серию учебников, посвященных основам написания кода.Общие сведения об учебнике см. в разделе Учебное руководство 2. Создание ограниченной по времени математической головоломки. |
Добавление таймера с обратным отсчетом
Добавьте целочисленную переменную с именем timeLeft точно так же, как в предыдущей процедуре.Код должен выглядеть так, как показано ниже.
Public Class Form1 ' Create a Random object called randomizer ' to generate random numbers. Private randomizer As New Random ' These integer variables store the numbers ' for the addition problem. Private addend1 As Integer Private addend2 As Integer ' This integer variable keeps track of the ' remaining time. Private timeLeft As Integer
public partial class Form1 : Form { // Create a Random object called randomizer // to generate random numbers. Random randomizer = new Random(); // These integer variables store the numbers // for the addition problem. int addend1; int addend2; // This integer variable keeps track of the // remaining time. int timeLeft;
Теперь вам необходим метод-таймер, который будет подсчитывать количество секунд и по истечении указанного времени вызывать событие.
В окне конструктора переместите элемент управления Таймер из категории Компоненты панели элементов на свою форму.
Элемент управления появляется в серой области в нижней части окна конструктора.
Щелкните в форме только что добавленный значок timer1 и установите его свойство Interval равным 1000.
Поскольку значение интервала указывается в миллисекундах, при значении 1000 событие Tick будет запускаться каждую секунду.
Двойным щелчком выберите в форме элемент управления Timer либо выделите его и нажмите клавишу ВВОД.
Появится редактор кода с отображением метода для только что добавленного обработчика событий Tick.
Добавьте в новый метод обработчика событий следующие операторы.
Private Sub Timer1_Tick() Handles Timer1.Tick If timeLeft > 0 Then ' Display the new time left ' by updating the Time Left label. timeLeft -= 1 timeLabel.Text = timeLeft & " seconds" Else ' If the user ran out of time, stop the timer, show ' a MessageBox, and fill in the answers. Timer1.Stop() timeLabel.Text = "Time's up!" MessageBox.Show("You didn't finish in time.", "Sorry!") sum.Value = addend1 + addend2 startButton.Enabled = True End If End Sub
private void timer1_Tick(object sender, EventArgs e) { if (timeLeft > 0) { // Display the new time left // by updating the Time Left label. timeLeft = timeLeft - 1; timeLabel.Text = timeLeft + " seconds"; } else { // If the user ran out of time, stop the timer, show // a MessageBox, and fill in the answers. timer1.Stop(); timeLabel.Text = "Time's up!"; MessageBox.Show("You didn't finish in time.", "Sorry!"); sum.Value = addend1 + addend2; startButton.Enabled = true; } }
Основываясь на добавленных операторах, таймер каждую секунду проверяет, истекло ли время, путем проверки того, является ли целочисленная переменная timeLeft больше 0.Если она больше 0, время еще осталось.Таймер сначала вычитает 1 из значения переменной timeLeft, а затем обновляет свойство Text элемента управления timeLabel, чтобы показать игроку, сколько осталось секунд.
Если времени не осталось, таймер останавливается и изменяет текст в элементе управления timeLabel так, чтобы он показывал Time's up! (Время вышло!). Появляется окно сообщения о том, что игра закончена, и отображается ответ — в данном случае сумма переменной addend1 и переменной addend2.Свойству Enabled элемента управления startButton устанавливается значение true, чтобы игрок мог заново запустить викторину.
Только что был добавлен оператор if else, в котором описывается, как программа принимает решение .Оператор if else представлен ниже.
Примечание Следующий пример приведен исключительно для иллюстрации; не добавляйте его в свой проект.
If (something that your program will check) Then ' One or more statements that will run ' if what the program checked is true. Else ' One or more statements that will run ' if what the program checked is false. End If
if (something that your program will check) { // One or more statements that will run // if what the program checked is true. } else { // One or more statements that will run // if what the program checked is false. }
Внимательно рассмотрите оператор, который вы добавили в блок else, чтобы отобразить ответ на задачу на сложение.
sum.Value = addend1 + addend2
sum.Value = addend1 + addend2;
Оператор addend1 + addend2 складывает значения двух переменных.Первая часть (sum.Value) использует свойство Value элемента управления NumericUpDown суммы для отображения правильного ответа.Это же свойство позднее используется для проверки ответов на головоломку.
Элемент управления NumericUpDown позволяет игрокам легко вводить числа; именно поэтому мы используем его для ответов на арифметические задачи.Все возможные ответы представляют собой целые числа в диапазоне от 0 до 100.Оставив для свойств Minimum, Maximum и DecimalPlaces значения по умолчанию, вы гарантируете, что игроки не смогут вводить десятичные знаки, отрицательные числа или слишком большие числа. (Если, например, требуется разрешить игрокам ввести 3,141, но не 3,1415, можно задать для свойства DecimalPlaces значение, равное 3.)
Добавьте три строки в конец метода StartTheQuiz(), чтобы код выглядел так, как показано ниже.
''' <summary> ''' Start the quiz by filling in all of the problem ''' values and starting the timer. ''' </summary> ''' <remarks></remarks> Public Sub StartTheQuiz() ' Fill in the addition problem. ' Generate two random numbers to add. ' Store the values in the variables 'addend1' and 'addend2'. addend1 = randomizer.Next(51) addend2 = randomizer.Next(51) ' Convert the two randomly generated numbers ' into strings so that they can be displayed ' in the label controls. plusLeftLabel.Text = addend1.ToString() plusRightLabel.Text = addend2.ToString() ' 'sum' is the name of the NumericUpDown control. ' This step makes sure its value is zero before ' adding any values to it. sum.Value = 0 ' Start the timer. timeLeft = 30 timeLabel.Text = "30 seconds" Timer1.Start() End Sub
/// <summary> /// Start the quiz by filling in all of the problem /// values and starting the timer. /// </summary> public void StartTheQuiz() { // Fill in the addition problem. // Generate two random numbers to add. // Store the values in the variables 'addend1' and 'addend2'. addend1 = randomizer.Next(51); addend2 = randomizer.Next(51); // Convert the two randomly generated numbers // into strings so that they can be displayed // in the label controls. plusLeftLabel.Text = addend1.ToString(); plusRightLabel.Text = addend2.ToString(); // 'sum' is the name of the NumericUpDown control. // This step makes sure its value is zero before // adding any values to it. sum.Value = 0; // Start the timer. timeLeft = 30; timeLabel.Text = "30 seconds"; timer1.Start(); }
Теперь при запуске головоломки переменная timeLeft устанавливается равной 30, а свойство Text элемента управления timeLabel устанавливается равным 30 секундам.После этого метод Start() элемента управления Timer начинает обратный отсчет. (Ответ пока не проверяется — это делается позже.)
Сохраните программу, запустите ее и нажмите кнопку Запуск в форме.
Таймер начинает обратный отсчет.Когда время истечет, игра закончится и появится ответ.На следующем рисунка показана головоломка в процессе игры.
Математическая головоломка в процессе игры
Продолжить или повторить пройденный материал
Следующий шаг руководства см. в разделе Шаг 4. Добавление метода CheckTheAnswer().
Предыдущий шаг руководства см. в разделе Шаг 2. Создание задачи на сложение случайных чисел.