Задать вопрос
weranda
@weranda

Как осмыслить решение задач на основе общения функций?

Приветствую

Полтора часа сидел и думал над решением такой задачи: Игра начинается с числа 0. За ход можно прибавлять к имеющемуся числу любое число от 1 до 10. Выигрывает получивший число 100. Кажется, что все просто, написал несколько функций (выбор первого хода, ход компьютера, ход человека, проверка на кол-во возможного ввода очков и пр.) и все готово, но в мыслях такой диссонанс, что доходит до ступора. Не могу понять, как правильно расставить функции и правильно организовать их общение, то ли на каждое малейшее действие написать свою функцию, то ли как-то уменьшить кол-во функций, вписав в каждую больше возможностей и тому подобное.

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

Что посоветуете в этом случае для лучшего вхождения в понимание решения сложных задач?
  • Вопрос задан
  • 300 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@abcd0x00
Сначала полное словесное описание.
Потом блок-схема по словесному описанию.
Потом псевдокод по блок-схеме.
Потом код по псевдокоду.

Все этапы делаешь на бумаге или чём там, пока они не станут выполняться в воображении. То есть, если пишешь псевдокод, то в голове уже должна быть ясная блок-схема. Если рисуешь блок-схему, то в голове должно быть полное словесное описание алгоритма. Если же пишешь код сразу, то в голове должно быть всё.

А сейчас твой псевдокод ничего из себя не представляет, поэтому и код по нему получается никакой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Функции - это инструмент, используемый для написания поддерживаемого кода, главная их задача - избавить программиста от необходимости писать одно и то же несколько раз.
Если приложить это определение к вашей задаче, становится понятно, что функции вам вообще ни к чему, забудьте о них пока.
Процесс в общем случае такой:
  1. Придумываете алгоритм решения задачи.
  2. Описываете алгоритм литературным псевдокодом.
  3. Последовательно реализуете каждый шаг псевдокода без оглядки на функции, паттерны, абстрации и все прочие наслоения (это если ваш уровень программирования реально низок; это всё-таки нужные вещи и с опытом ими всё проще жонглировать в голове).
  4. Когда программа полностью готова и работает, можно заняться оптимизацией, улучшением архитектуры и т.п.

Примерно такой алгоритм описан у Мартина в "Совершенном коде", если мне не изменяет память. Почитайте, хорошая книга. В идеале, стоит в этот процесс добавить ещё тестирование, но опять, это если голова не пухнет и без него.
Это позволяет на каждом этапе фокусироваться на том, что важно в данный момент и не забивать голову нерелевантными вещами. Есть слона по кусочкам, вот это всё.
Ответ написан
Комментировать
usdglander
@usdglander
Yipee-ki-yay
Если это игра - даже самая простейшая, то попробуйте использовать игровой цикл.
Весь игровой процесс - это один цикл. В какой то переменной хранится значение чей сейчас ход.
В цикле идет проверка:
Если ход игрока, то запрашиваем у него значение, проверяем его, и обновляем игровую ситуацию (в нашем случае - сумматор)
Если ход компьютера, то вызываем функцию хода компьютера в которую передаём текущее значение сумматора, а возвращаем число от 1 до 10.
В конце игрового цикла делаем проверку, если сумматор = 100, то победил игрок, который сейчас ходил, а если < 100 то меняем переменную "чей ход" и идём на следующий шаг цикла!
Из этого алгоритма уже можно какие то функции выделять. А вообще учите ООП сразу. :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы