Жак Арсак
Программирование игр и головоломок
«Играйте с компьютером, это захватывает…»
«Нет ничего увлекательнее создания собственных компьютерных игр»…
Это — два привлекательных лозунга, взятые из рекламы микрокомпьютеров. Поэтому самое существенное — это создавать игру.
КТО САМ ПРОГРАММИРУЕТ СВОИ КОМПЬЮТЕРНЫЕ ИГРЫ, НАСЛАЖДАЕТСЯ ДВАЖДЫ[1]
Я уже проводил небольшое расследование в SICOB в 1984 году. Во многих торговых предприятиях я представлялся как отец, который хочет подарить своему сыну микрокомпьютер. Мне объяснили, что именно нужно купить и во сколько это мне обойдется. Затем я спрашивал об играх. И вот что, приблизительно, там происходило.
«—Так он сможет со всем этим играть?
— Да нет же, месье. Чтобы он мог играть с компьютером, он должен покупать кассеты с играми.
— Кассеты с играми? Я думал, что компьютер… А сколько стоит кассета?»
Продавец называет мне цену, которую вы, должно быть, знаете. Я отвечаю:
«— И сколько игр на кассете?
— Одна, месье.
— Но тогда двадцать игр стоят дороже самой машины! А я слышал от сведущих людей, что на компьютере интереснее всего создавать игры самому.
— Для этого, месье, нужно уметь программировать.
— Но по телевизору твердят, что это очень просто. Мой сын, должно быть, может научиться?
— Да, месье. У нас есть кассета с Бейсиком.
— Кассета с Бейсиком! Бейсик — это и есть программирование?
— Нет, месье. Чтобы уметь программировать, нужна еще вот эта кассета с языком ассемблера…»
Я удалялся, исполненный отвращения, жалкий истец отцов семейств! В другом торговом заведении я отважился утверждать, что я слышал от сведущих людей, что некоторые журналы публикуют совершенно готовые игровые программы.
«— Да, это так. Но эти игры плохо сделаны. Они не являются профессиональной работой, как наши кассеты, где вывод изображения на экран тщательно отработан. Кроме того, очень неприятно набирать тексты этих игр на клавиатуре. Так что все это не очень серьезно, что бы об этом ни говорили…»
На этот раз я поверил, что мне говорят правду. Опубликованные таким образом игры весьма посредственны по качеству. Я не поленился внимательно прочесть некоторые из них (см., например, головоломку 28). Чаще всего они плохо составлены и так плохо прокомментированы, как будто автор хочет помешать читателю понять их. Стратегия этих игр иногда более чем примитивна: я видел игру ТИК—ТАК—ТОК, где компьютер случайным образом выбирал свой игровой ход… Это издевательство над читателями!
Во всем этом совершенно отсутствует творчество. Реклама трубит: «Создавать — это увлекательно!». Но на практике все делается так, как будто подростки неспособны что-либо создавать. И им не помогают начать делать что-нибудь творческое.
Чтобы восполнить этот пробел, я и написал эту книгу. Многие подростки обучены программированию — в лицее (причем не только в таких лицеях, которые официально предоставляют обучение со специализацией по информатике, устраивая курсы по программированию), в клубах и на каникулах — с родителями, с друзьями, по книгам… Но вот что программировать на компьютере? Игры? Какие? Примеры, публикуемые в журналах и книгах, непонятны. Как они могут хоть на что-то вдохновить? А если и посмотреть вокруг, что можно найти? Шахматы, Отелло, вошек? Это слишком трудно…
Поэтому я собрал здесь описания некоторых игр, которые есть в продаже, чаще всего на Бейсике, для которых не нужны графические возможности компьютера. Я сам все эти игры реализовал на микрокомпьютере, имеющем только алфавитно-цифровой черно-белый экран и не имеющем ни светового пера, ни мыши, ни планшета. Трудность программирования обозначается звездочками «*». Начинайте с игр без звездочек. К остальным вы перейдете позже. Каждая игра допускает многочисленные вариации, которые вы легко изобретете.
Для того чтобы менее мужественные читатели могли избежать искушения сразу же читать все подробности изготовления программ, в первой части книги условие игры обычно излагается вместе с некоторыми указаниями. Если этих указаний вам недостаточно, иначе говоря, если после размышления и возможных обсуждений с товарищами вы не видите, как тронуться с места, вас выведет из затруднений «первая помощь». Если же вы опять упретесь в какую-нибудь трудность, то третья часть книги должна позволить вам достичь цели. Смелее вперед: СОЗДАВАЙТЕ.
Игры привлекательны не только для молодых людей от 14 до ? (а до скольких?). Я знаю многих взрослых, любящих играть (и сам люблю). У меня много коллег, для которых программирование и есть игра — как для меня. Я написал эту книгу для всех молодых людей от 14 до 77 лет, которые любят играть с компьютером или которые любили бы это делать, если бы средство для этого им было предоставлено.
Серьезные журналы публикуют математические развлечения для «порядочных людей». Продаются книги с логическими головоломками. Продаются обзоры стратегий. Применение компьютеров полностью обновило весь этот круг вопросов. Всем тем, кто интересуется головоломками, я предлагаю здесь новую форму головоломок: задача, решение которой нужно найти на компьютере, — это настоящая головоломка. Они бывают трех основных типов:
некоторые головоломки интересно программировать (например, зашифрованные операции, господин S и господин P, пентамино…);
некоторые задачи имеют очень простой вид, но доведение решения до программы является настоящей головоломкой (например, переставить две части вектора, найти наибольший белый прямоугольник в решетке кроссворда). Это — совершенно новый тип задач, тесно связанный с компьютером;
наконец, последний тип — настолько трудный, что я уменьшил набор его примеров, выбрав их из поистине неисчислимого множества, — связан с тем, что я говорил в начале. Вам дана программа (в нашей книге — написанная настолько хорошо, насколько это возможно), но без комментариев. Скажите, что она делает.
Трудность головоломки обозначается вопросительными знаками. Есть головоломки с довольно простыми решениями, но деликатным программированием: «?***», и есть ужасные головоломки с легким программированием: «???». Выбирайте!
Эта книга будет полезна и всем тем, кто занимается подготовкой подростков по информатике: преподавателям лицеев и колледжей, руководителям клубов или каникулярных занятий.
Я не привожу никаких решений, за исключением нескольких настолько классических случаев, что их решение исследовано всюду, или задач, решение которых является образцом, который часто встречается и который нужно знать. Изучите сначала их.
Первый раздел — немного особенный. Каковы бы ни были ваши склонности — начните с него; он даст вам инструмент, необходимый для почти всех игр и немалого числа головоломок (формирование ситуаций случайным образом).
Если вы уже перелистали книгу, то вы, может быть, заметили в ней и кое-что, похожее на математику, Признаюсь! Несколько головоломок в ней — арифметические, и их решение требует вычислений. В большей части эта книга доступна и людям, не имеющим никакой специальной математической подготовки, даже тем, кому вся эта математика внушает страх и отвращение.
Я сказал все. Теперь — вам ИГРАТЬ, вам СОЗДАВАТЬ…
Вот конструкции, используемые в программах этой книги.
Оператор присваивания. В нем используется знак «:=»
i := i + 1
Вот его аналоги на других языках:
Бейсик: LET I = I + 1
LSE: I ← I + 1
Паскаль: I := I + 1
Условный оператор имеет вид
ЕСЛИ условие ТО последовательность операторов
КОНЕЦ_ЕСЛИ
При работе условного оператора вначале проверяется условие. Если оно имеет значение ИСТИНА, то выполняется последовательность операторов, заключенная между ТО и КОНЕЦ_ЕСЛИ. КОНЕЦ_ЕСЛИ играет роль закрывающей скобки, избавляющей от применения разделителей DEBUT FIN, как на LSE, или BEGIN END, как в языке Паскаль. При работе оператора
ЕСЛИ условие ТО последовательность операторов
ИНАЧЕ последовательность операторов
КОНЕЦ_ЕСЛИ
вначале проверяется условие. Если оно имеет значение ИСТИНА, то выполняется последовательность операторов, заключенная между ТО и ИНАЧЕ, а если условие имеет значение ЛОЖЬ, то выполняется то, что содержится между ИНАЧЕ и КОНЕЦ_ЕСЛИ. Снова, как и выше, нет нужды в DEBUT FIN.
Цикл
ПОКА условие ВЫПОЛНЯТЬ
последовательность операторов
ВЕРНУТЬСЯ
выполняет последовательность операторов, заключенную между скобками ВЫПОЛНЯТЬ — ВЕРНУТЬСЯ, пока условие справедливо. Он эквивалентен циклу LSE
FAIRE номер строки ПОКА условие
последовательность операторов
n замыкающая строка
или циклу на языке Паскаль