СДЕЛАЙ САМ, ИЛИ "ПЯТНАДЦАТЬ" В КОМПЬЮТЕРЕ
И. Кулик.
Увлекательность компьютерных игр общеизвестна, и у большинства из нас есть среди них любимые. Новыми играми "разживаемся" мы, как правило, либо приобретая их "на диске", либо переписывая у знакомых. Однако существует и иной, гораздо более увлекательный путь: "построить" компьютерную игру самостоятельно. В качестве первого опыта мы предлагаем вам создать в компьютере хорошо известную игру-головоломку "Пятнадцать", воспользовавшись программой, которую написал Игорь Кулик, учащийся 11-го класса школы №27 г. Москвы.
Чуть-чуть истории
Игра в "Пятнадцать" появилась на свет в 70-х годах XIX века, и популярность ее долгое время была не меньше, чем у знаменитого кубика Рубика. Придумал ее известный американский изобретатель головоломок Сэмюэл Ллойд. Успеху новинки немало помогло напечатанное тогда во многих газетах объявление о (огромном по тем временам) призе в тысячу долларов за решение варианта головоломки, изображенного на рис. 1. По условиям требовалось: передвигая на пустую клетку, но не вынимая фишки из коробочки, поменять местами номера 15 и 14 так, чтобы все числа расположились по порядку. Однако, помещая это объявление, Ллойд знал, что задача неразрешима!
Маленькое предисловие
В отличие от "задачи" Ллойда представленная программа написана так, что она не предложит вам неразрешимых вариантов.
Для создания игры не потребуется знаний в области программирования и особого опыта работы на компьютере. Скорее это будет опыт накопления навыков в пользовании компьютером. Предлагаемая вашему вниманию программа написана на языке Microsoft Visual Basic.
В результате всех стараний должен появиться результат, показанный на рис. 2. Итак, запаситесь терпением, и в путь.
Установка Visual Basic
(Этот пункт могут пропустить те, у кого Visual Basic уже установлен.)
Прежде всего, нам понадобится приобрести диск с установочной программой Visual Basic версии 6 и выделить свободное место на винчестере. Его потребуется как минимум 50 МБ, но с учетом возможной установки дополнительных компонентов лучше зарезервировать около 100 МБ.
После того как установочный диск будет вставлен в дисковод, в машине запустится программная оболочка, что отразится на экране. В появившемся списке программ выбираем Visual Basic, запускаем установку и ждем, пока не появится окно со словами приветствия. Затем однократно нажимаем левой кнопкой мыши на кнопку <Next>, выбираем из двух переключателей <I accept the agreement>, нажимаем <Next> и в поле <ID Number> вводим серийный номер, который был указан в оболочке (обычно 1111111111).
Левой кнопкой мыши два раза подряд щелкаем <Next>, немного ждем и нажимаем сначала <Continue>, а потом <OK>. Из двух предложенных кнопок выбираем <Custom> и снимаем все флажки, кроме "Microsoft Visual Basic 6" , "ActiveX", "Tools" и "Graphics". И, наконец, нажимаем <Continue>. Все! Осталось только выждать несколько минут, пока копируются файлы. (Если программа установки потребует каких-либо разъяснений и начнет задавать вопросы, смело нажимайте на <OK>, <Continue> или <Yes>).
Знакомимся с окнами
Завершив установку, приступаем к следующему этапу - запускаем среду разработки Visual Basic'a (Пуск ->Программы ->Visual Basic 6.0 ->Visual Basic 6.0).
Когда на экране появляется окно выбора типа проекта, выбираем "Standard EXE", нажав кнопку <Открыть > (рис. 3).
Теперь перед нами открывается окно будущей программы (рис. 4) - форма. Она является полноценным приложением Windows, то есть ее можно свернуть, развернуть, закрыть, перемещать по экрану и т. д. Более того, можно даже запустить "программу" при помощи кнопки , расположенной на панели инструментов.
Если же появившееся окно закрыть, мы опять попадем в среду разработки (IDE). Теперь рассмотрим, какие в ней представлены окна и для чего они служат:
Toolbox - одно из наиболее часто употребляемых окон. Оно расположено в левой части экрана и содержит доступные элементы управления - кнопки, переключатели и т. п.
Project Explorer - окно, расположенное справа вверху. С его помощью происходит переключение между частями проекта: формами, модулями, классами и т. п. Нам оно пригодится, чтобы переключиться из окна для ввода текста программы в форму приложения. Для этого достаточно дважды щелкнуть левой кнопкой мыши по строке, которая на рис. 4 обведена пунктирной рамкой.
Properties Window - расположено внизу справа. Отличительная особенность этого окна - находящийся в нем огромный список. Это очень важное окно, поскольку в нем устанавливаются свойства объектов . Например, надпись (свойство) у кнопки (у объекта) задается свойством "Caption".
Что касается остальных окон, то они в данный момент не включены и нам не понадобятся.
Теперь, собственно, можно приступать к созданию игры.
"Пятнадцать" - шаг за шагом
I. Создание окна
Прежде всего, необходимо сохранить наш проект. Для этого нужно щелкнуть по кнопке на панели инструментов и выбрать любое удобное место для сохранения файлов. (В дальнейшем, чтобы обратиться к ним, достаточно щелкнуть по кнопке , указать, где именно были сохранены файлы, и открыть нужный проект).
Далее присвоим нашему окну удобный заголовок, например "Пятнадцать". Для этого необходимо изменить свойство "Caption": делаем одиночный щелчок по форме (то есть по будущему окну), в окне свойств (Properties Window) выбираем строку "Caption" и вводим справа слово "Пятнадцать" (без кавычек), предварительно удалив высветившееся там ранее слово.
Но изменить заголовок окна - еще не все. Нам предстоит задать и множество других свойств, последовательно их выбирая.(табл.1)
II. Создание элементов управления
Первое, что нужно сделать, - создать ячейки будущей игры, в которых в дальнейшем разместятся цифры. Для этого воспользуемся элементами "Label". Сначала щелкаем два раза по значку A в окне "Toolbox". Когда на форме появится элемент с именем "Label1", предназначенный для отображения надписи, зададим ему следующие свойства: (табл.2)
Далее, дважды щелкнув на значке (в окне "Toolbox"), создаем на форме элемент Timer, который будет отсчитывать продолжительность игры. Устанавливаем для него следующие свойства: (табл.3)
Далее нужно создать еще один элемент Label, который будет отображать время игры, и присваиваем его свойствам следующие значения: (табл.4)
Теперь, когда созданы все элементы окна, оно должно приобрести примерно такой вид, как это изображено на рис. 5.
III. Создание меню
Меню окна создается при помощи окна "Menu Editor". Щелкнув по значку на панели инструментов (предварительно сделайте одиночный щелчок по форме), вы вызовете на экран окно редактора меню (рис. 6).
В верхней части окна располагаются два текстовых поля - "Caption" и "Name". Поле "Caption" отвечает за надпись в строке меню, а "Name" - за его имя.
Введите в поле "Caption" слово "Игра", в поле "Name" - "mnuGame". Затем щелкните по кнопке "Next", а потом по кнопке, отмеченной значком . Далее значения "Caption" и "Name" вводятся из приведенной ниже таблицы. После введения каждого очередного значения "Caption" и "Name" следует нажать кнопку "Next". А по завершении ввода всех значений нажмите кнопку "OK" и обязательно сохраните созданный проект, причем имейте в виду, что теперь окно сохранения уже не появится.(табл.5)
Наконец-то окно для "Пятнашек" создано, и мы можем приступить к следующему этапу работы - вводу текста программы.
Пишем текст
Для того чтобы ввести в наш проект текст программы, нужно прежде всего дважды щелкнуть по форме левой кнопкой мыши, то есть вызвать на экран компьютера стандартное текстовое окно.
Затем мы открываем "Блокнот " и в нем точно и аккуратно набираем приведенный далее текст. (При этом комментариями и отступами можно пренебречь, но если во время набора будут допущены ошибки, то в тексте с отступами их гораздо легче найти.)
Итак, пишем:
Dim Size As Integer
`объявляем переменную для размера поля
Dim First As Boolean
`настройки хранятся в реестре, в ключе ->
`HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings\15Game\)
Private Sub Form_Initialize()
Size = Val(GetSetting("15Game", "Options", "Size", "4"))
`читаем размер поля
For Y = 1 To Size
For X = 1 To Size
Load lblCell(Index)
lblCell(Index).Top = lblCell(1000).Width * Y + 5
`положение ячейки по оси Y
lblCell(Index).Left = lblCell(1000).Height * X - 29
`положение ячейки по оси X
lblCell(Index).Visible = True
`видимость ячейки - да
Index = Index + 1
`увеличиваем индекс ячейки на 1
Next X
Next Y
`загружаем ячейки
Width = ScaleX(lblCell(Size ^ 2 - 1).Left + lblCell(1000).Width + 10, vbPixels, vbTwips)
`ширина окна
Height = ScaleY(lblCell(Size ^ 2 - 1).Top + lblCell(1000).Height*2 + 10, vbPixels, vbTwips)
`высота окна
lblTime.Left = (ScaleWidth - lblTime.Width) / 2
`положение счетчика времени по оси Х
End Sub
Private Sub mnuNewGame_Click()
Randomize Timer
`запускаем генератор случайных чисел
If First = False Then
For i = 0 To Size ^ 2 - 1
Unload lblCell(i)
Next i
`выгружаем ячейки, чтобы загрузить новые
Call Form_Initialize
`вызываем функцию, которая создает ячейки и "подгоняет" окно
For i = 1 To Size ^ 2 - 1
lblCell(i - 1) = i
Next I
End If
`заполняем ячейки последовательными числами
First = True
For j = 1 To Size ^ 5
num = Int(Rnd * (Size ^ 2))
Call lblCell_Click(Val(num))
Next j
`перемешиваем фишки
Timer.Enabled = True
`запускаем счетчик времени
lblTime.Caption = 0
`выставляем на счетчике времени нулевое значение
End Sub
Private Sub lblCell_Click(Index As Integer)
If EmptyCell(Index) = -1 Then Exit Sub
`если вокруг "щелкнутой" ячейки нет пустышки, выходим
lblCell(EmptyCell(Index)).Caption = lblCell(Index).Caption
`теперь пустышка содержит число, которое раньше находилось в `"щелкнутой" ячейке
lblCell(Index) = ""
`а "щелкнутая" ячейка опустела
For i = 1 To Size ^ 2 - 1
If Val(lblCell(i - 1).Caption) <> i Then Exit Sub
`если игра проиграна, то выходим из Sub
Next I
`перебираем все ячейки подряд и смотрим, по порядку ли идут числа, то есть выиграна игра или нет?
Call CheckBestTime
`если мы оказались здесь, значит, игра выиграна, и мы проверяем результат на лучшее время
End Sub
Private Sub mnuBestTime_Click()
BestTime = GetSetting("15Game", "BestTime", "Time", "999")
`читаем имя лучшего игрока из реестра
PlayerName = GetSetting("15Game", "BestTime", "Name", "Неизвестный ")
`читаем время из реестра
MsgBox "Время: " + BestTime + vbCrLf + "Имя: " + PlayerName _
, vbInformation + vbOKOnly, "Пятнадцать"
`выводим окно с именем, временем и кнопкой <OK>
End Sub
Private Sub mnuExit_Click()
End
`выход из игры - конец программы
End Sub
Function EmptyCell(ByVal Index As Integer) As Integer
X = Index Mod Size
`вычисляем значение координаты X для "щелкнутой" ячейки
Y = Index \ Size
`вычисляем координату Y для "щелкнутой" ячейки
EmptyCell = -1
If X < Size - 1 Then
i = X + 1 + Size * Y
If lblCell(i).Caption = "" Then EmptyCell = i
`если пустышка найдена, запоминаем ее индекс
End If
If X >= 1 Then
i = X - 1 + Size * Y
If lblCell(i).Caption = "" Then EmptyCell = i
`если пустышка найдена, запоминаем ее индекс
End If
If Y >= 1 Then
i = X + Size * (Y - 1)
If lblCell(i).Caption = "" Then EmptyCell = i
`если пустышка найдена, запоминаем ее индекс
End If
If Y < Size - 1 Then
i = X + Size * (Y + 1)
If lblCell(i).Caption = "" Then EmptyCell = i
`если пустышка найдена, запоминаем ее индекс
End If
`пока пустышка не найдена, сканируем ячейки по четырем `направлениям для ее обнаружения
End Function
Private Sub mnuSize_Click()
`изменение размера поля
valSize = InputBox("Введите размер поля (3...10): ", "Пятнадцать", 4)
`вводим размер
If valSize > 10 Then valSize = 10
`30 клеток - максимальный размер игрового поля. Большее значение вводить бессмысленно
SaveSetting "15Game", "Options", "Size", valSize
`сохраняем размер в реестре
First = False
mnuNewGame_Click
`запускаем новую игру
End Sub
Private Sub Timer_Timer()
lblTime.Caption = Val(lblTime.Caption) + 1
`увеличиваем время игры на секунду
End Sub
Sub CheckBestTime()
Timer.Enabled = False
`останавливаем счетчик времени
BestTime = GetSetting("15Game", "BestTime", "Time", "999")
`читаем лучшее время прошлых игр
If Val(lblTime.Caption) < Val(BestTime) Then
`сравниваем лучшее время прошлых игр с текущим временем
PlayerName = InputBox("Ваше время лучшее среди игроков" + vbCrLf _
+ "Введите ваше имя:", "Пятнадцать")
`спрашиваем имя игрока
SaveSetting "15Game", "BestTime", "Name", PlayerName
`сохраняем имя игрока
SaveSetting "15Game", "BestTime", "Time", lblTime.Caption
`сохраняем время партии
End If
End Sub
Теперь, когда текст программы полностью набран, копируем его в буфер обмена, сворачиваем "Блокнот" и возвращаемся в Visual Basic. Перед нами вновь появится окно ввода текста. Удаляем весь имеющийся в нем текст и вставляем из буфера обмена наш текст. Затем сохраняем проект и запускаем программу. Если при этом проявятся какие-либо ошибки, то тщательно проверяем весь текст программы.
Заключительный этап
Чтобы для запуска игры "Пятнадцать" не нужно было предварительно запускать Visual Basic, игровую программу следует откомпилировать, то есть сохранить ее в исполняемый файл. Для этого в меню "File" щелкните на строке "Make Project1" (понятно, что вместо "Project1" может фигурировать любое другое имя). Укажите любое место для размещения конечного файла (с расширением .exe) и нажмите <OK>. Когда Visual Basic закончит работу, найдите на диске папку, куда вы откомпилировали программу, и из нее запустите игру. (Запускать надо файл с расширением .exe; его "личная метка" - значок, который вы присвоили окну). Теперь можно переписывать нашу программу на дискету, отправлять по электронной почте, создавать для нее ярлык на рабочем столе и т. д.
Последняя справка
Те, кому предложенный путь создания в своем компьютере игры "Пятнадцать" покажется слишком долгим или чересчур сложным, могут получить игру в готовом виде, "скачав" ее из Интернета по адресу: mcculic.nm.ru
В случае же возникновения вопросов автор готов ответить на них по электронной почте: e-mail: McCulic@Hotmail.com
Читайте в любое время