Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Массивы элементов управления




О х

М к

Здесь я использовал такие обозначения:

о - корабля здесь нет и сюда не стреляли

к - неподбитый корабль

х - подбитый корабль

м - мимо (стреляли и промахнулись)

Других вариантов быть не может. До окончания игры поле на экране не показывается.

Вот программа:

Dim a(1 To 2, 1 To 2) As String * 1 'Поле боя

Dim i As Integer

Dim j As Integer

Dim Подбито As Integer

______________________________________________________________________

Private Sub Command1_Click() 'Главная процедура

a(1, 1) = "о": a(2, 1) = "о" 'Поначалу на поле боя кораблей нет

a(1, 2) = "о": a(2, 2) = "о"

 

Устанавливаем_корабль 1

Устанавливаем_корабль 2

 

Подбито = 0 'Пока не стреляли

Выстрел 1

Выстрел 2

'Показываем поле боя после битвы:

For i = 1 To 2

For j = 1 To 2

Debug.Print a(i, j);

Next j

Debug.Print

Next i

Debug.Print Подбито 'Показываем исход битвы

End Sub

______________________________________________________________________

Private Sub Устанавливаем_корабль(Номер_корабля As Integer)

i = InputBox("Первый игрок, назовите номер строки корабля " & Номер_корабля)

j = InputBox("Первый игрок, назовите номер столбца корабля " & Номер_корабля)

a(i, j) = "к"

End Sub

______________________________________________________________________

Private Sub Выстрел(Номер_выстрела As Integer)

i = InputBox("Второй игрок, назовите номер строки для выстрела " & Номер_выстрела)

j = InputBox("Второй игрок, назовите номер столбца для выстрела " & Номер_выстрела)

If a(i, j) = "к" Then 'Если попал, то

a(i, j) = "х" 'ставим крестик

Подбито = Подбито + 1 'и увеличиваем счетчик подбитых кораблей

ElseIf a(i, j) = "о" Then 'иначе если промахнулся, то

a(i, j) = "м" 'ставим м

End If

End Sub

Пояснения касательно Dim a(1 To 2, 1 To 2) As String *1:

Конструкция String * 1 означает приказ компьютеру считать значения переменной a имеющими длину в 1 символ. Вообще-то можно было написать просто String, но так все-таки лучше, четче и экономнее. Теперь компьютер отведет в памяти под каждое значение a ровно 1 байт и не будет думать, хватит этого или не хватит.

Определение победителя оставляю вам.

 

Когда готова и работает программа без графики, можно подумать о том, как оживить ее графическими изображениями. Эффективнее всего создать единую процедуру, которая сначала оператором Cls все стирает с экрана, а затем все рисует снова согласно новым значениям массива a. Например, рисует во весь экран пустое поле из 4 клеток и тут же их заполняет: скажем, ставит маленькие кружочки туда, куда стреляли и промахнулись, красит красным клетки с подбитыми кораблями и синим - с неподбитыми. Для заполнения достаточно в написанном уже фрагменте, показывающем поле

For i = 1 To 2

For j = 1 To 2

Debug.Print a(i, j);

Next j

Debug.Print

Next i

вместо Debug.Print a(i, j) написать некий код такого примерно смысла:

If a(i, j) = "х" Then Крась_красным i j

If a(i, j) = "к" Then Крась_синим i j

If a(i, j) = "м" Then Рисуй_кружок i j

Здесь мы видим три процедуры с параметрами i и j, от значения которых зависят координаты кружочков на форме и закрашиваемых квадратов. Зависимость эту продумайте сами.

Что замечательно - в остальном программа от добавлении графики не изменится. Процедуру эту можно будет, не думая о графике, использовать всякий раз, когда мы хотим обновить поле на экране. Особенно это удобно в настоящем морском бое и настоящих крестиках-ноликах, когда поле надо обновлять после каждого хода.

Задача: Выстроить вдоль нижней кромки формы на равных расстояниях друг от друга 20 автомобилей, вот так:

 

 

При нажатии кнопки эти автомобили должны прыгнуть вверх, вот так:

 

 

(самый левый остается на месте).

Трудности: Нам нужно поместить на форму 20 элементов управления Image и загрузить в них картинку автомобиля, что само по себе утомительно. Расположить их вручную на равных расстояниях тоже нелегко. Visual Basic дает возможность изящно преодолеть все эти трудности программным путем.

Ваши действия: Поместите на форму один объект Image и дайте ему имя imgАвто. Загрузите в него картинку автомобиля. Обратите внимание на его свойство Index. Оно пусто. Это значит, что данный объект пока не является элементом массива объектов. Заголовок у окна свойств такой: Properties - imgАвто. Придайте свойству Index какое-нибудь целое неотрицательное значение, например 1. Тут же заголовок у окна свойств меняется: Properties - imgАвто(1). Это значит, что данный объект стал элементом массива объектов. Пока в этом массиве один элемент - imgАвто(1).

Как создать остальные объекты массива? Можно вручную, скопировав его обычным образом, как я объснял в 11.3, но отвечая на вопрос - Yes. При этом Visual Basic будет придавать новым объектам индексы от 0 и выше. Но быстрее это сделать программным путем. Так, оператор

Load imgАвто(4)

создаст (загрузит) на форме новый объект imgАвто с индексом 4. Значит, если применить оператор в цикле, он загрузит нам все нужные объекты и создаст их массив. Безо всякого объявления. Вот программа:

Dim i As Integer

Dim N As Integer 'Количество объектов

______________________________________________________________________

Private Sub Form_Load()

N = 20

'Загружаем на форму и делаем видимыми все объекты массива, кроме первого (который и так уже загружен):

For i = 2 To N

Load imgАвто(i)

imgАвто(i).Visible = True

Next

'Помещаем на свои места все объекты массива:

For i = 1 To N

imgАвто(i).Top = Height - 1000

imgАвто(i).Left = 300 * i

Next

End Sub

______________________________________________________________________

Private Sub Command1_Click()

'Прыжок всех объектов:

For i = 1 To N

imgАвто(i).Top = imgАвто(i).Top - 50 * (i - 1)

Next

End Sub

Пояснения: Как обычно, первой выполняется процедура Form_Load, которая все создает и расставляет. Затем процедура Command1_Click выполняет прыжок автомобилей.

 

Вот более "правильный" вариант той же программы, использующий процедуры с параметрами:

Dim i As Integer

Dim N As Integer

______________________________________________________________________

Private Sub Form_Load()

N = 20

'Загружаем на форму и делаем видимыми все объекты, кроме первого (который и так уже загружен):

For i = 2 To N

Load imgАвто(i)

imgАвто(i).Visible = True

Next

'Помещаем на место все объекты:

For i = 1 To N

Поместить_автомобиль_на_место i

Next

End Sub

______________________________________________________________________

Private Sub Command1_Click()

'Прыжок всех автомобилей:

For i = 1 To N

Прыжок_автомобиля i

Next

End Sub

______________________________________________________________________

'Процедура, помещающая на место один объект из массива с индексом Номер_автомобиля:

Private Sub Поместить_автомобиль_на_место(Номер_автомобиля As Integer)

imgАвто(Номер_автомобиля).Top = Height - 1000

imgАвто(Номер_автомобиля).Left = 300 * Номер_автомобиля

End Sub

______________________________________________________________________

'Процедура прыжка одного объекта из массива с индексом Номер_автомобиля:

Private Sub Прыжок_автомобиля Прыжок_автомобиля (Номер_автомобиля As Integer)

imgАвто(Номер_автомобиля).Top = imgАвто(Номер_автомобиля).Top - 50 * (Номер_автомобиля - 1)

End Sub

В процедуре Прыжок_автомобиля вы можете задавать разным автомобилям разное поведение. Например:

If Номер_автомобиля = 8 Then imgАвто(Номер_автомобиля).Top = 1000

If Номер_автомобиля = 14 Then imgАвто(Номер_автомобиля).Visible = False

 

Чтобы удалить (выгрузить) 4-й объект с формы, применяем оператор Unload imgАвто(4).

 

Обратите внимание, что теперь, работая в окне кода и пытаясь получить заготовку процедуры для обработки события, принадлежащего автомобилю, вы получите ее с параметром Index, значение которого равно индексу автомобиля, с которым происходит событие, в массиве. Это позволяет вам задавать разную реакцию автомобилей на одно и то же событие. Например, следующая процедура

Private Sub imgАвто_Click(Index As Integer)

If Index = 2 Then imgАвто(Index).Top = imgАвто(Index).Top + 200 Else imgАвто(Index).Visible = False

End Sub

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

 

Глава 14. Разные звери в одном ковчеге

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




Поделиться с друзьями:


Дата добавления: 2014-12-23; Просмотров: 378; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.023 сек.