Ранее мы рассмотрели строки. Сегодня мы применим полученные знания на практике, разработав игру. Это будут знакомые всем с детства «Города». В этой игре первый игрок называет любой город, следующий игрок должен назвать город, название которого начинается с последней буквы названия предыдущего города и так далее. Нельзя называть города, которые уже были названы. Если один из игроков не сможет назвать город на нужную букву – он выбывает. Последний оставшийся игрок объявляется победителем. Так, если первый игрок назовёт Минск, то второй игрок должен назвать город на букву К, например Киров, следующий игрок должен назвать уже город на В, например Волгоград, и так далее.
Возможно, вы спросите: «Зачем делать эту игру на компьютере, ведь в неё можно прекрасно играть и без него?» Всё просто. Городов может быть названо много, и будет сложно вспомнить, назывался уже город или нет. А компьютер может без труда запомнить все города, которые были названы.
Начнём создание игры. В нашей игре сделаем ведущим Царапку, поэтому оставим его скрипт на сцене. Установим подходящий фон сцены. Выберем из библиотеки Scratch в теме «Город» фон «Урбан два». Установим Царапку здесь, на тротуаре. Добавим на сцену спрайт кнопки. Загрузим его из нашей рабочей папки из файла «Кнопка». Как видим, это кнопка «Не знаю!». Игрок, который нажмёт на неё во время своего хода, выбывает. Установим нужный размер кнопки и поставим её чуть ниже Царапки.
Начнём описание скриптов для игры. Так как Царапка будет ведущим, основные игровые скрипты будут прописаны в его спрайте. Пусть игра начинается с нажатия на зелёный флажок. Сделаем так, чтобы было задано количество игроков и их имена. Сперва Царапка должен попросить ввести количество игроков. Используем для этого блок «Спросить и ждать». В нём запишем текст «Введите количество игроков». Дальше создадим переменную «Количество игроков» и два списка: «Игроки» и «Города». Снимем с них галочки, так как они не должны отображаться на сцене. То же будем делать и для других переменных, которые мы будем создавать. В скрипте с помощью блока «Задать значение» сохраним в переменную «Количество игроков» ответ, который ввёл пользователь.
Дальше сделаем ввод имён игроков. Для этого заведём ещё одну переменную-указатель, назовём её i. В скрипте зададим ей значение 1. Дальше добавим цикл «Повторить». Это будет цикл для ввода игроков. Он будет повторяться столько раз, сколько игроков задал пользователь. В переменной i будет храниться номер игрока, имя которого нужно ввести. Дальше в цикл добавим блок «Спросить и ждать», в котором будем спрашивать имя очередного игрока. Строка вопроса будет состоять из трёх частей. В первой части будет слово «Игрок» и пробел, во второй – номер игрока, который хранится в переменной i, и в последней – запятая, пробел, текст «Как тебя зовут?». Так Царапка будет спрашивать имя очередного игрока. С помощью блока «Добавить» добавим имя нового игрока в список «Игроки». Увеличим переменную i на единицу, чтобы в ней был номер следующего игрока.
Так будут заданы игроки. Дальше будем описывать ход игры. Создадим переменную для номера игрока, который должен назвать город. Назовём её «Ходит игрок». Первым ходит первый игрок, поэтому в скрипте зададим переменной значение один. Дальше нужно, чтобы первый игрок ввёл название любого города. Для этого используем блок «Спросить и ждать». Вопрос будет состоять из двух частей. В первой части должно быть имя игрока, к которому обращён вопрос. Для этого возьмём соответствующий элемент из списка «Игроки». Нам нужен элемент с номером того игрока, который должен назвать город в данный момент. Во второй части будет отделённый запятой текст «Введи название любого города.» Добавим название введённого города в список городов. Чтобы лишний раз не искать последний введённый город в списке городов, создадим новую переменную, которую назовём «Последний город». Зададим ей значение сенсора «Ответ», то есть введённый город. Также создадим переменную «Нужная буква», в которую зададим последнюю букву строки «Последний город». Последняя буква строки будет находиться под номером, равным длине строки. Однако не всегда нужно называть город именно на последнюю букву предыдущего. Если название последнего города будет заканчиваться на мягкий знак, то мы должны назвать город на предпоследнюю букву предыдущего. Чтобы так было, добавим блок для полной формы ветвления, в котором будем проверять, равна ли последняя буква строки «Последний город» символу мягкий знак. Если это так, то зададим переменной «Нужная буква» значение предпоследней буквы строки «Последний город». После слова «Иначе» установим в ветвление предыдущий блок.
Дальше следующие игроки будут называть города. Это будет повторяться постоянно, поэтому запишем это в виде отдельного скрипта. Для перехода к нему будем передавать сообщение, которое назовём «Следующий ход». Составим скрипт, который будет вызываться этим сообщением. Вычислим номер игрока, который должен называть город. Для этого увеличим переменную «Ходит игрок» на единицу. А дальше с помощью блока сокращённой формы ветвления проверим, если номер больше количества игроков, зададим ему значение один. Так будет вычисляться игрок, который должен назвать город.
Теперь нужно попросить игрока ввести название очередного города. Сделаем это с помощью блока «Спросить и ждать». Скопируем его из запроса к первому игроку. Изменим вопрос так, чтобы указывалась ещё и буква, на которую должно начинаться название очередного города.
Однако теперь просто ввести название города будет недостаточно. Нужно проверить, подходит ли оно. Для этого создадим новую переменную, которую назовём «Город подходит». Вначале предположим, что введённый город не подходит, поэтому зададим созданной переменной значение «Нет». Дальше добавим блок цикла «Повторять пока не...». Этот цикл завершится, только когда будет введён подходящий город, то есть значение переменной «Город подходит» станет «Да».
Теперь будем проверять, подходит ли введённое название города. С помощью блока для полной формы ветвления проверим, начинается ли название города на нужную букву. Для этого должны быть равны первая буква названия введённого города и значение переменной «Нужная буква». Если это условие не выполняется, то мы должны запросить на ввод новое название города, указав при этом, что введённый город не подходит. Для этого продублируем блок предыдущего запроса и изменим его.
Если название введённого города начинается с нужной буквы, нужно ещё проверить, не называлось ли оно до этого. Будем проверять, не равно ли введённое название одному из уже имеющихся в списке «Города». Сделаем это с помощью блока для полной формы ветвления. Его условием будет взятый с отрицанием сенсор того, что в списке «Города» уже есть город, введённый пользователем. Если введённый город подходит, мы изменим значение переменной «Город подходит» на «Да». Если же введённый город совпал с одним из списка, то мы должны запросить на ввод название другого города, при этом указав, что текущий город не подходит, так как он уже был введён. Для этого продублируем и изменим блок «Спросить и ждать» из другого запроса. Описанный цикл будет работать, пока игрок не введёт подходящее название города.
По завершении работы цикла в ответе будет подходящий город. Нам нужно добавить его в список, снова задать значения переменных «Последний город» и «Нужная буква», а затем перейти к следующему ходу. Для этого продублируем последние блоки из предыдущего скрипта, начиная с блока «Добавить».
Дальше нам нужно составить скрипты для кнопки «Не знаю». В начале игры, при вводе игроков, эта кнопка должна быть спрятана. Для этого составим скрипт, в котором при нажатии на зелёный флажок будет срабатывать блок «Спрятаться». Кнопка должна появиться в начале игры, перед ходом второго игрока. Почему не первого? Первый игрок должен ввести любой город, не важно какой, поэтому он вряд ли нажмёт на кнопку «Не знаю». Поэтому добавим скрипт, в котором при получении сообщения «Следующий ход» будет срабатывать блок «Показаться».
Остаётся только составить скрипт, который будет срабатывать при нажатии на кнопку. Он будет передавать сообщение «Не знаю».
Скрипт для обработки этого сообщения составим у спрайта Царапки. Если игрок нажал на кнопку, то он выбывает. Поэтому удалим из списка «Игроки» элемент с номером, который совпадает с номером игрока, который ходит сейчас. Соответственно, нам нужно уменьшить значение переменной «Количество игроков» на единицу.
Дальше проверим, не закончена ли игра. Для этого добавим блок полной формы ветвления. Игра закончится, когда останется единственный игрок, то есть значение переменной «Количество игроков» станет равно единице. В этом случае добавим блок «Говорить», который будет работать в течение пяти секунд. Царапка должен сказать, что игра окончена и какой игрок победил. Победит единственный игрок, оставшийся в списке «Игроки». Это будет первый и единственный элемент списка. Если же игра продолжается, то мы должны перейти к следующему ходу. Только перед этим нужно учесть, что при удалении игрока из списка, все игроки, следующие за ним, сместились на одну позицию назад, поэтому уменьшим значение перемененной «Ходит игрок» на 1.
Также нужно перед началом новой игры очистить списки «Игроки» и «Города» от того, что в них осталось от предыдущей игры. Поэтому в наш самый первый скрипт добавим цикл «Повторять, пока не...». Цикл завершит свою работу, когда длина списка «Города» станет равна нулю. В цикле будем удалять элемент, находящийся на первой позиции списка «Города». Продублируем этот цикл и изменим его для очистки списка «Игроки».
Теперь протестируем то, что у нас получилось. Для этого в режиме презентации нажмём на зелёный флажок. Зададим двух игроков. Первого игрока назовём Вася, а второго – Петя. Теперь Васю просят ввести любой город. Введём город «Астрахань». Название города заканчивается на мягкий знак, поэтому Петю просят назвать город на Эн. Введём Новгород. Теперь ход Васи. Специально ошибёмся и введём город не на букву Дэ, например Самару. Нам говорят, что этот город не подходит и нужен город на букву Дэ. Введём город «Донской». На букву И краткое есть город Йошкар-Ола. Теперь Васю просят ввести город на А. Введём Астрахань, её мы ввели в начале – и Царапка говорит о том, что Астрахань уже вводили. Нажмём на кнопку «Не знаю». Вася выбыл, поэтому игра закончена и победил Петя. Игра работает правильно. Сохраним проект в нашей рабочей папке под именем «Города».
Сегодня мы применили на практике знания, полученные при изучении строк, и разработали новую игру «Города».