Работа с функциями
Перед тем как приступить к написанию сценария бота мы напишем несколько функций, которые будут осуществлять механику игры.
Основные функции игры
В папке src
создайте файл responseCity.js
. Здесь будут храниться основные функции игры, которые мы будем вызывать из сценария:
- вывод города, начинающегося на последнюю букву предыдущего;
- поиск введенного города по ключу;
- проверка наличия введенного города в списке городов;
- проверка совпадения последней буквы предыдущего города с первой буквой введенного города;
- вывод случайного ключа города;
- проверка на использование короткого названия города.
function responseCity(parseTree, keys, cities) {
var city = parseTree._City.name
var letter = city[city.length - 1]
var response = 0
keys.forEach(function(elem) {
if (cities[elem].value.name[0].toLowerCase() == letter) {
response = elem
}
})
if (response == 0) {
letter = city[city.length - 2]
keys.forEach(function(elem) {
if (cities[elem].value.name[0].toLowerCase() == letter) {
response = elem
}
})
}
return response
}
function findByName(city, keys, cities) {
var response = 0
var i = 0
keys.forEach(function(elem) {
if (cities[elem].value.name == city) {
response = i
}
i++
})
return response
}
function checkCity(parseTree, keys, cities) {
var city = parseTree._City.name
var response = false
keys.forEach(function(elem) {
if (cities[elem].value.name == city) {
response = true
}
})
return response;
}
function checkLetter(playerCity, botCity) {
var response = false
if ((playerCity[0].toLowerCase() == botCity[botCity.length - 1])
|| (playerCity[0].toLowerCase() == botCity[botCity.length - 2])) {
response = true
}
return response
}
function chooseRandCityKey(keys) {
var i = 0
keys.forEach(function(elem) {
i++
})
return $jsapi.random(i);
}
function isAFullNameOfCity() {
return $jsapi.context().parseTree._City.name.toUpperCase() == $jsapi.context().parseTree.text.toUpperCase();
}
В нашем проекте будем использовать системный модуль city/cities-ru.csv
, в котором хранится список более 8500 городов. В дальнейшем рассмотрим подключение этого модуля в разделе Разработка сценария.
Каждый город представляет собой запись в следующем виде:
6556;Санкт-Петербург,Ленинград,Петербург,СПб,Питер,Петроград,Северная Пальмира,Северной Пальмире,Северная Столица,Северной Столице,город на Неве,город Петра,город Святого Петра,Санктпетербург,Санкт Петербург;
{
"name":"Санкт-Петербург",
"lat":59.93863,
"lon":30.31413,
"country":"RU",
"timezone":"Europe/Moscow",
"population":5028000,
"capital":"false",
"continent":"Europe"
}
Мы будем использовать только поля id
и name
.
Описание функций
responseCity()
Функция responseCity()
возвращает город, который начинается на последнюю букву введенного пользователем города. Если города на определенную букву закончились, то возвращаем город начинающийся с предпоследней буквы.
function responseCity(parseTree, keys, cities) {
// сохраняем введенный город
var city = parseTree._City.name
// берем последнюю букву города
var letter = city[city.length - 1]
// будем присваивать переменной ключ найденного города
var response = 0
/* пройдемся по элементам списка городов пока не найдем город,
который начинается на последнюю букву предыдущего города*/
keys.forEach(function(elem) {
if (cities[elem].value.name[0].toLowerCase() == letter) {
response = elem
}
})
/* если города, начинающиеся с определенной буквы закончились,
то используем вторую букву с конца */
if (response == 0) {
letter = city[city.length - 2]
keys.forEach(function(elem) {
if (cities[elem].value.name[0].toLowerCase() == letter) {
response = elem
}
})
}
return response
}
findByName()
Функция findByName()
осуществляет поиск введенного города в списке городов по ключу.
/* будем вызывать эту функцию из сценария
для удаления введенного города из всего списка */
function findByName(city, keys, cities) {
// будем хранить ключ найденного города
var response = 0
var i = 0
// пройдемся по элементам списка городов пока не найдем введенный город
keys.forEach(function(elem) {
if (cities[elem].value.name == city) {
response = i
}
i++
})
return response
}
checkCity()
Функция checkCity()
проверяет наличие введенного города в списке city/cities-ru.csv
. Возвращает true
или false
.
function checkCity(parseTree, keys, cities) {
// сохраняем введенный город
var city = parseTree._City.name
var response = false
// пройдемся по элементам списка городов пока не найдем введенный город
keys.forEach(function(elem) {
if (cities[elem].value.name == city) {
response = true
}
})
return response;
}
checkLetter()
Функция checkLetter()
предназначена для проверки совпадения первой буквы введенного пользователем города с последней или предпоследней буквой города, который ввел бот.
function checkLetter(playerCity, botCity) {
var response = false
/* выводим true, если первая буква введенного пользователем города
совпадает с последней буквой введенного ботом города */
if ((playerCity[0].toLowerCase() == botCity[botCity.length - 1])
|| (playerCity[0].toLowerCase() == botCity[botCity.length - 2])) {
response = true
}
return response
}
chooseRandCityKey()
Функция chooseRandCityKey()
возвращает случайное значение ключа города. Вызывается из сценария, когда игру начинает бот.
function chooseRandCityKey(keys) {
return $jsapi.random(keys.length);
}
isAFullNameOfCity()
Функция isAFullNameOfCity()
проверяет, ввел ли пользователь полное название города. Результатом функции будет true
или false
.
function isAFullNameOfCity() {
return $jsapi.context().parseTree._City.name.toUpperCase() == $jsapi.context().parseTree.text.toUpperCase();
}
Теперь переходим к созданию конфигурационного файла и сценария бота.