КАТЕГОРИИ: Архитектура-(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
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; Просмотров: 384; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |