Основы офисного программирования и документы Word

Тестирование состояний и организация диалога


Нам осталось рассмотреть еще пару важных моментов, завершающих реализацию игры. Всякий раз, когда объекты игры изменяют свое состояние, необходимо проверять, является ли оно допустимым, не может ли съесть волк козу, или коза капусту. Многократно вызываемая по ходу дела процедура TestingState осуществляет все эти проверки:

Листинг 6.14.

(html, txt)

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


Рис. 6.2.  Одна из критических ситуаций в игре "Волк, Коза и Капуста"

Заметим, что после нажатия кнопки "OK" в окне выдачи сообщения вызывается процедура InitialStates и игра возвращается в начальное состояние. Скажем еще несколько слов об организации диалога. Все константы, используемые в диалоге, собраны в разделе объявлений стандартного модуля WGCModule:

'Константы для организации диалогов Public Const Mes1 = "Ужасно, нелепо и грустно! " Public Const Mes2 = "Прекрасно, как славно, отлично! " Public Const Mes3 = " Волк съел козу! " Public Const Mes4 = " Коза съела капусту! " Public Const Mes5 = " Лодка перевернулась, и все утонули! " Public Const Mes6 = " Вам это удалось! Все переправились!" Public Const Mes7 = " Не удалось дотащить " Public Const Mes8 = " Человека! " Public Const Mes9 = " Волка! " Public Const Mes10 = " Козу! " Public Const Mes11 = " Капусту! " Public Const Mes12 = " Повторите попытку! " Public Const Mes13 = " Беда!" Public Const Mes14 = " Радость! " Public Const Mes15 = " Лодку! "

Листинг 6.15.

(html, txt)

Такой подход позволяет при необходимости легко перейти на другой язык диалога, или сделать выбор языка параметром игры. Разумно также, но я не стал этого делать, собрать все диалоги в специальной процедуре Dialogs. Я отказался также от использования объекта Assistant при ведении диалога, хотя он очень подходит для подобных игр. Последнее решение обусловлено тем, что мне хотелось в чистом виде сохранить концепцию документа - обложки, а объект Assistant является специфическим объектом Office 2000. Его использование не позволило бы перенести игру без всяких хлопот в чистый VB.


Нам осталось рассмотреть еще пару важных моментов, завершающих реализацию игры. Всякий раз, когда объекты игры изменяют свое состояние, необходимо проверять, является ли оно допустимым, не может ли съесть волк козу, или коза капусту. Многократно вызываемая по ходу дела процедура TestingState осуществляет все эти проверки:

Public Sub TestingState() 'Тестирование состояний With WGCForm 'Волк съел козу If (StateOfWolf = StateOfGoat) And (StateOfWolf <> StateOfMan) Then .Goat.Visible = False MsgBox Prompt:=Mes1 + vbCrLf + Mes3, Buttons:=vbCritical + vbOKOnly, Title:=Mes13 InitialStates End If 'Коза съела капусту If (StateOfCabbage = StateOfGoat) And (StateOfCabbage <> StateOfMan) Then .Cabbage.Visible = False MsgBox Prompt:=Mes1 + vbCrLf + Mes4, Buttons:=vbCritical + vbOKOnly, Title:=Mes13 InitialStates End If 'Слишком много пассажиров! If (CountInBoat > 2) Then If StateOfMan = "InBoat" Then .Man.Visible = False If StateOfWolf = "InBoat" Then .Wolf.Visible = False If StateOfGoat = "InBoat" Then .Goat.Visible = False If StateOfCabbage = "InBoat" Then .Cabbage.Visible = False MsgBox Prompt:=Mes1 + vbCrLf + Mes5, Buttons:=vbCritical + vbOKOnly, Title:=Mes13 InitialStates End If 'Конец игры - Все пассажиры собрались на правом берегу If (StateOfMan = "RightBank") And (StateOfWolf = "RightBank") And _ (StateOfGoat = "RightBank") And (StateOfCabbage = "RightBank") Then MsgBox Prompt:=Mes2 + vbCrLf + Mes6, Buttons:=vbExclamation + vbOKOnly, Title:=Mes14 End If End With End Sub

Листинг 6.14.

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


Рис. 6.2.  Одна из критических ситуаций в игре "Волк, Коза и Капуста"

Заметим, что после нажатия кнопки "OK" в окне выдачи сообщения вызывается процедура InitialStates и игра возвращается в начальное состояние. Скажем еще несколько слов об организации диалога. Все константы, используемые в диалоге, собраны в разделе объявлений стандартного модуля WGCModule:




' Константы для организации диалогов Public Const Mes1 = "Ужасно, нелепо и грустно! " Public Const Mes2 = "Прекрасно, как славно, отлично! " Public Const Mes3 = " Волк съел козу! " Public Const Mes4 = " Коза съела капусту! " Public Const Mes5 = " Лодка перевернулась, и все утонули! " Public Const Mes6 = " Вам это удалось! Все переправились!" Public Const Mes7 = " Не удалось дотащить " Public Const Mes8 = " Человека! " Public Const Mes9 = " Волка! " Public Const Mes10 = " Козу! " Public Const Mes11 = " Капусту! " Public Const Mes12 = " Повторите попытку! " Public Const Mes13 = " Беда!" Public Const Mes14 = " Радость! " Public Const Mes15 = " Лодку! "

Листинг 6.15.

Такой подход позволяет при необходимости легко перейти на другой язык диалога, или сделать выбор языка параметром игры. Разумно также, но я не стал этого делать, собрать все диалоги в специальной процедуре Dialogs. Я отказался также от использования объекта Assistant при ведении диалога, хотя он очень подходит для подобных игр. Последнее решение обусловлено тем, что мне хотелось в чистом виде сохранить концепцию документа - обложки, а объект Assistant является специфическим объектом Office 2000. Его использование не позволило бы перенести игру без всяких хлопот в чистый VB.


Содержание раздела