Учебный пример на Си++, Игра Виселица: Определение каркасного алгоритма игрового процесса или как правильно обобщать исходный код в блок-схемы.

В предыдущей части из списка статей по учебному примеру на Си++, игре «Виселица», мы прошлись вкратце по теме того, как начать проект с нуля и попутно обозначили все болячки новичков, а также важность работы над собой. При этом, сделали постепенную развертку самой темы предыдущей статьи, тем самым показав, как на практике это делается. Т.е., статья, по сути наглядный пример сама по себе, о чем собственно было упомянуто в самом конце пункта «Середина программы — движение механики», начиная со слов: «Однако, суть и смысл данной статьи не в этом, а в простоте и практичности свободного восприятия информации и…«. Таким образом, прочитав ранее обозначенный пункт статьи и вникнув в суть и смысл постепенной развертки или повторив на своем примере, вам, будет понятен сам подход и что, это дает на практике. Для тех же, кому трудно это понять, стоит обождать до следующей статьи «Определение начальных свойств и методов движка игры, или как правильно начать строить механику программы с нуля.», т.к. в этой части будет больше повторено на практической части программы-игры «Виселица», следовательно, что-то будет легче понять и заметить на уровне исходного кода. Однако, эта и предыдущие статьи, обязательны для прочтения, т.к. в третьей части и далее по списку статей (см. в начале статьи ссылку) исходный код будет усложняться и проявлять другие моменты в созидании программ на Си++. Разумеется, исходный код будет писать без экзотичной сложности и выпендрежа, однако не разобрав эти первые две статьи из ранее упомянутого списка, будет сложно понять дальнейшее описание, разве что тем, кто уже имеет опыт в созидании программ на практике. Однако, им это будет интересно, постольку, поскольку они через это проходили и им, явно будет интересно, как это сделано или было пройдено у других.

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

Умение «Читать программный код»

Все сталкиваются с необходимостью не только писать код, а также уметь его читать, при этом не важно, свой или код другого человека. Т.к. умение читать программный код — это не только уметь читать сам код, а также наличие усвоенного понимания того, что код может выражать несколько ситуаций выражения алгоритма(ов), также уметь применять подобный подход на практике самому. Это сродни физической тренировки, где тренируя одни мышцы, необходимо тренировать попутно и противоположные, иначе после предела дальше мышцы не натренируешь. Тут аналогично физической тренировке, чтобы читать программный код, научитесь выражать несколько алгоритмов в один последовательный программный код. Т.к. программный код — это реализация алгоритма, который был составлен до написания программного кода, а для любителей писать на ходу могу от себя, лично, добавить, что код всегда будет идти последним, т.к. без окончательной реализации алгоритма не напишется и сам код, а его еще и проверять надо. 😉

Насчет того, чем является программный код на практике, ответ был дан на половину. Однако, для саморазвития собственных навыков и умений в созидании программ этого не достаточно, т.к. половина ответа — половина, а не весь ответ. Другая половина ответа в том, что программный код выражает в исполнении все вложенные и выраженные им алгоритмы. И без, умения различать, что к чему может относиться во время чтения программного кода, будет весьма сложно разобраться в не знакомом вам коде, а порою не по силам. Почему так происходит? Ответ, проще пареной репы. Когда вы учитесь выбранному вами формальному языку, то изучает его основы и азы, а также учитесь на ходу понимать, что каждая функция и оператор могу и т.д. После всего этого, вы, становитесь, новичком в созидании программ, если у вас до этого не было опыта, накопленного на самостоятельной практике. И тут, начинается самое интересное, т.е. то, что вы до этого ни разу не то, чтобы не читали программный код, представляющий для конгломерацию (сложную систему переплетения различных систем, действующих как одно целое) алгоритмов, даже не писали ничего подобного, т.к. в учебниках или в учебных примерах этого нету, мол опыт дело наживное, справитесь. Ага, как же, самое насущное и замедляющее в накоплении опыта оставили . Мы с вами пойдем в этом учебном цикле статей другим способом, т.к. практика моей жизни показала, что сложные моменты необходимо разбирать в самом начале, а легкие моменты оставить на самостоятельное изучение, благо после обкатки с тяжелыми моментами, легкие познавать весьма и весьма интересно, т.к. проявляется постэффект выражения разнообразия выше обозначенного программного кода, который не только грамотно написан, а также дает возможность реализовать тот опыт, который был ранее недоступен на более простых программах. И самим приятно, применять собственное мастерство. Т.о., и становятся нормальными кодерами, оставляющими себе возможность прийти к полным возможностям созидания программ.

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

Ситуации при чтении алгоритма программы

Однако, представлю текстовое описание рисунков выше.

  1. Линейный ход выражения алгоритма  в программном коде, как видите рисуется одной линией, тоже самое и в программном коде, всегда только один алгоритм. Любимый способ реализации всех новичков начинающих стязю программиста, как правило не далеко ушедших от учебников или самоучителей. Также, является нормальным способом реализации, когда программа сама по себе простая и не сложная по части реализации общего алгоритма программы. И как, правило, здесь чаще всего встречается классический Си, а также процедурное программирование и т.д., характерное для последовательного программирования.
  2. Петлеобразный ход выражения алгоритма в программном коде, как видите рисуется петлями, однако остается линейным в своем движении по ходу общего алгоритма. Любимый способ реализации всех, освоивших все возможности классического Си и возможности глобальных переменных,  где применяется функциональное и последовательное программирование, а также нормальный подход к реализации алгоритма в программном коде для программ, которым достаточно функциональных возможностей языка Си. Распространенный случай всех программ старого времени и учебных примеров, для опытных и продвинутых. А также нормальный подход для процедурного программирования. Эдакий пик развития в преддверии появления объектно-ориентированного программирования (ООП).
  3. Пересекающийся ход выражения алгоритма в программном коде, как видите рисуется одними пересечениями, при этом не важно, напоминает это сетку, дерево или простые пересечения. Любимый способ программирования всех новичков, недавно освоивших азы и основы ООП в Си++. А также, нормальный способ реализации общего алгоритма в программном коде для программ, которые применяют сетевое или древовидное наследование производных классов от базовых.
  4. Специфический ход выражения алгоритма в программном коде, как видите на рисунке нарисован белый лист, это потому что вам, как и мне будет трудно вообразить усредненное представление специфического программирования. Т.к. оно зависит от специфики тех средств программирования, которые применяются. Например, в АСУ ТП переменные могут в трех разных программных кодах, которые между собой взаимосвязаны, т.е. один код отвечает за визуализацию, другой за исполнение, третий еще за что-то, и это все нормально для обычных переменных подобных систем. Также можно обозначить и специфичные возможности в плане директив и шаблонов, для последних есть целая книга на русском языке. Так что, умение читать код в подобных случаях, зависит от вашей работы над собой в том, чтобы разбираться в подобных спецификах и уметь их применять самому. А также, это нормальный подход к реализации общего алгоритма в программном коде, где без этого уже не обойтись. Однако, это путь далеко уже не новичка, выбравшего всерьез заняться своим делом, т.к. без проектирования тут уже не обойтись, особенно по отношению к шаблонам.
  5. Смешанный ход выражения алгоритма в программном коде, как видите на рисунке абра-кадабра. Это ваше основное впечателние от первого прочтения чужого кода, так и буквально подход, в котором применены все ранее описанные подходы реализации общего алгоритма в программном коде, каждый в своей мере. Однако, это, наиболее часто встречаемый в наше время подход, который применяется, всеми, вне зависимости от их опыта и умения «Корстылестроения», а также умения «писать код в нормах хорошего тона». И последствия, подобных кодов, ровно те же, откуда росли руки у программиста-кодера, в момент, написания, сие, чудного кода. Так что, умение читать чужой код — это не только умение его читать, а также умение попутно фильтровать мусор «криворуких программеров», и в тоже время разобраться в программном коде.

Из всего выше сказанного вы не раз натыкались на словосочетание «общий алгоритм», объяснять его в двух и более словах одного предложения будет не совсем правильно, однако подробнее будет в следующей подтеме. А о чтении скажу, что не раз буду подмечать о том, какой подход к выражению алгоритма в программном коде будет применяться. Первый учебный пример, например применяет Линейный ход реализации алгоритма в программном коде. Остальное, опыт дело — наживное, благо начальные и самые распространенные реализации алгоритмов вам уже обозначили. Остальное, зависит только от вас самих и вашей практики в этом деле.

Алгоритмы каркасов и дополнений

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

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

Каркасный алгоритм — это основной алгоритм программы, без которого алгоритмы дополнений безмысленны и не нужны, и в тоже время — это для меня первый алгоритм, который составляют при представлении, о том, что же программа будет делать по сути и смыслу. А алгоритмы дополнений — это уже те алгоритмы, которые обрабатывают более конкретные задачи, которые имеют отношение к каркасному алгоритму. Обобщая сказанное, можно сказать, что есть конкретное представление о каркасном алгоритме.

Есть и другой подход, второй, это когда примерно или в общих чертах представляю, как будет работать каркасный алгоритм и точно знаю, как будут работать алгоритмы дополнений, которые с определенной вероятностью будут применены в такой программе. Т.е. в этом случае, алгоритмы дополнений по мере своей реализации собирают по кирпичику конкретный каркасный алгоритм. Это ситуация, когда вы не уверены в том, что конкретно у вас получится и пытаетесь собрать, к примеру легковой автомобиль, которому зачем-то решили поставить тракторные колеса, в результате взяв ошибочный путь, и тем самым начав свою нелегкую и порою хардкорную стязу неуча, которых тьма тьмущая, в то время, когда накопление опыта — нормальный ход развития навыков и умений в созидании программ. Однако, хардкорных неучей полно среди американцев и европейцев, а также среди наших соотечественников, что дает им возможности стать какими-то там Джуниорами и Сеньорами, да зарабатывать много денег. Делая свои, программные откаты, по аналогии с другими откатами в нашей стране. Я могу сказать прямо, мне такое не нужно в своей основе и азах, да в практике также. Т.к. предпочитаю творить и созидать программы, а не заниматься творением и созиданием программных окатов.

Однако, это не единственный вариант, который может быть при применении второго подхода, на котором очень легко ходить вокруг да около и ставить свою нелепость и неопытность в ранг высокооплачиваемой работы (кто понимает о чем говорится, поймет, кто не знает, поймет с годами). Второй случай второго подхода происходит только тогда, когда у вас накоплен определенный опыт работы с первым подходом, т.е. вы уже примерно представляете, каким будет каркасный алгоритм и вы точно знаете, что весьма важно работать над алгоритмами дополнений. Это сути и смыслу проявление и материализация каркасного алгоритма через алгоритмы дополнений, при этом каркасный алгоритм легко написать на бумаге, т.к. он мал сам по себе. И напоминает по соотношению к алгоритмам дополнений, голый каркас, который задает направления, недостатки и вариации своих проявлений, т.к. вариаций всегда несколько, как минимум две, однако в весьма сложных случаях различений на вариации. Однако, уже понятно, как минимум направление этих дополнений и для чего они нужны. Здесь идет наработка именно каркасного алгоритма, который строится постепенно, т.к. не всегда дополнения сходятся с каркасом, последствия такого расхождения, понятное дело идут уже корректировками в алгоритмах.

Этот путь созидания в виде проб и ошибок (см. абзац выше), неизбежно приходит ко многим, когда они дозрели до своих первых ошибок в программе, выше уровня кода.

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

Исходный код

Ну что ж, применим вышеописанное к программному коду учебного примера программы-игры «Виселица». Как вы помните в первой статье данного цикла, был приведен первый код самой программы. Здесь же мы поступим аналогичным образом, т.е. проявим и выразим вышесказанное, через программный код. Однако, для начала предоставлю сам код первой статьи.

Если сильно не вчитываться в код, то не сложно заметить, что код прямо как из учебников. Т.е. последовательный во всем, где это можно, и сделано это было намеренно, в учебных целях. Тело цикла while, кстати также последовательно. Поэтому исходя из ранее описанного в данном примере применен Линейный ход выражения и проявления алгоритма программы в реализованном программном коде. Также стоит отметить, что здесь применен первый подход, т.е. подход где Каркасный алгоритм конкретно представлен и выражен, а его дополнения определяются им самим. Т.е. основа определяет дополнения, а не наоборот. Для большей наглядности, скажу что дополнения здесь, это: контроль проверок ввода правильного символа, а также дублей и разумеется цикличный повтор ввода перед игрой, т.к. вступление является лишь дополнением, а не обязательной основой. Все остальное — это каркасный алгоритм. Однако, это всего лишь учебный пример, который отражает суть и смысл работы каркасного алгоритма, поэтому нет ничего удивительного в том, что дополнений так мало. По мере дальнейшего созидания программы-игры «Виселица», каркасный алгоритм будет заметить все сложнее, а дополнения наоборот будет легко увидеть, однако их чтение усложнится тем, что они будут пересекаться выражением и проявлением своих алгоритмов.

Однако, как все, наверняка помнят, тема статьи была такая: «Определение каркасного алгоритма игрового процесса или как правильно обобщать исходный код в блок-схемы». Определить каркасный алгоритм мы с вами определили, а обобщение исходного кода не сделали. Теперь исправим это добавив соответствующие комментарии в исходный код выше.

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

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

1 уровень блоков алгоритма2 уровень блоков - Вступление программы2 уровень блоков - Игровой процесс программы-игры Виселица

В заключение

В этой статье рассказано и показано, как правильно строится программа, чтобы ее можно было впоследствии развить до полноценной программы-игры «Виселица». В том числе, как правильно, понимается само умение «Читать программный код», а также разница между алгоритмами каркасов и дополнений. И это все вкратце и по делу. Также был приведен исходный код первой статьи, которому были дополнены комментарии и даны некоторые недостающие пояснения. И помимо, всего прочего были приведены блоки алгоритма. Остальное, что вам, кажется, моей обязанностью объяснять и разжевывать, на практике является, вашей, личной, самостоятельной работой над собой. Благо, инструментов и материала в этой и предыдущей статье навалом. Доступность всего этого зависит от вашего опыта и практики. И не огорчайтесь, если что-то не понятно за короткое время или «один присест». Эта информация будет, вам, понятна со временем, при условии, что вы его себе даете. И по сути, это, ваши, поводы и причины материального выражения, чтобы вам было с чего начать свое действие на вашем пути, т.е. это ваши отправные точки.

Однако, без подобного подхода обойтись было нельзя, т.к. большинство начинающих, вечно, рвутся фиг знает куда и фиг знает зачем. Я, не хочу прилагать усилия к такому рвению новичков и давать им ход в подобном, поэтому дополняю и вкладываю в свои статьи те интересные знания и информацию, которую в основном опускают из диалога, по различным причинам. И по части, уменьшения обмена знаниями и опытом также. Следовательно, надо закрывать подобные пробелы. А самим, созидателям пробелов, задуматься над тем, что они сами приводят к безграмотности людей, которые их окружают, занимаясь подобной практикой в своей деятельности. Так что, у них нет возможности нормально предъявлять претензии по этому поводу, т.к. они сами творцы своей ситуации. Я, к такому приходить не хочу.

Ну что ж, самое тяжеленькое уже позади, т.к. в следующей статье: «Определение начальных свойств и методов движка игры, или как правильно начать строить механику программы с нуля.». Будут разбираться более конкретные и приземленные знания и информации по этой теме. Однако, полагаю, вы понимаете о соотношениях. 😉

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

И учитесь, понимать не только материально. В разы и на порядки поймете больше, написанного и того, что за всем этим не видно при материальном восприятии. Без участия потоков и не будучи в теме, сложно все это читать. Однако, никогда, не было и не будет, чтобы кто-то излишне понижая уровень знаний, что-то мог понять — это нарушает систему познаний и накопления опыта. Так что, все что могу сказать, ни пуха, ни пера. 😉

 

1,715 просмотров всего, 2 просмотров сегодня

3 комментария к “Учебный пример на Си++, Игра Виселица: Определение каркасного алгоритма игрового процесса или как правильно обобщать исходный код в блок-схемы.”

  1. Спасибо, всем тем, кто обратил свое внимание и читает эти статьи. Однако, дам только один совет. Никогда, не судите других по их первым шагам. Даже, когда через это пройдете сами. Т.к. важно не только начать и пройти, а также и то, что остается после.

    Со временем, будут и другие статьи, которые будут освещать другие интересные моменты, которые почерпнул на самостоятельной практике.

    И другое, если вам это не интересно — это еще не значит, что не интересно другим.

    З.Ы.
    Одно, для меня, всегда будет занятным.
    Всегда трудно, говорить о том, о что кажется интересным не говорить, а только применять. Однако, если так делать, то ничего интересного не будет. Со временем, тем более. 😉

  2. Спустя две недели, прочел собственную статью, встав на ваше место. И могу сказать, с радостью для себя, что статья вышла, как нормальной, так и толковой.

    ——
    Съедание букв и несколько опечаток, будут исправлены позднее, т.к. они никак не искажают статью. А упущенную часть в заключении, в самом конце, исправил.

    З.Ы.
    Приятных, вам познаний и развития, на вашем пути программиста. 🙂

  3. Внесены, некоторые поправки по части орфографии и пунктуации.

Комментарии закрыты.