Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2
  1. #1
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±

    [Цикл уроков программистов] 8. Массивы

    Массивы в C++

    Массивы предназначены для хранения множества значений одного типа. Например, в программе Fahrenheit to Celsius, мы высчитывали среднее значение температуры из трёх. Если значений не три, а намного больше, то тут как раз и нужно использовать массивы.

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

    PHP код:
    int array[10]; 
    В этом коде мы определили массив с идентификатором (именем) array (массив) из десяти элементов типа int.


    В таком виде, все элементы массива ещё неинициализированы. Чтобы инициализировать их при обьявлении, нужно использовать следующий синтаксис:

    PHP код:
    int array[10] = {0123456789}; 
    При этом, первому элементу массива присваивается значение 0, а последнему - значение 9.


    Чтобы присвоить элементам массива значение, можно воспользоваться циклами. Самым подходящим для этого будет цикл for.
    PHP код:
    int array[10]; //определение массива

    for (int i 010i++)
    {
      array[
    i] = i;

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

    Заметьте, что нумерация индексов начинается с нуля. Поэтому число индексов всегда на единицу меньше числа элементов массива.

    За исключением квадратных скобок и индекса, элемент массива используется также как и любая переменная.
    Строки

    До сих пор мы могли хранить строки только в константах: "Пример константной строки". В переменных мы могли хранить только один символ - в типе char. В C++ используется два типа строк: массив элементов типа char и тип str. Сейчас мы сосредоточимся на первом варианте.

    Для хранения строки нам нужен массив. Выглядит это примерно так:

    PHP код:
    char string[7] = {'с','т','р','о'.'к','а'}; 
    К счастью есть более простой способ :)

    PHP код:
    char string[] = "строка"
    В данном случае автоматически создастся массив из семи элементов. Почему из семи? Дело в том что каждая строка должна заканчиваться символьной константой "\0", которая представляет пустой байт.

    В предыдущих примерах, если мы попытаемся ввести в массив string строку большую чем шесть символов, то произойдёт переполнение массива т.к. нельзя изменять размер массива во время выполнения программы (хотя, не всегда):
    PHP код:
    char string[7]; // string может хранить шесть символов и "\0"

    string "строка!"// в строке содержится семь символов 
    Так делать не рекомендуется :)

    Ещё один момент на который я хочу обратить ваше внимание. В случае, когда пользователь вводит строку, пробелы считаются за "\0". Мы пока не будем вводить строки в наших программах, поэтому я не буду подробно объяснять данный случай.
    Массивы массивов (двумерные массивы)

    Ну и наконец-то мы подошли к самому важному в этом выпуске.

    Карта в стратегических (и не только) играх (RTS) делится на клетки (в английском - tile, плитка). Эти клетки удобно представлять с помощью двумерного массива.

    В данном примере мы продолжим работать с программой pseudo_game и с помощью двумерного массива смоделируем карту по которой может перемещаться игрок. До сих пор "перемещиение" представлялось с помощью координат x, y.

    Клетки мы будем представлять символами. Размер "карты" - 15x20. Пятнадцать в высоту, двадцвать в ширину. Игрока мы будем представлять символом Т.

    Сначала добавьте заголовочный файл stdlib.h.
    Усовершенствованная pseudo_game

    Я приведу только куски кода. Желательно чтобы у вас перед глазами была полная программа. Найти её Вы можете в конце урока. Она компилируется и запускается. Просто скопируйте её в редактор вашей IDE и следите за текстом.

    Инициализация данных:
    PHP код:
    char act// переменная для считывания ввода пользователя
    int ch// переменная для хранения приведённого значения переменной act
    int x 0// две переменные для хранения координат игрока
    int y 0;
    char map[15][20]; // массив для хранения игровой карты

    // инициализация массива

    for (int i 015i++)
    {
      for (
    int j 020j++)
      {
        
    map[i][j] = ' ';
      }
    }

    map[0][0] = 'T'
    Здесь новым оператором для нас является определение двумерного массива. Но оно почти ничем не отличается от одномерного, просто добавляется ещё одна пара квадратных скобок. В первых скобках мы указали количество строк, во второй - количество столбцов.

    После этого в двух циклах мы инициализируем каждый элемент массива значением ' ' - это просто пробельный символ. Сначала - во внешнем цикле, мы проходим по всем строкам. Для каждой строки во внутреннем цикле мы "пробегаем" по столбцам.

    Приведу подробный пример: после нескольких итераций внешнего цикла, счётчик i становится равным 9. Начинает выполняться тело внешнего цикла: переменная j (счётчик внутреннего цикла) инициализируется нулём, проверяется условие и выполняется тело внутреннего цикла: map[9][0] = ' ';, То есть первому символу (индекс ноль) десятой строки (не забывайте что отсчёт ведётся с нуля) присваивается пробел. Затем, счётчику j присваивается 1, выполняется тело цикла... и так до тех пор пока счётчик j не станет равным 20 - условие не выполняется и происходит выход из внутреннего цикла. Затем инкрементируется внешний счётчик. Теперь он равен 10 и снова выполняется тело внешнего цикла...

    После инициализации пробелами мы в первый столбец первой строки помещаем персонажа нашей игры.

    В начале основного цикла мы вызываем функцию system() для очистки экрана от прошлого вывода.

    Затем идут два цикла похожие на циклы инициализации. Они используются для вывода элементов массива на экран. Единственным существенным отличием является вывод символа новой строки в конце тела первого цикла.

    Ну а дальше идёт ветвление в котором определяется какая клавиша нажата. Само ветвление мало изменилось с прошлого раза, а вот в содержимом блоков есть отличия: во-первых мы присваиваем координатам на которых стоит объект пробел. То есть мы очищаем предыдущее место. Затем мы изменяем одну из координат. И затем, элементу массива с новыми индексами, мы присваиваем символ "T".

    Пример для кода "75" - движение влево:
    PHP код:
    if (ch == 75)
    {
      
    map[x][y] = ' ';
      
    y--;
      
    map[x][y] = 'T';


    Ну, вот в общем и всё. На данный момент у нас есть карта 15х20 по которой с помощью стрелочек можно перемещать персонаж - букву "T". Для восьмого урока неплохо! Данное приложение станет основой для всех наших консольных программ. Никаких графических улучшений не будет. Большего из досовской консоли просто не выжать, а консоль windows мы рассматривать не будем. Это существенно сэкономит время и силы.

    Я подробно закомментировал программу pseudo_game и Вы скорее всего без труда в ней разберётесь. Если нет, то перечитывайте листинг программы и этот выпуск пока не разберётесь :). Закрепить материал вам помогут упражнения. Выполнение упражнений обязательно.
    Упражнения:

    1. В полном листинге программы я использовал ветвление switch. Здесь же показан код одного блока ветвления if. Допишите остальные блоки if.

    2. Сейчас в программе возможна запись в несуществующие элементы массива. Сделайте проверку на выход за пределы карты.

    3. Для практики создайте программу рисующую на экране два поля для морского боя. Первое - игрока, второе - противника. Второе поле должно располагаться справа от первого.
    Внутренние клетки заполняйте пробелом. Для рисования границы используйте минус и прямую разделительную черту: -, |, а для углов - решётку #. Слева от каждого поля - стобик цифр; сверху - буквы.
    Для инициализации всего поля вам может понадобиться несколько циклов. Вот как может выглядеть код для заполнения столбика цифр второго поля:
    PHP код:
    int string// переменная представляющая строки
    int column// переменная представляющая столбцы

    char map[13][30];

    column 15;
    for (
    string 2string 12string++)
    {
      
    map[string][column] = string 1;

    Листинг программы "pseudo_game"
    PHP код:
    #include <iostream> // cin, cout
    #include <clocale>  // поддержка русского языка
    #include <conio.h>  // _getch()
    #include <stdlib.h> // поддержка функции очистки экрана system("cls")

    using namespace std;

    int main()
    {

    setlocale(LC_CTYPE,"Russian"); // установка русского языка


    char act;    // переменная для хранения ввода пользователя
    int ch;      // ввод пользователя приведённый к типу int
    int x 0;   // две переменные для хранения координат пользователя
    int y 0;
    char map[15][20]; // двумерный массив для хранения игровой карты


    // блок инициализации массива
    // внешний цикл отвечает за строки
    for (int i 0i15i++)
    {
        
    // внутренний цикл отвечает за столбцы
        
    for (int j 0j20j++)
        {
            
    map[i][j] = ' ';
        }
    }

    map[0][0] = 'Т'// помещаем игровой персонаж в начало координат
    while (1)
    {
        
    system("cls"); // вызов функции очистки экрана

        
    for (int i 015i++)
        {
            for (
    int j 020j++)
            {
                
    cout << map[i][j]; // в циклах поэлементно выводится массив
            
    }
            
    cout << "\n"// переход на новую строку после каждого "ряда"
        
    }

        
    act _getch();
        
    ch static_cast<int>(act);

        switch (
    static_cast<int>(act))
        {
            case -
    32:
            break;
            case 
    27:
                exit(
    0);
            break;
            case 
    75:
                
    map[x][y] = ' '// "Убираем" объект со старой координаты
                
    y--;             // изменяем координаты
                
    map[x][y] = 'Т'// "рисуем" объект на новом месте
            
    break;
            case 
    77:
                
    map[x][y] = ' ';
                
    y++;
                
    map[x][y] = 'Т';
            break;
            case 
    80:
                
    map[x][y] = ' ';
                
    x++;
                
    map[x][y] = 'Т';
            break;
            case 
    72:
                
    map[x][y] = ' ';
                
    x--;
                
    map[x][y] = 'Т';
            break;
        }
    // конец цикла while

        
    _getch();
        return 
    0;


  2. 2 пользователя(ей) сказали cпасибо:
    vovandolg (16.10.2016) [ForD] (26.12.2013)
  3. #2
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    1)
    Код:
    if else (ch == 75) 
    { 
      map[x][y] = ' '; 
      y--; 
      map[x][y] = 'T'; 
    }
    2)
    Код:
    char string[7] = {"с","т","р","о"."к","а"};
    3) Часть кода внизу вне специальной формы:

    int string; // переменная представляющая строки
    int column; // переменная представляющая столбцы

    char map[13][30];

    column = 15;
    for (string = 2; string < 12; string++)
    {
    map[string][column] = string - 1;
    }
    Последний раз редактировалось vovandolg; 16.10.2016 в 05:37.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  4. Пользователь сказал cпасибо:
    Daniel_Cortez (16.10.2016)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •