Боти-викторина
Ҳама чизро якҷоя — саволҳо, санҷиши ҷавобҳо, холҳо ва ҷадвали ниҳоиро — дар боти-викторина ҷамъ мекунем.
Санҷиши одилонаи ҷавобҳо
Бозингарон ҷавобҳоро чӣ тавре хоҳанд, менависанд: «Уторид», «уторид!», « УТОРИД». Бинобар ин ҳам ҷавоби дуруст ва ҳам ҷавоби бозингарро аввал меъёрӣ мекунанд:
import re
def normalize(text):
text = text.lower().replace("ё", "е")
return " ".join(re.findall(r"\w+", text))
lower()пеш аз иваз кардани «ё» — вагарна «Ё»-и калон иваз намешавад;re.findall(r"\w+", …)танҳо калимаҳоро мегузорад — аломатҳои китобат ва фосилаҳои зиёдатӣ нопадид мешаванд;- калимаҳоро бо як фосила мепайванданд, на мечаспонанд: вагарна «1945 сол» бо «1945сол» мувофиқ меояд.
Ҳолати бозӣ
Бот метавонад ҳамзамон дар каналҳои гуногун ва дар серверҳои гуногун бозӣ кунад. Бинобар ин ҳолатро аз рӯи канал нигоҳ медоранд:
GAMES = {} # рақами канал → {"index": …, "open": …}
game = GAMES.setdefault(message.channel.id, {"index": -1, "open": False})
Байрақчаи open саволро баъди ҷавоби дурусти аввал мебандад — холро аз ҳама зудтарин мегирад. Холҳои бозингаронро аз рӯи author.id нигоҳ доред.
Барои он ки маълумот аз нав оғоз шудани ботро паси сар кунад, онро дар файл (JSON) ё пойгоҳ (SQLite) захира мекунанд.
Ҷойҳо
Ҷойҳоро бо баробарӣ чунин ҳисоб мекунанд: ҷой = 1 + шумораи бозингароне, ки холашон бештар аст. Он гоҳ бозингарони баробар ҷойро тақсим мекунанд, навбатӣ бошад ҳамаи болоиҳоро ба назар мегирад:
place = 1 + sum(1 for s in SCORES.values() if s > score)
Барои холҳои 5, 5, 3, 1 натиҷа 1, 1, 3, 4 мешавад.
Оғоз дар сервер
Барои он ки бот ҳангоми хомӯш будани компютери шумо кор кунад, онро дар сервер (VPS) ё дар абр оғоз мекунанд — ҳамон тавре ки ботҳои Telegram-ро. Токенро тавассути тағйирёбандаи муҳити DISCORD_TOKEN медиҳанд, на дар код менависанд.
Хулоса
- меъёрикунии ҷавобҳо:
lower, «ё» → «е»,\w+, як фосила; - ҳолат аз рӯи
channel.id, холҳо аз рӯиauthor.id, савол баъди ҷавоби дурусти аввал баста мешавад; - ҷойҳо бо баробарӣ: 1 + шумораи бозингарони болотар;
- натиҷа дар эмбед.