Что такое массивы (списки)
Для хранения разных величин, шейпов мы использовали переменные, например:number = 4
car = Shapes.AddImage(carImage)
name = "Victoria"
Для удобства и понимания мы представляли переменную в виде коробочки, у которой есть имя, в которой хранится какое-то значение:
Но часто бывают ситуации, когда нам необходимо хранить множество объектов и величин одного типа – наборы данных: например, список с противниками, список предметов в инвентаре, список всех лечилок или монеток, список фраз у NPC и т.п.
Для этого используются одномерные и многомерные массивы.
Одномерные массивы
Рассмотрим пример одномерного массива: это массив, который называется enemies, содержащий список имён противников:В Small Basic он объявляется так:
enemies[1] = "John"
enemies[2] = "Jack"
enemies[3] = "Jane"
enemies[4] = "Rokko"
enemies[5] = "James"
enemies[6] = "Bill"
Цифры от 1 до 6 называются индексами – это порядковый номер элемента в массиве. Для того, чтобы обратиться к какому-то элементу, указывается имя массива и его индекс в нём. Например:
TextWindow.WrieLine(enemies[3]) ' Выведется Jane
Многомерные массивы
Рассмотрим пример, когда у нас в фэнтези-игре есть 3 уровня и на каждом из них может выпадать тот или иной предмет из лута (инвентаря). Для этого используем многомерный массив loot с названиями этих предметов:У этого массива есть 3 ряда по 4 элемента в каждом.
Первый индекс означает номер ряда, второй – номер элемента в этом ряду. Объявляется такой массив аналогично:
loot[1][1] = "Простой меч"
loot[1][2] = "Старый лук"
...
loot[3][4] = "Слёзы единорога"
Ассоциативные массивы
Вместо числовых индексов в массивах можно использовать текстовые значения – ключи. Такие массивы называются ассоциативными. Рассмотрим ассоциативный массив на примере списка из двух противников на уровне:У каждого из них есть свои свойства: координаты, скорость, количество жизней и урона, который они наносят и шейп, который их представляет. При помощи ассоциативного массива очень удобно обращаться со свойствами каждого противника.
Try it out
1. Математические операции с элементами массива.
Рассмотрим пример: за неделю было заработано определённое количество опыта. Эти данные записаны в виде массива. Нужно посчитать сумму полученного за неделю опыта. Используйте текстовое окно1.1. Введём в программу данные:
expa[1] = 1035
expa[2] = 467
expa[3] = 0
expa[4] = 2988
expa[5] = 3586
expa[6] = 4289
expa[7] = 11087
1.2. Сумму опыта будем хранить в переменной sumExpa:
sumExpa = 0
1.3. Для того, чтобы подсчитать сумму всех элементов мы будем использовать циклы, с каждой итерацией добавляя в сумму значение из массива:
Количество повторений столько, сколько элементов в массиве, их можно узнать при помощи команды Array.GetItemCount(expa)
For i=1 to Array.GetItemCount(expa)
sumExpa = sumExpa + expa[i]
EndFor
1.4. В конце, после цикла выведем эту сумму:
TextWindow.WriteLine("За неделю вы заработали " + sumExpa + " опыта")
Таким же образом можно совершать и другие математические операции над элементами массива.
2. Поиск в массиве по определённому критерию.
Найдём в массиве максимальное количество опыта и номер дня, в который он был заработан.2.1. Продолжим предыдущую программу, добавим две новые переменные:
sumExpa = 0
maxExpa = 0
dayMaxExpa = 0
2.2. После вывода суммы из предыдущего примера добавим ещё один цикл. Пробежимся по массиву циклом, который будет работать так:
Если в этот день было больше опыта, чем в максимальном, тогда назначим новое максимальное значение и индекс этого дня запишем, как дня с максимальным опытом:
TextWindow.WriteLine("За неделю вы заработали " + sumExpa + " опыта")
For i=1 to Array.GetItemCount(expa)
if expa[i] > maxExpa Then
maxExpa = expa[i]
dayMaxExpa = i
EndIf
EndFor
2.3. В конце, после этого цикла выведем информацию:
TextWindow.WriteLine("Наибольшее количество опыта " + maxExpa + " вы заработали на " + dayMaxExpa + " день")
3. Создание объектов и добавление их в ассоциативный массив.
3.1. Напишем инициализатор и подпрограмму-конструктор противников.Sub setup
width = 800
height = 600
GraphicsWindow.Width = width
GraphicsWindow.Height = height
' Номер первого противника
enemyIndex = 1
EndSub
Sub createEnemy
enemies[enemyIndex]["radius"] = 20
enemies[enemyIndex]["x"] = Math.GetRandomNumber(width-enemies[enemyIndex]["radius"])
enemies[enemyIndex]["y"] = Math.GetRandomNumber(height-enemies[enemyIndex]["radius"])
enemies[enemyIndex]["speedX"] = 5
enemies[enemyIndex]["speedY"] = 5
GraphicsWindow.BrushColor = "Red"
enemies[enemyIndex]["shape"] = Shapes.AddEllipse(enemies[enemyIndex]["radius"],enemies[enemyIndex]["radius"])
Shapes.Move(enemies[enemyIndex]["shape"],enemies[enemyIndex]["x"],enemies[enemyIndex]["y"])
enemyIndex = enemyIndex + 1
EndSub
3.2. Вызовем эти подпрограммы:
setup()
createEnemy()
createEnemy()
createEnemy()
3.3. Теперь с этими объектами можно проводить операции, используя циклы. Например, выведем информацию обо всех противниках:
createEnemy()
For i=1 To Array.GetItemCount(enemies)
TextWindow.WriteLine(enemies[i])
EndFor
3.4. Также мы можем теперь двигать всех противников по окну. Удалите или закомментируйте последний код из п.3.3. и добавьте:
createEnemy()
While "true"
moveEnemies()
Program.Delay(20)
EndWhile
Sub moveEnemies
For i=1 To Array.GetItemCount(enemies)
enemies[i]["x"] = enemies[i]["x"] + enemies[i]["speedX"]
enemies[i]["y"] = enemies[i]["y"] + enemies[i]["speedY"]
Shapes.Move(enemies[i]["shape"],enemies[i]["x"],enemies[i]["y"])
EndFor
EndSub
3.5*. Добавьте сами проверку отбивания противников от границ окна.
В конспект
Объявление одномерного массива:enemies[1] = "John"
enemies[2] = "Jack"
Объявление двухмерного массива:
loot[1][1] = "Простой меч"
loot[1][2] = "Старый лук"
Объявление ассоциативного массива:
enemies[1]["x"] = 455
enemies[1]["y"] = 300
Узнать количество объектов в массиве
Array.GetItemCount(enemies)
Задачи
Задача 10.1*. Измените код из 2 пункта TryItOut: теперь нужно найти минимальное количество опыта и номер этого дня.Задача 10.2*. Дополните предыдущую задачу, чтобы программа выводила не номер дня, а его название (например, понедельник, вторник и т.д.)
Задача 10.3*. Посчитать количество отрицательных элементов в массиве и вывести это число на экран. Пример массива:
[34,23,-569,-23,453,-3,0,34,-445,2,-3]
Задача 10.4*. Вывести все чётные числа массива на экран
[34,23,-569,-23,453,-3,0,34,-445,2,-3]
Задача 10.5*. Дан одномерный массив со словами. Пользователь вводит слово и если массив его содержит, программа выводит индекс этого слова. Иначе – выводит фразу, что искомое слово не найдено. Используйте для поиска метод объекта Array.
Массив: ["Rammstein","Pink Floyd","Radiohead","Nightwish","Mistral", "Portishead"]
Задача 10.6**. Дан многомерный массив лута. Напишите программу, которыя выводит название лута: с вероятностью 50% выпадает лут первого уровня, 35% – второго уровня и 15% – третьего уровня.
' лут 1 уровня
loot[1][1] = "Простой меч"
loot[1][2] = "Старый лук"
loot[1][3] = "Свиток молний"
loot[1][4] = "Мясо свинки"
' лут 2 уровня
loot[2][1] = "Щит"
loot[2][2] = "Колчан"
loot[2][3] = "Посох дедугана"
loot[2][4] = "Суп из дракона"
' лут 3 уровня
loot[3][1] = "Шльом"
loot[3][2] = "Бронь"
loot[3][3] = "Борода Гэндальфа"
loot[3][4] = "Слёзы единорога"
Задача 10.7**. Генератор историй. Программа случайно выбирает по слову из массива и собирает из них историю по шаблону: "кто" и "кто" "когда" "что делали" и это закончилось тем, что "результат". Например: "Карлсон и Годзилла в расцвет Римской империи сдавали металлолом и это закончилось тем, что Стив Джобс презентовал iPhone".
Пример массива (можете собрать слова от однокурсников):
who[1] = "Карлсон"
who[2] = "Дед Мороз"
who[3] = "Терминатор"
...
when[1] = "в расцвет Римской империи"
when[2] = "вчера"
when[3] = "когда появился мир"
...
Задача 10.8**. В код из 3 пункта TryItOut добавьте проверку на касание 3 противников к чёрному прямоугольнику 100х100 пикселей, который создайте в центре экрана. При каждом касании прячьте коснувшегося противника, а прямоугольник изменяет свой цвет на случайный.
Теперь вы готовы к проектам №4, 5, 6 и 7
Ссылка на страницу с проектами:https://fishka-it.blogspot.com/search/label/%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B
Дополнительные задачи
Доп. задача 10.1*. Дан массив, состоящий из 15 элементов целого типа. Определитьколичество отрицательных, количество положительных и количество
нулевых элементов.
Доп. задача 10.2*. Дан массив из 10 целых чисел. Посчитать сумму всех чисел массива.
Доп. задача 10.3*. Дан массив из 10 целых чисел. Найти индекс наибольшего из нечётных элементов массива.
Доп. задача 10.4*. Определить сумму и количество элементов, расположенных до первого отрицательного числа.
Доп. задача 10.5**. Определить максимальные элементы в двух массивах и поменять их местами.
Комментарии
Отправить комментарий