PDA

Просмотр полной версии : Бот - цветопередатчик


TEST

Оlеg75
18.10.2015, 21:48
XPoint дал задание к сегодняшнему дню придумать алгоритм бота, который будет по запросу пользователя задаватьт фразам в чате этого пользователя определённый цвет.
Алгоритм я написал просто своими словами, даже без псевдокода, так как не знаю механизм опроса в СДК, касающийся ожидания входа пользователей и вывода фраз в чат.
Алгоритм писал быстро из за нехватки времени, поэтому мог где- то ошибиться.
-------------------------------------------------------------------------------------------

1. Создать 4 массива. у всех количество элементов равно 15.
-1 Массив типа string для названий всех имеющихся цветов. Сразу задаются названия цветов.
-2 Массив типа int для номеров гражданств вошедших пользователей. Все элементы сначала инициализируются нулевым значением.
-3 Массив типа int для номеров выбранных пользователями цветов. Все элементы сначала инициализируются нулевым значением.
-4 Массив типа int для номеров элементов массива 1. Все элементы сначала инициализируются номерами от 0 до 14.


2. Номер гражданства первого вошедшего пользователя заносится в массив 2 в первый элемент (элемент 0).
3. В приват пользователю выводится текст: "Здравствуйте, [ник]. Выберите номер цвета для своих фраз." Далее идёт список всех цветов, и их порядковый номер. Порядковый номер - это содержимое ячеек массива 4. Список цветов - это названия цветов, находящихся в ячейках массива 1 с такими номерами. При выборе цвета следующими пользователями, им уже предоставляется список без тех цветов, которые выбьрали предыдущие пользователи. Вместо таких цветов в ячейки массива 4 с номерами, сооответствующие номерам ячейки массива 2, в которых записаны гражданства уже выбравших цвет пользователей - записывается значение ноль. Поэтому, например, в списке вместо цвета "7 - зелёный", уже может стоять "0 - чёрный".
4. Ожидание ввода текста пользователем в приват бота.
5. Если пользователь вводит число (от 1 до 14), являющееся порядковым номером какого-либо ещё не выбраного другими пользователями цвета, переходим дальше (п. 7). Введённое пользователем число указывает на номер элемента массива 1.
6. Если вводит что-то другое, либо номер 0 (это тоже номер элемента массива 1)- пользователю присваивается чёрный цвет текста.
7. Введённое пользователем число присваивается первому элементу массива 3 (элемент 0).

--Номера гражданств всех последующих входящих пользователей заносятся в следующие ячейки массива 2 (элемент 1, элемент 2, ..., элемент 14).
--Выбранные номера цветов этих пользователей присваиваются следующим элементам массива 3 (элемент 1, элемент 2, ..., элемент 14).
--Таким образом создаётся таблица соответствия номеров гражданств выбранным номерам цветов.
--Если пользователь выходит из зоны действия бота - его номера из таблицы соответствия не исчезают, и при следующем входе пользователя (пока запущен бот), ему уже не задаётся вопрос о выборе цвета, а сразу назначается ранее выбранный цвет.
--При входе в зону действия бота более 15 пользователей, последующим (16-му, 17-му, и т.д.) пользователям никаких вопросов уже не задаётся, а автоматически присваивается чёрный цвет фраз для чата.

8. При отправке сообщения в чат фраза сначала попадает к боту и анализируется:
- Определяется номер ячейки массива 2, где находится гражданство написавшего в чат пользователя
- Ищется совпадающий номер ячейки массива 3. Из этой ячейки считывается номер цвета и сопоставляется с аналогичным номером ячейки массива 1
- Из найденной ячейки массива 1 извлекается название выбранного ранее пользователем цвета.

9. Фраза попадает в чат с уже нужным цветом.

XPoint
19.10.2015, 23:46
Пример написания алгоритма:
1. Создаем color масив типа String размером 15.
2. Создаем id масив типа int размером 15.
4. Создаем переменную numID типа int равную 0.
5. Заполняем color масив названием цветов.
6. Заполняем id масив значение 0.
7. Ждем сообщения из чата и помещаем в переменную str, номер пользователя в переменную numID.
8. Провиряем переменную str на слово "Color" + число, если истина то переходим на строку 12.
9. Обходим массив id и проверяем ечейки на значение numID, если лож переходим к строке 6. При истене номер ячейки помещаем в переменную numID.
10. Выводим строку str цветом из масива color позиции numID.
11. Переходим на строку 7.
12. Извлекаем число из строки str после слова Color. Число должнобыть в пределах от 0 до 15. И помещаем в переменную numID.
13. Есле масив id в ячейке numID не равен 0 то переходим на строчку 7.
14. Заносим в массив id номер грожданства в позицию numID.
15. Переходем к строке 7.

XPoint
19.10.2015, 23:48
Прогани в уме этот алгоритм. В нем есть скрытая ошибка. Поэтому измени его чтобы устранить ошибку.

XPoint
20.10.2015, 02:52
Извеняюсь что исчез из AW просто электричество отключили. Вот тока сммог зайти. Вобщем идею надеюсь ты понял. Есче раз подумай над алгоритмом и напеши здесь правленый врянт. И да у меня сейчас завал по работе так что не знаю получится ли выбратся в AW до выходных. Поэтому будем связь держать здесь на форуме. Напоминаю логическую ошибку ты есче не нашол.

Оlеg75
20.10.2015, 23:02
Помимо ошибок, которые мы вчера обсуждали (не объявлена переменная str, нужна доп. переменная для исключения затирания номера гражданства в numID, в строке 9 ошибка перехода на строку - вместо 7 написано 6) - нашёл как мне кажется и логическую ошибку.
Ошибка в строке 9. Получается, если пользователь написал сообщение в чат, но не сообщил о выбранном цвете, то это его сообщение игнорируется и чат снова переходит в режим ожидания. В моём варианте это уже 10-я строка, где пользователю сразу назначается чёрный цвет, если он не выбрал никакого цвета.
Попытался исправить все перечисленные ошибки.
__________________________________________________ __________________

1. Создаем color массив типа String размером 15.
2. Создаем id массив типа int размером 15.
3. Создаём переменную str типа String.
4. Создаем переменную numID типа int равную 0.
5. Создаем переменную numColor типа int равную 0.
6. Заполняем color массив названием цветов.
7. Заполняем id массив значение 0.

8. Ждем сообщения из чата и помещаем в переменную str, а номер гражданства пользователя - в переменную numID.
9. Проверяем переменную str на слово "Color" + число, если истина то переходим на строку 13.

10. Обходим массив id и проверяем ячейки на значение numID, если ложь - переменной numColor присваиваем 0 (в массиве color ячейка с таким номером отвечает за чёрный цвет). При истине номер ячейки помещаем в переменную numColor.
11. Выводим строку str цветом из массива color позиции numColor.
12. Переходим на строку 8.

13. Извлекаем число из строки str после слова Color. Число должно быть в пределах от 0 до 15. И помещаем в переменную numColor.
14. Если массив id в ячейке numColor не равен 0, то переходим на строку 8.
15. Заносим в массив id номер гражданства в позицию numColor.
16. Переходим к строке 8.

__________________________________________________ __________________
Кстати в этом коде нет наводящего вопроса для пользователей. Но такую проблему можно решить просто выставив в самом мире таблички с указанием номеров выбираемых цветов.
Также программа не имеет памяти на соответствие выбранного цвета тому или иному пользователю, точнее памяти на таблицу соответствий. То есть несколько пользователей могут выбирать один и тот же цвет. Но это походу и не нужно, так как бот всё равно не задаёт пользователю какой цвет выбрать.

В моей версии алгоритма тоже могут быть ошибки, но сейчас нет времени их перепроверять, завтра проверю.

XPoint
21.10.2015, 18:29
Очень хорошо. Это всеголишь набросок идеи. Так что здесь есть куча вопросов. Но при дальнейшей детализации они будут исчезать. Насчет памяти взгляните на строчку 15 и читайте пока не поймети суть. А поповоду игнорирования пользовотелей которые не в списке id так и зодумано, ведь смысал в том чтобы отоброжать строки выбраным цветом а не дублировать каждую строку чата. Моя логическая ошибка проявится думаю при реализации алгоритма, поэтому пока опускаем этот вопрос.
Теперь я хочу чтобы вы выписали здесь ключевые строки для любого алгоитма. Типа перехода на номер строки и т.д. Также выпешите строки которые по вашему мнению могут быть функциями. Тоесть строки которые подрузомивают некую под программу, типа строки 8.

Оlеg75
23.10.2015, 00:04
В общем как понял, логич. ошибка всё же была в 9 строке (в твоём варианте). При обходе массива id если номер искомого гражданства находился дальше нулевой ячейки - программа снова отсылала к ожиданию сообщений в чате.

Код я составил по твоему алгоритму, вроде работает верно. Там есть нюансы. В связи с тем, что я не знаю СДК наших миров (и учить не планирую (http://forum.activeworlds.ru/showthread.php?477-Мудрые-индейцы&p=3274&viewfull=1#post3274)) - программа работает только в консоли без подключений ко всяким СДК. Поэтому попытался отобразить и вопрос к пользователю о цвете его фраз в чате.
Сейчас выложу код (скринами, для наглядности), а потом уже прокомментирую как работает.

http://i.imgur.com/2Oe1w21.png
http://i.imgur.com/PXwVEOs.png
http://i.imgur.com/FloxqKM.png

Оlеg75
23.10.2015, 00:24
Строка 77 там лишняя (79-я тем более), просто тестировал содержимое ячейки массива color.
Функцию на строке 107-111 нашёл на каком-то сайте, как работает фиг знает, не разбирался, в оригинале в качестве аргументов надо было вводить названия цветов из перечисления, но я перечислимый тип заменил на int, так надо, чтобы пользоваться целочисленным массивом color.

Решение логической ошибки, которая проявлялась при обходе массива id - в строке 53. Пока не найдётся нужное гражданство или не дойдёт до последней ячейки массива - цикл (строка 43) будет повторяться снова и снова.

Вот результат

http://i.imgur.com/t3IBW8B.png

После ввода сообщения (латинскими буквами - не помню как заставить вводить кириллицей) - цикл на строке 75 стирает всё с консоли и появляется внизу сообщение с нужным цветом:
http://i.imgur.com/ov9UMc2.png

Суть в том, что свой ID (якобы гражданство) в этом псевдо-чате нужно вводить всегда перед сообщением. После того, как выбрал номер цвета, на повторно потом заданный вопрос "Будем задавать цвет чата?" нужно отвечать нет, иначе снова перейдём к выбору цвета. Если не выбрав (при определённом ID) цвет, то при ответе на вышеуказанный вопрос отрицательно, программа снова отсылает к выбору цвета. Цвета, соответствующие номеру гражданства запоминает, алгоритм отличный, я бы его придумал более громоздким, с четырьмя массивами, вот что значит опыта у меня нет :)

XPoint
23.10.2015, 01:26
Окей. Скажите что будет если один и тотже пользователь (с одинаковым id) выберет подрят все цвета? Он забет сабой весь масив id. В этом то и была моя логическая ошибка. Здесь даже не в опыте дело, просто ты должен любой алгоритм чувствовать. Этому я и пытался тебя на учить. Потому что это основа программирования. Когда отчетливо видишь алгоритм любой преходящей на ум идеи то для тебя тогда уже не важно насколько огромный проект ты задумал. Реализация уже становится простым делом.

XPoint
23.10.2015, 01:47
Да кстати. Что будет если один и тот же пользователь выберет в начале 1 цвет, а потом 2? Какой будет его цвет 1 или 2? ;)

Оlеg75
23.10.2015, 22:16
Да уж...
Я искал ошибки, так сказать, лежащие на поверхности. На тестирование всех брешей, требующих "защиту от дурака", не хватило времени. С ходу не смогу сказать, но по видимому в ветке else в строке 38 в коде нужно добавить некий цикл и ещё одно условие для дополнительного обхода массива id и проверки на неповторяемость номера гражданства в других ячейках. Но тогда получится, что юзер больше не сможет выбрать другой цвет. Скорее всего тут нужен ещё один массив, для таблицы соответсвий гражданств и номеров цветов.

По второму вопросу - будет цвет 1. Сегодня уже лень смотреть почему так происходит :)

TAG.Hosting — Хостинг сайтов и Регистрация Доменов