23 мар. 2015 г.

Циклы и проектирование данных

Для удобства хранения данных используются массивы (списки) и ассоциативные массивы (объекты). Важно использовать их по назначению: в списках хранятся похожие однотипные элементы, а в объектах — элементы, из которых состоит сам объект (например, объект человек состоит из элементов: имя, возраст, пол, профессия и т.д.).

В играх часто требуется проверить, попал ли снаряд в цель. Для этого сравнивают координаты снаряда и множества целей.

Если у элемента1 координаты совпадают с координатами снаряда — элемент1 уничтожен;


Если у элемента2 координаты совпадают с координатами снаряда — элемент2 уничтожен;

Если у элемента3 координаты совпадают с координатами снаряда — элемент3 уничтожен;

...и так много раз. Представляете, как сложно это сделать, когда элементов сотни, тысячи?

Когда однотипных элементов игры много, и с ними должны происходить одновременные действия, надо использовать обычный массив (список). Допустим у нас есть простой массив — список животных spisokZooparka:

spisokZooparka = [ 'lev', 'zebra', 'udav', 'akula', 'pauk' ]

Для того, чтобы узнать первый элемент списка пишем spisokZooparka[0]
А если номер хранится в переменной (например,  x = 2 ) пишем так:
spisokZooparka[x]

Если мы изменим номер в переменной (например,  x = 54 ) и запустим команду spisokZooparka[x] результат будет другой. 

Автоматический перебор элементов массива делается с помощью цикла:
 for ( ключ in массив){ что сделать за один цикл }

Например, для списка животных:

for (x in spisokZooparka){
  console.log(x);
}

Ключ (x) — это переменная, которая в первый цикл равна 0, во второй цикл — 1, и так далее.
Массив (spisokZooparka) — это переменная, в которой хранится массив. Вместо переменной можно прямо вписать и любой массив (но так обычно не делают):

for (x in ['kit', 'osminog']){
  console.log(x);
}

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

Для массива из двух элементов код сработает так:
console.log(0); // первый цикл
console.log(1); // второй цикл

Допустим, нам надо заменить удава на омара (зоопарк приобрел новое животное, а старое продал):

for (x in spisokZooparka){
  if (spisokZooparka[x] == 'udav'){
// если элемент это удав
spisokZooparka[x] = 'omar';
// записали в этот элемент новую информацию
}
}

В этом коде поочередно перебираются ключи. Когда ключ x становится равен 2, и spisokZooparka[x] становится равен 'udav' мы записываем в spisokZooparka[2]  значение  'omar'

 Сделайте самостоятельно цикл, в котором будет проверяться массив odnoklassniki:
odnoklassniki = [
{name: 'Misha', ball: 5 },
{name: 'Tosha', ball: 3 },
{name: 'Gosha', ball: 4 },
{name: 'Masha', ball: 5 },
{name: 'Sasha', ball: 4 }
]
И для элементов с пятью баллами (odnoklassniki[x].ball == 5) выведите сообщение с именем человека.

Перебор элементов ассоциативного массива (объекта) делают точно также, только ключи в цикле становятся не номерами элементов, а текстовыми ключами. Сделайте самостоятельно цикл для перебора элементов объекта:
 sobaka = {name: 'Reks', vozrast: 5, poroda: 'pudel' }
 — и  выведите поочередно все данные из ключей командой console.log()

Функции, условия и циклы являются основой современных языков программирования. Теперь мы готовы к написанию практически любых игр (в упрощенном виде).

7 комментариев:

  1. 1)массив odnoklassniki:
    odnoklassniki = [
    {name: 'Misha', ball: 5 },
    {name: 'Tosha', ball: 3 },
    {name: 'Gosha', ball: 4 },
    {name: 'Masha', ball: 5 },
    {name: 'Sasha', ball: 4 } это же ассоциативный массив??? по тексту создается впечатление что нет, т.к. как-будто ассоциативные массивы начинаем учить только со следующей строчки...

    2) Насколько я знаю в 2015 году в ECMASCRIPT 6 ввели классы - которые в ООП и принято называть обьектами... я в джаваскрипте сейчас вообще ниже плинтуса поэтому не претендую - но может самое врмя "НЕ НАЧИНАТЬ" называть ассоциативные массивы = мапы, обьектами ???

    ОтветитьУдалить
    Ответы
    1. Вообще этот урок слишком сложен. Мне кажется, ассоциативные массивы надо убрать из учебника.

      Насчет "объектов": в js ООП-объекты являются ассоциативными массивами. Ошибки не будет.

      Удалить
    2. Кхм... дайте нам максимум неделю - прежде чем убирать... попробуем с сыном все-таки пройти... Напишу отзыв как и насколько он понял идею ассоциативного массива...

      Удалить
  2. С БОООЛЬШИМ трудом ребенку далось... А то почему - вот этот массив odnoklassniki = [
    {name: 'Misha', ball: 5 },
    {name: 'Tosha', ball: 3 },
    {name: 'Gosha', ball: 4 },
    {name: 'Masha', ball: 5 },
    {name: 'Sasha', ball: 4 }
    ]
    В консоле Ф12 Хрома отобразился как массив из пяти обьектов - я вообще сказал что потом буду обьяснять...Надо как-то тут разжевать посильней... Ассоциации ... Аллегории ... примеров побольше... Я сам пока к джаваскриптеру на работе не подошел кое-чего не понимал... ( сам я тестер и пишу на джаве автотесты)...

    ОтветитьУдалить
  3. правда сыну всего 11 лет и сейчас в школе вместо бейсика учат scratch...

    ОтветитьУдалить
    Ответы
    1. А если не практиковаться, эта тема очень быстро забывается - уж слишком абстрактные вещи. Вашему сыну очень повезло - главное, чтобы не появилось отторжение. В 11 лет настоящий язык программирования - это правда сложно.

      Удалить