В первой и второй статьи данного учебного цикла, мы вкратце прошлись по основам и азам, а также по навыкам и умениям, в том числе, у читателей была возможность принять в этом самостоятельное участие вне зависимости от того есть у них опыт и практика или нет, что является само по себе хорошей возможностью для накопления опыта и практики. как и было обещано, минимум есть.
При этом, в прошлой статье мы лишь затронули умение «читать программный код», а также его противоположное умение «писать программный код», применяя при этом разные подходы. И да, все это вкратце, т.к. на все детали, вы, насмотритесь еще при своей практике, без меня.
Однако, учтя программный код, стоит заметить, что во второй статье завершилась подготовка каркасного алгоритма, выраженного «Линейным» способом в исходном программном коде, но не произошло ожидаемых изменений в нем самом.
Это, нормально, т.к. изменения программного кода пойдут с этой статьи и закончатся пятой статьей, т.е. в течении трех статей. А шестая, внесет ощутимые изменения в визуальной части программы-игры «Виселица».
В данной статье, мы затронем основы и азы движкостроения, которые помогут переделать код программы уже на уровень Си++ и его возможностей, а не простого Си с элементами Си++, как это было видно в листингах исходного кода программы-игры «Виселица». Эти знания вам помогут не только писать игры, а также научиться понять зачем вообще это применяется в качестве основы для современных программ. И разумеется, об этом будет вкратце.
Где у программы двигатель или почему нет стартера?!
Как всем известно, программы, которые имеют движок, почему-то лишены стартеров и прочей приблуды механики. Возникает разумный вопрос: «Как же так?!». Почему эти, варвары, взяли только движок, однако остальное оставили механикам?! Ответ также прост, как и сам, наш, родной мир. Механика была для них преемственной системой определений и информации, поэтому они спокойно переняли то, что им было нужно, а остальное отбросили. Ровно, по этой причине, я не стремлюсь для вас описывать все более понятным языком, т.к. отбрасываю то, что вы можете найти самостоятельно потому, что знаю, вам, это по силам. А то, что стоит передать, в плане накопленного опыта, есть те информации и определения, которыми обмениваюсь с другими, это мой вклад. Теже, кто говорят, что автор днище, по сути сами заявляют, что они — днища. Я намеренно, не убрал эти строки, потому что частью моих обязательств, быть самим собою. Однако, это не мешает мне меняться в своих взглядах и поступать правильно, это один из путей развития со своими ошибками. А теперь, давайте прочтем другой абзац.
Каждая система в той или иной мере является предтечей для других систем, поэтому нет ничего удивительного в таком странном названии, как «движок». И разумеется с моей стороны весьма занятно будет, описывать, что движок должен «Дрынь-Дрынь-Дрынь-Та-ТА-Та….», чтобы он работал. Т.е. мое объяснение, будет в таком случае, соответствовать канонам западного феншуя, когда знание таскают в материальной форме со всеми извратами, как неведомую хулу, а потом выбрасывают. В этой статье пойдем, нормальным путем. Задаваясь, нормальными вопросами. Вы готовы? Тогда, пойдем дальше.
Механизм программы — это механика движения, выраженная логикой исполнения компьютером. Это основа, которую всегда стоит применять отправной точкой, при условии, что хотите написать Программу, а не поделку. Разумеется есть еще одно понимание, механика — это система, состоящая из элементарных деталей и/или более простых механизмов. Заметьте, представлять все это системой нормальней, чем совокупностью фиг знает чего. Не тратьте свое время и силы на ерунду, вы не обязаны воображать, это само обязано быть понятным. Вы, не вечный двигатель строите и не метафизику со всеми абстракциями, а конкретный механизм, систему логики, которую исполняет компьютер. Наверняка, вы не задумывались о том, что на разные вещи и определения можно посмотреть столь интересным образом? Если так, то зря, много упустили.
Что ж, теперь вы знаете то, что раньше вам не говорили. А теперь, обратите внимание на то, что каждый элемент программы в этом цикле статей, по сути, элементарная деталь или простейший механизм (дополнения), а корпус механизма — это каркасный алгоритм. Все это, механизм, по сути. Однако, еще есть и смысл. Хе-хе, чего ждете, про смысл было сказано в предыдущем абзаце. 😉 Ладно, про суть и смысл механизма, что имело смысл сказать, сказал. Теперь, пойдем по самой программе.
Как механизм программы выражается на практике языком программирования в исходном коде программы
Здесь все проще паренной репы. Достаточно обратить внимание на исходный код с комментариями и блоки, которые выложены в конце второй статьи. Учитывая все ранее сказанное, в том что механизм программы — это механика движения, выраженная логикой исполнения компьютером, а также то, что механика — это система, состоящая из элементарных деталей или более простых механизмов. То, не трудно будет сказать, где что в исходном коде программы ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
#include <iostream> #include <wchar.h> using namespace std; //Сбрасывает лишние символы, т.к. ввод идет с клавиатуры inline void SbrosVvoda() { if (wcin.peek() != '\n') while (wcin.peek() != '\n') wcin.ignore(); } int main() { //Устанавливаем локаль ru_RU.UTF-8, чтобы применять русские буквы в программе. setlocale (LC_ALL,"ru_RU.UTF-8"); //Флаг выхода из бесконечного цикла, по умолчанию ставится ложь. bool isExit = false; //Символ ответа wchar_t simvol = ' '; //--------------------Вступление программы-------------------------------------- //Вступительный текст программы-игры "Виселица". wcout << L"Привет, пользователь. Давай сыграем в игру \"Виселица\", правила которой просты.\n Я, программа, загадываю слово, а ты его отгадываешь по буквам. Если ошибешься десять раз, то проиграешь.\n Слово будет состоять из букв Русского алфавита.\n\n"; //Получение ответа или повтор запроса от программы while (!isExit) { //----------------------------Ввода символа-ответа------------------------------------- wcout << L"Будем играть? (Дд/Нн)"; wcin >> simvol; SbrosVvoda(); //----------------------------/Ввода символа-ответа------------------------------------- //----------------------------Проверка ввода символов-ответов------------------------------------- if (simvol != L'Д' && simvol != L'Н' && simvol != L'д' && simvol != L'н') { wcout << L"\nВведены не верные данные в качестве ответа, вводи Д или д, и Н или н!\n"; continue; } if (simvol == L'Н' || simvol == L'н') { wcout << L"\nСпасибо, за внимание. До свидания, пользователь.\n"; //Выход из программы-игры "Виселица". return 0; } else isExit = true; //----------------------------/Проверка ввода символов-ответов------------------------------------- } //--------------------/Вступление программы-------------------------------------- //--------------------Игровой процесс программы-игры Виселица-------------------------------------- //Проведение игрового процесса игры "Виселица". //Алфавит Русского языка wchar_t alhavit[33] = {L'а', L'б', L'в', L'г', L'д', L'е', L'ё', L'ж', L'з', L'и', L'й', L'к', L'л', L'м', L'н', L'о', L'п', L'р', L'с', L'т', L'у', L'ф', L'х', L'ц', L'ч', L'ш', L'щ', L'ь', L'ы', L'ъ', L'э', L'ю', L'я'}; //Счетчик для циклов short i; //Массив загаданного слова wchar_t slovo[7] = {L'ч', L'е', L'м', L'о', L'д', L'а', L'н'}; //Массив отгадываемого слова wchar_t otgSlovo[7] = {'?', '?', '?', '?', '?', '?', '?'}; //Массив букв введеных игроком, для исключения дублированного ответа. wchar_t vvedBukva[16] = {L'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}; //Индекс введенных букв. short indBukva = 0; //Флаг соответствия введенного символа буквам русского алфавита или букве в загаданном слове. bool isPravilno; //Счетчик допустимых ошибок short kolOshibok = 9; //Счетчик отгаданных букв short kolPravilno = 0; //Переинициализация Символа ответа simvol = ' '; wcout << L"Загадываю слово... Хорошо, слово на строке ниже.\n"; //Собственно, сам процесс игры while (true) { //----------------------------Проверка игровых условий------------------------------------ //Если игрок отгадал, загаданное слово, тогда поздравляем и завершаем программу. if (kolPravilno == 7) { wcout << L"Поздравляю, ты, угадал мое слово.\n"; wcout << L"Слово было такое: \""; wcout << slovo; wcout << L"\".\n"; wcout << L"Спасибо, за игру, было приятно с тобой поиграть.\n"; //Выход из программы-игры "Виселица". return 0; } //Если игрок, не угадал слово и истратил кол-во допустимых ошибок, то сообщаем ему и завершаем программу. if (kolOshibok < 0) { wcout << L"\nУвы, у тебя, закончились допустимые ошибки.\n"; wcout << L"Слово было такое: \""; wcout << slovo; wcout << L"\".\n"; wcout << L"Спасибо, за игру, было приятно с тобой поиграть.\n"; //Выход из программы-игры "Виселица". return 0; } //----------------------------/Проверка игровых условий------------------------------------ //----------------------------Игровой процесс------------------------------------------ Povtor: //Вывод отгадываемого слова на экран wcout << otgSlovo << L"\n"; //Запрос на получение ответа от игрока wcout << L"Кол-во допустимых ошибок:" << kolOshibok + 1 << ".\n"; wcout << L"Какая будет твоя буква из Русского Алфавита, пожайлуста, вводи маленькой буквой?\n"; wcin >> simvol; SbrosVvoda(); //----------------------------/Игровой процесс------------------------------------------ //----------------------------Проверка ввода символов------------------------------------- //Проверка на ввод данных от пользователя isPravilno = false; for (i=0; i < 33; i++) if (simvol == alhavit[i]) { isPravilno = true; break; } if (!isPravilno) { wcout << L"\nВведены неверные данные.\n\n"; goto Povtor; } //----------------------------/Проверка ввода символов------------------------------------- //----------------------------Проверка ввода дублей------------------------------------- //Проверка на повторение выбранной буквы for (i=0; i < 15; i++) if (simvol == vvedBukva[i]) { wcout << L"\nЭта буква, уже была введена, введи другую букву.\n\n"; goto Povtor; } //----------------------------/Проверка ввода дублей------------------------------------- //----------------------------Проверка игровых условий------------------------------------ //Сравнение введеной буквы игроком с буквами загаданного слова isPravilno = false; for (i=0; i<7; i++) if (simvol == slovo[i]) { wcout << L"Правильно, есть такая буква в загаданном слове.\n\n"; otgSlovo[i] = slovo[i]; kolPravilno++; isPravilno = true; break; } if (!isPravilno) { wcout << L"Не правильно, такой буквы в загаданом слове нет.\n\n"; kolOshibok--; }; //----------------------------/Проверка игровых условий------------------------------------ //----------------------------Проверка ввода дублей------------------------------------- //Запоминаем введенную букву vvedBukva[indBukva] = simvol; indBukva++; //----------------------------/Проверка ввода дублей------------------------------------- } //--------------------/Игровой процесс программы-игры Виселица-------------------------------------- //--------------------------------------------- //Выход из программы-игры "Виселица". return 0; } |
Как видите из исходного кода стоит выделить несколько моментов, относящихся к самому механизму программы-игры «Виселица». Проверка игровых условий по любому стоит вынести в отдельную механику, как и игровой процесс. Остальное, либо дополнения, либо части других механик. Ответ на вопрос: «Почему так?», прост и понятен, потому что первым переносится в класс механизма то, что очевидно. А потом, дополняется тем, чего не было в начале.
Помните, первый пример и что он выражает? Правильно, он выражает саму суть игры. Остальное лишь детали. Когда научитесь выделять одно от другого, тогда поймете саму крамольную суть созидания механизма программы. В каждой материальности, ценность имеет лишь то, малое, что этой материальностью выражено.
Однако слова, словами, а дело практикой. Теперь реализуем в нашем случае класс, который будет являться механизмом игры. Будет простым и понятным. В этом случае также учтем, что переменные нужные для сравнения будут частью этого механизма. Они будут его элементарными деталями. А более простых механизмов пока не будет. Однако они появятся в следующих статьях. Так что наш класс будет выглядеть, так.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// ============================================================================ // mechanismviselica.h // ============================================================================ // ============================================================================ // Имя программы: viselica-3 (Программа-игра "Виселица") // Авторское право (c) 2016 Смирнов Андрей Владимирович известный, как Мирра Андрюхан // Лицензия: GNU GPL 2 // Автор: Смирнов Андрей Владимирович // Почта: mirra.andryuhan@yandex.ru // Веб-сайт: http://andryuhan.ru // Лицензию можно прочитать, здесь http://www.gnu.org/licenses/old-licenses/gpl-2.0.html // ============================================================================ #include <iostream> // Уже включает в себя "wchar.h." // Библиотеку языка Си, т.к. у С++ похожие пишутся без ".h". #include <string> using namespace std; //Механизм игры "Виселица" class MechanismViselica { public: //Конструктор класса Mechanism MechanismViselica(); //Функция-свойство для передачи значения внутренней переменной kolOshibok вне класса short getKolOshibok(); //Функция-свойство для передачи значения внутренней переменной alhavit вне класса wchar_t* getAlhavit(); //Функция-свойство для передачи значения внутренней переменной otgSlovo вне класса wstring getOtgSlovo(); //Сравнение введеной буквы игроком с буквами загаданного слова void Compare(wchar_t Simvol); //Проверка условий игры bool UslIgr(); private: //Алфавит Русского языка wchar_t alhavit[33]; //Массив загаданного слова wstring slovo; //Массив отгадываемого слова wstring otgSlovo; //Флаг соответствия введенного символа букве в загаданном слове. bool isPravilno; //Счетчик допустимых ошибок short kolOshibok; //Счетчик отгаданных букв short kolPravilno; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
// ============================================================================ // mechanismviselica.cpp // ============================================================================ // ============================================================================ // Имя программы: viselica-3 (Программа-игра "Виселица") // Авторское право (c) 2016 Смирнов Андрей Владимирович известный, как Мирра Андрюхан // Лицензия: GNU GPL 2 // Автор: Смирнов Андрей Владимирович // Почта: mirra.andryuhan@yandex.ru // Веб-сайт: http://andryuhan.ru // Лицензию можно прочитать, здесь http://www.gnu.org/licenses/old-licenses/gpl-2.0.html // ============================================================================ #include "mechanismviselica.h" //Конструктор класса Mechanism MechanismViselica::MechanismViselica() { //Алфавит Русского языка alhavit[0] = L'а'; alhavit[1] = L'б'; alhavit[2] = L'в'; alhavit[3] = L'г'; alhavit[4] = L'д'; alhavit[5] = L'е'; alhavit[6] = L'ё'; alhavit[7] = L'ж'; alhavit[8] = L'з'; alhavit[9] = L'и'; alhavit[10] = L'й'; alhavit[11] = L'к'; alhavit[12] = L'л'; alhavit[13] = L'м'; alhavit[14] = L'н'; alhavit[15] = L'о'; alhavit[16] = L'п'; alhavit[17] = L'р'; alhavit[18] = L'с'; alhavit[19] = L'т'; alhavit[20] = L'у'; alhavit[21] = L'ф'; alhavit[22] = L'х'; alhavit[23] = L'ц'; alhavit[24] = L'ч'; alhavit[25] = L'ш'; alhavit[26] = L'щ'; alhavit[27] = L'ь'; alhavit[28] = L'ы'; alhavit[29] = L'ъ'; alhavit[30] = L'э'; alhavit[31] = L'ю'; alhavit[32] = L'я'; //Массив загаданного слова slovo = L"чемодан"; //Массив отгадываемого слова otgSlovo = L"???????"; //Счетчик допустимых ошибок kolOshibok = 9; //Счетчик отгаданных букв kolPravilno = 0; } //Функция-свойство для передачи значения внутренней переменной kolOshibok вне класса short MechanismViselica::getKolOshibok() { return kolOshibok; } //Функция-свойство для передачи значения внутренней переменной alhavit вне класса wchar_t* MechanismViselica::getAlhavit() { return alhavit; } //Функция-свойство для передачи значения внутренней переменной otgSlovo вне класса wstring MechanismViselica::getOtgSlovo() { return otgSlovo; } //Сравнение введеной буквы игроком с буквами загаданного слова void MechanismViselica::Compare(wchar_t Simvol) { isPravilno = false; for (short i=0; i<7; i++) if (Simvol == slovo[i]) { wcout << L"Правильно, есть такая буква в загаданном слове.\n\n"; otgSlovo[i] = slovo[i]; kolPravilno++; isPravilno = true; break; } if (!isPravilno) { wcout << L"Не правильно, такой буквы в загаданом слове нет.\n\n"; kolOshibok--; }; } //Проверка условий игры bool MechanismViselica::UslIgr() { //Если игрок отгадал, загаданное слово, тогда поздравляем и завершаем программу. if (kolPravilno == 7) { wcout << L"Поздравляю, ты, угадал мое слово.\n"; wcout << L"Слово было такое: \""; wcout << slovo; wcout << L"\".\n"; wcout << L"Спасибо, за игру, было приятно с тобой поиграть.\n"; //Выход из программы-игры "Виселица". return true; } //Если игрок, не угадал слово и истратил кол-во допустимых ошибок, то сообщаем ему и завершаем программу. if (kolOshibok < 0) { wcout << L"\nУвы, у тебя, закончились допустимые ошибки.\n"; wcout << L"Слово было такое: \""; wcout << slovo; wcout << L"\".\n"; wcout << L"Спасибо, за игру, было приятно с тобой поиграть.\n"; //Выход из программы-игры "Виселица". return true; } //Если ничего не выполнилось, то возвращаем ложь, т.к. функция обязана возвращать значение return false; } |
Как видите, ничего сложного в этом процессе нету. Все просто и понятно. От себя только добавлю, что взял вместо wchar_t* класс строк wstring, который оперирует символами wchar_t. Для того, чтобы убрать из примера возврат функций в виде wchar_t*, т.к. класс wstring создан не только для более легкой работы с wchar_t*, а также для большей читабельности программного кода, что в данном случае уместней. Остальные разъяснения по поводу wstring можно найти в интернете, т.к. тема о wstring находится вне рамок темы статьи.
А теперь, давайте посмотрим на исходный код первоначальной программы-игры «Виселица», применяющей, представленный выше, класс «MechanismViselica».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
// ============================================================================ // viselica-3.cpp // ============================================================================ // ============================================================================ // Имя программы: viselica-3 (Программа-игра "Виселица") // Авторское право (c) 2016 Смирнов Андрей Владимирович известный, как Мирра Андрюхан // Лицензия: GNU GPL 2 // Автор: Смирнов Андрей Владимирович // Почта: mirra.andryuhan@yandex.ru // Веб-сайт: http://andryuhan.ru // Лицензию можно прочитать, здесь http://www.gnu.org/licenses/old-licenses/gpl-2.0.html // ============================================================================ #include "mechanismviselica.h" //Сбрасывает лишние символы, т.к. ввод идет с клавиатуры inline void SbrosVvoda() { if (wcin.peek() != '\n') while (wcin.peek() != '\n') wcin.ignore(); } int main() { //Устанавливаем локаль ru_RU.UTF-8, чтобы применять русские буквы в программе. setlocale (LC_ALL,"ru_RU.UTF-8"); //Флаг выхода из бесконечного цикла, по умолчанию ставится ложь. bool isExit = false; //Символ ответа wchar_t simvol = ' '; //--------------------Вступление программы-------------------------------------- //Вступительный текст программы-игры "Виселица". wcout << L"Привет, пользователь. Давай сыграем в игру \"Виселица\", правила которой просты.\n Я, программа, загадываю слово, а ты его отгадываешь по буквам. Если ошибешься десять раз, то проиграешь.\n Слово будет состоять из букв Русского алфавита.\n\n"; //Получение ответа или повтор запроса от программы while (!isExit) { //----------------------------Ввода символа-ответа------------------------------------- wcout << L"Будем играть? (Дд/Нн)"; wcin >> simvol; SbrosVvoda(); //----------------------------/Ввода символа-ответа------------------------------------- //----------------------------Проверка ввода символов-ответов------------------------------------- if (simvol != L'Д' && simvol != L'Н' && simvol != L'д' && simvol != L'н') { wcout << L"\nВведены не верные данные в качестве ответа, вводи Д или д, и Н или н!\n"; continue; } if (simvol == L'Н' || simvol == L'н') { wcout << L"\nСпасибо, за внимание. До свидания, пользователь.\n"; //Выход из программы-игры "Виселица". return 0; } else isExit = true; //----------------------------/Проверка ввода символов-ответов------------------------------------- } //--------------------/Вступление программы-------------------------------------- //--------------------Игровой процесс программы-игры Виселица-------------------------------------- //Проведение игрового процесса игры "Виселица". //Объявляем объект класса и вызываем консктруктор по умолчанию //Для указателей на объект класса между именем и ; //пишут следующие, по аналогии: "new MechanismViselica()". MechanismViselica mechanism; //Счетчик для циклов short i; //Массив букв введеных игроком, для исключения дублированного ответа. wchar_t vvedBukva[16] = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}; //Индекс введенных букв. short indBukva = 0; //Флаг соответствия введенного символа буквам русского алфавита. bool isPravilno; //Переинициализация Символа ответа simvol = ' '; wcout << L"Загадываю слово... Хорошо, слово на строке ниже.\n"; //Собственно, сам процесс игры while (true) { //----------------------------Проверка игровых условий------------------------------------ if (mechanism.UslIgr()) return 0; //----------------------------/Проверка игровых условий------------------------------------ //----------------------------Игровой процесс------------------------------------------ Povtor: //Вывод отгадываемого слова на экран wcout << mechanism.getOtgSlovo() << L"\n"; //Запрос на получение ответа от игрока wcout << L"Кол-во допустимых ошибок:" << mechanism.getKolOshibok() + 1 << ".\n"; wcout << L"Какая будет твоя буква из Русского Алфавита, пожайлуста, вводи маленькой буквой?\n"; wcin >> simvol; SbrosVvoda(); //----------------------------/Игровой процесс------------------------------------------ //----------------------------Проверка ввода символов------------------------------------- //Проверка на ввод данных от пользователя isPravilno = false; for (i=0; i < 33; i++) if (simvol == (mechanism.getAlhavit())[i]) { isPravilno = true; break; } if (!isPravilno) { wcout << L"\nВведены неверные данные.\n\n"; goto Povtor; } //----------------------------/Проверка ввода символов------------------------------------- //----------------------------Проверка ввода дублей------------------------------------- //Проверка на повторение выбранной буквы for (i=0; i < 15; i++) if (simvol == vvedBukva[i]) { wcout << L"\nЭта буква, уже была введена, введи другую букву.\n\n"; goto Povtor; } //----------------------------/Проверка ввода дублей------------------------------------- //----------------------------Проверка игровых условий------------------------------------ mechanism.Compare(simvol); //----------------------------/Проверка игровых условий------------------------------------ //----------------------------Проверка ввода дублей------------------------------------- //Запоминаем введенную букву vvedBukva[indBukva] = simvol; indBukva++; //----------------------------/Проверка ввода дублей------------------------------------- } //--------------------/Игровой процесс программы-игры Виселица-------------------------------------- //--------------------------------------------- //Выход из программы-игры "Виселица". return 0; } |
Тут, как видите сами, нету сильных изменений, только перенесена та часть программного кода, о которой ранее говорилось в этой статье. Причем, отмечу, что исполнение кода, каким было, таким и осталось. Т.е. ничем не отличается от программ-игр «viselica-1» и «viselica-2«, в исполнении самой программы. Что было, целью, в данной статье по части исходного кода, помимо переноса и выделения определенной части программного кода в отдельный класс «MechanismViselica«, для последующего его развития от первоначального в полный варианты, что будет происходить в течении данного цикла статей.
Понятное дело, вам, захочется опробовать на практике исполнение вышеприведенной программы. Для этого потребуется скомпилировать и собрать программу-игру «Виселица» из нескольких файлов, чего до этого не было в цикле статей. Однако, в таких случаях для применения компиляторов GNU GCC и GNU G++ по отношению к нескольким файлам стоит применять make. Нижеприведенный, листинг файла Makefile, показывает простой способ записи данного файла для компиляции и сборки всех файлов с исходным кодом программы в один исполняемый файл, который запускается также, как предыдущие исполняемые файлы в данном цикле статей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# ============================================================================= # Makefile # ============================================================================= # ============================================================================= # Имя программы: viselica-3 (Программа-игра "Виселица") # Авторское право (c) 2016 Смирнов Андрей Владимирович известный, как Мирра Андрюхан # Лицензия: GNU LGPL 2.1 # Автор: Смирнов Андрей Владимирович # Почта: mirra.andryuhan@yandex.ru # Веб-сайт: http://andryuhan.ru # ============================================================================= viselica-3: viselica-3.o mechanismviselica.o g++ viselica-3.o mechanismviselica.o -o viselica-3 viselica-3.o: viselica-3.cpp g++ -c viselica-3.cpp mechanismviselica.o: mechanismviselica.cpp g++ -c mechanismviselica.cpp mechanismviselica.o: mechanismviselica.h clean: rm *.o |
Если же, возникают какие-то вопросы или сложности с воспроизведением программного кода программы-игры «Виселица», то в этом репозитории можно будет скачать выкладываемые мною папки по всем статьям данного цикла.
В заключение
В данной статье, нами был рассмотрен вопрос азов и основ по части сути и смысла самого механизма программы-игры, который был создан в виде каркаса середины программы в двух первых статьях. Теперь, данный алгоритм будет развиваться в представленном направлении более подробно и конкретнее в двух следующих статьях. А данная статья, служит своего рода, мостом, между двумя последующими статьями и двумя первыми, которая отражает тот самый простой и так мало описываемый момент: переход от примитивной к нормальной программе, где просто и понятно «что?», «где?», «куда?» и «как?» по части программного кода происходит в плане его изменений по мере наработки самого проекта с нуля.
Внесены, некоторые поправки, в том числе по орфографии и пунктуации, для нормализации восприятия статьи, читателями.