Пишем игру "Угадай число"
с
виртуальным противником на Visual Basic
Сейчас я
расскажу, как написать игру «Угадай число»
на Visual Basic.
Наверняка вы уже видели подобные примеры, но
моя программы будет обладать одной
особенностью: в ней можно будет играть с
виртуальным соперником.
Сам я не
очень люблю язык Visual
Basic, т.к. серьезных приложений на
нем не напишешь. Гораздо больше мне нравится
Delphi – там и
работать приятнее, и интереснее, и больше
возможностей для реализации творческого
замысла. Но написать игру «Угадай число» я
решил именно в Visual
Basic – просто начинал изучать
программирование именно с этого языка, и
свою самую первую игру – «Угадай число» –
написал именно на нем.
Итак, начнем.
Сначала продумаем логику работы программы.
Компьютер должен случайным образом выбрать
число от 1 до, например, 100. После чего
бросается жребий права первого хода. Если
жребий пал на вас, то вы вводите число,
программа сравнивает введенное число с
загаданным, и сообщает, больше оно
загаданного или меньше. Затем ход передается
компьютеру, он также загадывает число, оно
проверяется на правильность, и т.д., пока
кто-нибудь не выиграет.
Запускайте
Visual Basic 6.0,
создайте новый проект и сразу сохраните его.
На первую
форму (Name =
Frm1) поместим
следующие элементы: компонент
TextBox, две
кнопки Button и
Label. Свойство
Caption у
Label изменим на
«Введите максимальное загадываемое число»,
заголовок одной кнопки измените на «Выход»,
а другой - «Войти в игру».
В коде кнопки выхода напишите:
Private Sub
Command2_Click()
End
End Sub
Теперь
создайте вторую форму. Сформируйте ее таким
образом, чтобы вверху было поле противника,
а внизу – ваше. В ней-то и будет происходить
вся игра. Поместите на форму 2 компонента «Frame»,
2 «Image» и 4 таймера. У таймеров установите
следующие свойства:
Свойство |
Таймер 1 |
Таймер 2 |
Таймер 3 |
Таймер 4 |
Name |
TimerHod |
TimerUser |
TimerKomp |
TimerRestart |
Enabled |
False |
False |
False |
False |
Interval |
1000 |
700 |
1000 |
1500 |
Теперь на вторую Frame добавьте
еще один компонент Frame (свойство Visible = False), в него
поместите поле ввода TextBox и одну кнопку Button.
Добавьте в свое поле и поле
противника по Label и хорошо растяните их.
Перейдите в первую форму и
создайте обработчик события нажатия кнопки «Старт!»:
Private Sub
Command1_Click()
If
Text1.Text = ""
Then MsgBox "Вводите
целые положительные числа меньше
256!", vbExclamation, "Riddle": Text1.Text = "":
Text1.SetFocus: Exit Sub
If
Text1.Text = "0"
Then MsgBox "Вводите
целые положительные числа меньше
256!", vbExclamation, "Riddle": Text1.Text = "":
Text1.SetFocus: Exit Sub
If
Val(Text1.Text) < 2 Then
MsgBox "Число не может быть меньше
2!", vbExclamation, "Riddle"
Me.Hide
Form3.Show
Module1.StartOnly
End Sub
Здесь проверяется, что
пользователь ввел в текстовое поле. Если там ничего нет, стоит
ноль или введенное число меньше двух, то выдается
предупреждение. Если этот этап пройден, то форма скрывается
(Me.Hide), и выполняется процедура StartOnly из модуля Module1,
которую еще предстоит написать.
Сразу напишем обработчик события
выгрузки формы (если пользователь нажмет кнопку-крестик):
Private Sub
Form_Unload(Cancel As Integer)
End
End Sub
Теперь добавляем в проект новый
модуль (Project->Add Module). Скопируйте код, приведенный ниже,
в модуль.
Option Explicit
Global
chislo As Integer ’Главное загаданное
число
Global
x
As Integer
‘Это число ввел
пользователь при старте,
‘это
максимальное загадываемое число
Global
max
As Integer,
min
As Integer
‘Максимальное и
минимальное число
Global
hod
As Byte
‘Кидаем жребий: чей
будет ход
Global
ChU
As Integer
‘Число, которое
вводит юзер при каждой попытке
‘угадать число
Global
ChK
As Integer
‘То же самое, только
число компьютера
Function
StartOnly()
x = Form2.Text1.Text
Do
Randomize Timer
chislo = Int(Rnd * (x + 1))
Loop
Until chislo <> 0
'Число загадано!
Form3.Label1.Caption = "":
Form3.Label2.Caption = "": Form3.Label3.Caption = ""
min = 0
max = x
Form3.TimerHod.Enabled =
True
End Function
Теперь переходим на вторую форму
(Name = Form3) и объявляем переменные (в самом верху кода):
Option Explicit
Dim
a As Byte
Dim
t1 As Byte, t2
As Byte, t3
As Byte
Private Sub
Form_Load()
t1 = 0
t2 = 0
t3 = 0
End Sub
Private Sub
Form_Unload(Cancel As Integer)
End
End Sub
Описываем таймеры:
Private Sub
TimerHod_Timer()
t1 = t1 + 1
If
t1 = 1 Then
Label1.Caption = "Бросаем
жребий…"
Randomize Timer
a = Int(Rnd * 2)
End If
If t1 = 2 Then
If
a = 0
Then
‘Первый ход - компьютера
Label1.Caption
= "Первый ход - компьютера"
TimerKomp.Enabled =
True
TimerHod.Enabled =
False
t1 = 0
Else
Label1.Caption
= "Первый ход - ваш"
Frame3.Visible =
True
Form3.Text1.SetFocus
TimerHod.Enabled =
False
t1 = 0
End If
End If
End Sub
Private Sub
TimerUser_Timer()
t2 = t2 + 1
If t2 = 1 Then
ChU = Text1.Text
Text1.Text = ""
Label3.Caption
= "Проверка вашего числа…"
Label2.Caption = ""
End If
If
t2 = 2 Then
If
ChU = chislo Then
Label3.Caption = "Победа"
Label1.Caption = "Загаданное
число было " + Str(chislo)
TimerUser.Enabled =
False
TimerRestart.Enabled =
True
Exit Sub
Else
If
ChU > chislo Then
Label3.Caption
= "Загаданное число меньше " + Str(ChU)
If
ChU < max Then max = ChU
TimerKomp.Enabled = True
Label1.Caption = "Ход
компьютера"
TimerUser.Enabled =
False
t2 = 0
Else
Label3.Caption
= " Загаданное число больше " + Str(ChU)
If
ChU > min
Then min = ChU
TimerKomp.Enabled =
True
Label1.Caption = "Ход
компьютера"
TimerUser.Enabled =
False
t2 = 0
End If
End If
End If
End Sub
Private Sub
TimerKomp_Timer()
t3 = t3 + 1
If
t3 = 1 Then
Do
Randomize Timer
ChK = Int(Rnd * x + 1)
Loop Until
(ChK <> 0) And (ChK >
min) And (ChK < max)
Label2.Caption = "Мое
число " + Str(ChK)
Label3.Caption = ""
End If
If t3 = 2 Then
If
ChK = chislo Then
Label2.Caption = "Я
победил!"
Label3.Caption = ""
Label1.Caption
= "Загаданное число было " + Str(chislo)
TimerKomp.Enabled =
False
TimerRestart.Enabled = True
Exit Sub
Else
If
ChK > chislo Then
Label2.Caption
= "Загаданное число меньше " + Str(ChK)
If
ChK < max Then max = ChK
Label1.Caption = "Ваш
ход"
Frame3.Visible =
True
Form3.Text1.SetFocus
TimerKomp.Enabled = False
t3 = 0
Else
Label2.Caption
= " Загаданное число больше " + Str(ChK)
If
ChK > min Then min = ChK
Label1.Caption = "
Ваш ход "
Frame3.Visible =
True
Form3.Text1.SetFocus
TimerKomp.Enabled =
False
t3 = 0
End
If
End If
End If
End Sub
Private Sub
TimerRestart_Timer()
t1 = 0
t2 = 0
t3 = 0
If
MsgBox("Хотите сыграть заново?",
vbQuestion + vbYesNo, "Riddle") = 6 Then
Module1.StartOnly
TimerRestart.Enabled = False
Else
End
End If
End Sub
Код кнопки Button1, которую нажимает
пользователь, когда пытается угадать число и вводит его
в Text1:
Private Sub
Command1_Click()
If
Not IsNumeric(Text1.Text) Then
Text1.Text = "": Text1.SetFocus:
Exit Sub
If
Text1.Text = ""
Then Text1.SetFocus:
Exit Sub
If
Val(Text1.Text) < 1 Then
Text1.Text = "": Text1.SetFocus:
Exit Sub
TimerUser.Enabled = True
Frame3.Visible =
False
End Sub
Вот и все. В заключение хочу
добавить, что код этот я написал полгода назад, а когда открыл,
то ужаснулся – сколько же в нем было ошибок! Некоторые я
исправил, но другие все еще остались. Придумайте, как
усовершенствовать программу. Можно, например, сделать не одного,
а трех виртуальных игроков, или же командную игру. Дерзайте, все
в ваших руках!