На этом уроке мы создадим простейшую игру «Угадай число», плюс поработаем немного над ее оформлением с помощью псевдографического интерфейса.
Процесс игры
Суть игры «Угадай число» заключается в том, чтобы за определенное количество попыток суметь угадать загаданное компьютером число.
Само собой, число должно быть случайное. Количество попыток сделаем 10. Если пользователь смог угадать загаданное компьютером число за 10 или менее попыток, то на экране должно появиться сообщение «YOU WIN» - т.е. ты победил. А если все 10 попыток угадать число не увенчались успехом, на экране должно появиться сообщение «YOU LOSE» - т.е. ты проиграл. Кроме того, должна присутствовать информация о загаданном числе.
Также неплохо было бы сделать возможность выбора диапазона загадываемых чисел, например от 1 до 10, от 1 до 100, от 1 до 1000. После выбора диапазона экран должен очищаться, и должен начаться цикл запросов ввода очередного числа пользователем.
После того, как пользователь ввел очередное число, и если число не совпадает с загаданным, то на экран должно выходить сообщение, состоящее из одного слова и/или символа: «LARGER», «↑» или «SMALLER», «↓» (для вставки спецсимволов воспользуйтесь таблицей из прошлого урока). Если загаданное число больше того, что ввел пользователь, то выводится сообщение «LARGER» или «↑», а если загаданное число меньше введенного, то выводится «SMALLER» или «↓».
После того, как закончилась игра, программа должна спросить, хочет ли пользователь сыграть еще раз. Если да, то все начинается сначала, если нет, то на экране выводится «GAME OVER», и программа прекращает работу.
Генератор псевдослучайных чисел
Для того, чтобы сгенерировать случайное число, в любом языке программирования существует специальная функция. В Бейсике это RND. Эта функция генерирует псевдослучайные вещественные (дробные) числа от 0 до 1. Псевдослучайными их называют потому, что они через определенный период начинают повторяться. Для того, чтобы числа никогда не повторялись, и случайность была действительно случайностью, в начале программы необходимо записать такую конструкцию: RANDOMIZE TIMER.
Вот пример того, как это все записывается:
RANDOMIZE TIMER
PRINT RND
В результате такого кода при каждом запуске программы на экран будет выводиться случайное вещественное число от 0 до 1. Попробуйте.
Теперь необходимо научиться получать случайные числа, например, от 1 до 10. Делается это, на самом деле, просто. Достаточно умножить RND на 10. Но в этом случае мы снова получим дробное число, например, 0.45*10=4.5. Полученный результат можно округлить функциями INT() или CINT().
Предположим, мы остановимся на второй функции округления CINT(). В результате (если поэкспериментировать) у нас будут получаться числа от 0 до 10. А нам надо от 1 до 10. Это легко исправить, если немного напрячь свои извилины. Достаточно RND умножать не на 10, а на 9. Тогда диапазон случайных чисел будет получаться от 0 до 9. Теперь останется прибавить к результату 1:
n = CINT(RND * 9) + 1
В итоге мы получим желаемый диапазон случайных чисел от 1 до 10.
Разработка основного кода
Согласно процессу игры, сначала компьютер просит указать диапазон чисел. Это легко выполняется. Не забываем про генератор случайных чисел:
RANDOMIZE TIMER
PRINT “HELLO!”
PRINT “I GUESS THE NUMBER”
INPUT “FROM 1 TO (10 OR 100 OR 1000): ”, d
n = CINT(RND * (d – 1)) + 1
Далее, согласно описанию игры, экран должен очищаться. Добавляем
CLS
Теперь пользователю нужно дать всего 10 попыток. Из известных нам на данный момент инструментов программирования лучше всего сюда подойдет цикл:
FOR i = 1 TO 10
...
NEXT i
Внутри цикла мы должны запросить у пользователя число и сравнить его с загаданным. Если числа совпадают, то мы выходим из цикла до его окончания. Для этого служит команда EXIT FOR:
FOR i = 1 TO 10
INPUT “YOUR NUMBER”; a
IF a = n THEN EXIT FOR
NEXT i
Предположим, что цикл весь прошел, а число так и не угадано. Другой вариант, что мы раньше вышли из цикла, т.к. число угадано. Как понять, что нам вывести на экран: «Ты победил» или «Ты проиграл»?
Это можно сделать, например, косвенно. Если переменная «i» в цикле достигла 10, а переменная «а» не равна загаданному «n», то значит надо вывести «Ты проиграл». Иначе – «Ты победил»:
IF i = 11 AND a <> n THEN
PRINT “YOU LOSE”
ELSE
PRINT “YOU WIN”
END IF
11 – потому что переменная «i» после цикла будет равна именно этому значению.
Кстати, мы забыли реализовать вывод загаданного числа в конце программы – чтобы пользователь понимал, что загадал компьютер. Для этого добавим еще одну строку:
PRINT “I GUESS”; n
Теперь нужно сделать так, чтобы программа, получив число от пользователя и сравнив его с загаданным числом, выводила сообщения «больше» или «меньше» - см. описание процесса игры. Поэтому добавляем в условный оператор, который находится в цикле, дополнительные условные ветки:
IF a = n THEN
EXIT FOR
ELSE
IF a < n THEN PRINT “LARGER”
IF a > n THEN PRINT “SMALLER”
END IF
Оператор безусловного перехода
И, напоследок, остается реализовать возможность сыграть заново. Проще всего в Бейсике это можно реализовать с помощью оператора безусловного перехода GOTO.
Работает это так. Если мы хотим отправить процесс выполнения программы на какую-то строку кода (т.е. прервать последовательность), то достаточно нужной строке кода, на которую должно перейти выполнение, присвоить так называемую метку: число или символы. А там, откуда должен прийти процесс, написать оператор GOTO с названием метки.
Проще всего это понять на примере. В нашем случае, нам нужно в конце кода программы спросить пользователя, хочет ли он сыграть еще раз, и если он хочет, то отправить его в начало кода.
Значит, в начале кода нам нужно поставить метку. Нам нужно, чтобы процесс игры повторялся с выбора диапазона загадываемых чисел. Поэтому ставим метку сюда:
10: PRINT “I GUESS THE NUMBER”
INPUT “FROM 1 TO (10 OR 100 OR 1000): ”, d
n = CINT(RND * (d – 1)) + 1
Мы выбрали в качестве названия метки число «10». После метки обязательно должно ставиться двоеточие.
Теперь конец кода:
PRINT “PLAY AGAIN?”
20: INPUT “INPUT: 0 – NO; 1 – YES ”, p
IF p = 1 THEN
GOTO 10
ELSEIF p = 0 THEN
PRINT “GAME OVER”
ELSE
GOTO 20
END IF
Метку «20» мы сделали для того, чтобы пользователь, если введет числа, отличные от 0 или 1, переходил опять к вводу.
Вот, собственно, и вся программа. Проверьте ее работоспособность. Если что-то не работает, или работает не так, как описано, попробуйте исправить.
Разработка псевдографического интерфейса
Запустим программу, посмотрим, как выглядит результат ее работы:
После того, как вводим, например, «100», и нажимаем [Enter], экран очищается, программа загадывает число, и начинается цикл запроса чисел у пользователя. Давайте попробуем отгадать:
Завершим программу, введя ноль. Программа работает? Работает. Интересно ли ею пользоваться? В каком-то смысле – да. Но интересно ли ею пользоваться с точки зрения пользовательского опыта? Интересен ли ее интерфейс? Точно нет. Давайте это исправим. Придумаем, каким можно сделать интерфейс.
Во-первых, первый экран (там, где вводится диапазон) можно сделать более интересным. Например, поместить это все по центру, придумать рамочку, закрасить фон и т.д. Мы будем показывать только результат, реализовывать вы будете сами – вы уже должны это уметь с прошлого урока.
Вам необязательно делать все точь-в-точь как у нас, напротив – мы поощряем ваше творчество. Но сложность исполнения должна быть не ниже нашего. Вполне возможно, что придется посидеть несколько часов, а может, и дней. Но результат должен радовать.
Итак, мы оформили первый экран игры вот так:
Согласитесь, ведь намного интереснее, правда?
Далее, переходим ко второму экрану. Делаем в таком же ключе: в рамке и по центру:
Далее третий экран, сообщающий, выиграл пользователь или проиграл. Оформим сообщение вот так:
Ну, если проиграл, то логичнее написать «YOU LOSE» красным цветом:
Далее можно сделать, чтобы программа немного ожидала, прежде чем выдавать вопрос о том, сыграть ли еще раз. Для задержки в Бейсике имеется специальная команда SLEEP, которая заставляет остановить процесс выполнения программы на определенное количество секунд. В нашем случае достаточно 5 сек, поэтому перед кодом
PRINT “PLAY AGAIN?”
20: INPUT “INPUT: 0 – NO; 1 – YES ”, p
Добавляем
SLEEP 5
Далее, оформляем четвертый экран с вопросом продолжения игры:
Ну и, наконец, оформим конец игры:
Мы сделали по-простому – просто надпись желтым цветом. Но вы можете проявить фантазию.
На этом уроке мы научились использовать генератор псевдослучайных чисел, оператор безусловного перехода и команду задержки выполнения кода. На этом можно заканчивать. Вы способны уже на что-то интересное. Проявляйте творчество!
Для закрепления знаний рекомендуем выполнить все задания по данному уроку.
Комменты приветствуются, за палец вверх - отдельное спасибо!
------------------------------
Список уроков Программирование на Бейсике для начинающих
Следующий урок Циклы. Продолжение
Предыдущий урок Псевдографика
------------------------------
Задания
1. Модернизировать игру. Используя накопленные знания реализовать такую механику игры, при которой запрос ввода очередного числа будет повторяться до тех пор, пока пользователь не отгадает или введет 0 (либо просто нажмет [Enter] – что равнозначно вводу нуля).
2. Добавить счетчик попыток. В конце программы выводить его значение.
3. Добавить на экран надпись «RECORD:». Здесь отображать минимальное число попыток пользователя. Разумеется, это возможно, если пользователь играет несколько раз без перезапуска программы. Надпись должна присутствовать всегда, начиная со второй игры.