Масиви призначені для зберігання безлічі значень одного типу. Наприклад, в програмі Fahrenheit to Celsius, ми вираховували середнє значення температури з трьох. Якщо значень не три, а набагато більше, то тут якраз і потрібно використовувати масиви.
Перш ніж використовувати масив, його потрібно визначити. Визначення масиву включає в себе: тип даних зберігаються в масиві, ім'я масиву і в квадратних дужках вказується кількість елементів масиву:
У цьому коді ми визначили масив з ідентифікатором (ім'ям) array (масив) з десяти елементів типу int.
У такому вигляді, все елементи масиву ще неініціалізованих. Щоб форматувати їх при оголошенні, потрібно використовувати наступний синтаксис:
int array [10] =;
При цьому, першому елементу масиву присвоюється значення 0, а останнім - значення 9.
Щоб привласнити елементам масиву значення, можна скористатися циклами. Найбільш підходящим для цього буде цикл for.
Тут ми звертаємося до кожного елементу масиву через індекс - число стоїть в квадратних дужках. При кожній ітерації циклу воно приймає значення від нуля до 9.
Зауважте, що нумерація індексів починається з нуля. Тому число індексів завжди на одиницю менше числа елементів масиву.
За винятком квадратних дужок і індексу, елемент масиву використовується також як і будь-яка змінна.
До сих пір ми могли зберігати рядки тільки в константах: "Приклад константної рядки". У змінних ми могли зберігати тільки один символ - в типі char. У C ++ використовується два типи рядків: масив елементів типу char і тип str. Зараз ми зосередимося на першому варіанті.
Для зберігання рядка нам потрібен масив. Виглядає це приблизно так:
На щастя є більш простий спосіб :)
char string [] = "рядок";
В даному випадку автоматично створиться масив з семи елементів. Чому з семи? Справа в тому що кожен рядок повинна закінчуватися символьної константою "\ 0", яка представляє порожній байт.
У попередніх прикладах, якщо ми спробуємо ввести в масив string рядок велику ніж шість символів, то відбудеться переповнення масиву тому не можна змінювати розмір масиву під час виконання програми (хоча, не завжди):
char string [7]; // string може зберігати шість символів і "\ 0"
string = "рядок!"; // в рядку міститься сім символів
Так робити не рекомендується :)
Ще один момент на який я хочу звернути вашу увагу. У разі, коли користувач вводить рядок, прогалини вважаються за "\ 0". Ми поки не будемо вводити рядки в наших програмах, тому я не буду детально пояснювати даний випадок.
Масиви масивів (двовимірні масиви)
Ну і нарешті ми підійшли до найважливішого в цьому випуску.
Карта в стратегічних (і не тільки) іграх (RTS) ділиться на клітини (в англійському - tile, плитка). Ці клітини зручно представляти за допомогою двовимірного масиву.
В даному прикладі ми продовжимо працювати з програмою pseudo_game і за допомогою двовимірного масиву змоделюємо карту по якій може переміщатися гравець. До сих пір "перемещіеніе" уявлялося за допомогою координат x, y.
Клітини ми будемо представляти символами. Розмір "карти" - 15x20. П'ятнадцять в висоту, двадцвать в ширину. Гравця ми будемо представляти символом Т.
Спочатку додайте заголовки stdlib.h.
Тут новим оператором для нас є визначення двовимірного масиву. Але воно майже нічим не відрізняється від одновимірного, просто додається ще одна пара квадратних дужок. У перших дужках ми вказали кількість рядків, у другій - кількість стовпців.
Після цього в двох циклах ми инициализируем кожен елемент масиву значенням '' - це просто символ пробілу. Спочатку - в зовнішньому циклі, ми проходимо по всіх рядках. Для кожного рядка у внутрішньому циклі ми "пробігаємо" за стовпцями.
Наведу детальний приклад: після кількох ітерацій зовнішнього циклу, лічильник i стає рівним 9. Починає виконуватися тіло зовнішнього циклу: змінна j (лічильник внутрішнього циклу) инициализируется нулем, перевіряється умова і виконується тіло внутрішнього циклу: map [9] [0] = '' ;, тобто першому символу (індекс нуль) десятої рядка (не забувайте що відлік ведеться з нуля) присвоюється пробіл. Потім, лічильнику j присвоюється 1, виконується тіло циклу. і так до тих пір поки лічильник j не стане рівним 20 - умова не виконується і відбувається вихід з внутрішнього циклу. Потім инкрементируется зовнішній лічильник. Тепер він дорівнює 10 і знову виконується тіло зовнішнього циклу.
Після ініціалізації пробілами ми в перший стовпець першого рядка поміщаємо персонажа нашої гри.
На початку основного циклу ми викликаємо функцію system () для очищення екрана від минулого виведення.
Потім йдуть два циклу схожі на цикли ініціалізації. Вони використовуються для виведення елементів масиву на екран. Єдиною істотною відмінністю є висновок символу нового рядка в кінці тіла першого циклу.
Ну а далі йде розгалуження в якому визначається яка клавіша натиснута. Саме розгалуження мало змінилося з минулого разу, а ось у вмісті блоків є відмінності: по-перше ми присвоюємо координатам на яких стоїть об'єкт пробіл. Тобто ми очищаємо попереднє місце. Потім ми змінюємо одну з координат. І потім, елементу масиву з новими індексами, ми присвоюємо символ "T".
Приклад для коду "75" - рух вліво:
Ну, ось в загальному і все. На даний момент у нас є карта 15х20 по якій за допомогою стрілок можна переміщати персонаж - букву "T". Для шостого уроку непогано! Цей додаток стане основою для всіх наших консольних програм. Ніяких графічних поліпшень не буде. Нічого більше досовської консолі просто не вичавити, а консоль windows ми розглядати не будемо. Це істотно заощадить час і сили.
1. У повному лістингу програми я використовував розгалуження switch. Тут же показаний код одного блоку розгалуження if. Допишите інші блоки if.
2. Зараз в програмі можлива запис в неіснуючі елементи масиву. Зробіть перевірку на вихід за межі карти.
3. Для практики створіть програму малює на екрані два поля для морського бою. Перше - гравця, друге - противника. Друге поле повинно розташовуватися праворуч від першого.
Внутрішні клітини заповнюйте прогалиною. Для малювання кордону використовуйте мінус і пряму роздільну лінію: -, |, а для кутів - грати #. Зліва від кожного поля - стобік цифр; зверху - літери.
Для ініціалізації всього поля вам може знадобитися кілька циклів. Ось як може виглядати код для заповнення стовпчика цифр другого поля:
Останнє з форуму
WapCash → Wap.cash - краще рішення для монетизації мобільного трафіку
Друзі, привіт! Ми не просто додали нового оператора MTS по Білорусії, як купа.
Edvard007 → Що робити, якщо Insorg заблокований
Шановні користувачі. Ми додали плагін для обходу блокування сайтів Insorg для брауз.
Appfoxapp → Потрібно Unity розробник на віддалену роботу
Потрібно Unity розробник на віддалену роботу, в графіку 5-2 з 10.00 до 19.00 п.
proxyan → Сервіс PROXYAN.net - купити надійні серверні проксі, швидкі HTTP / SOCKS
Акція! Активуй при оплаті промокод 6DCEBF5601DF48B7 і отримай знижку 5%. Акція дійства.
dimaCyberpunk → Гра в розробці: Chronicles of cyberpunk
Технічна частина розробки закінчена, гру можна пройти від початку до кінця. Залишилось тільки.
ZARR → мотивовані установки андроїд додатків
Сервіс для розробників андроїд додатків, пропонує найдешевші мотивовані установки.