Как можно создать простую игру-вопросник в телеграм-боте, используя JavaScript?

Как правильно организовать функцию игры в боте на Telegraf, чтобы пользователю давалось 10 секунд на ответ, и если он ответил верно, его счет увеличивался на 1 очко? Как можно остановить игру при нажатии кнопки "Закончить"?
  • 16 октября 2023 г. 19:09
Ответы на вопрос 2
Для создания простой игры-вопросника в телеграм-боте с использованием JavaScript и библиотеки Telegraf, вы можете использовать следующий код:

```javascript
const Telegraf = require('telegraf');
const Extra = require('telegraf/extra');
const Markup = require('telegraf/markup');

const bot = new Telegraf('ваш_API_ключ');

// Вопросы игры
const questions = [
  { question: '2 + 2?', answer: '4' },
  { question: 'Столица Франции?', answer: 'Париж' },
  { question: 'Сколько лет висит Черное море?', answer: 'многовековое' },
  // Добавьте здесь другие вопросы
];

bot.start((ctx) => {
  ctx.reply('Добро пожаловать в игру! Нажмите на кнопку "Старт", чтобы начать.', 
    Extra.markup(Markup.inlineKeyboard([
      Markup.callbackButton('Старт', 'start')
    ])));
});

bot.action('start', (ctx) => {
  ctx.session.score = 0;
  askQuestion(ctx);
});

// Функция для задания вопроса
function askQuestion(ctx) {
  const randomQuestion = questions[Math.floor(Math.random() * questions.length)];

  ctx.reply(randomQuestion.question, 
    Extra.markup(Markup.inlineKeyboard([
      Markup.callbackButton('Закончить', 'end')
    ])));

  // setTimeout для установки 10-секундного таймера
  setTimeout(() => {
    ctx.reply(`Время вышло! Правильный ответ: ${randomQuestion.answer}`);
    askQuestion(ctx); // Задаем новый вопрос
  }, 10000);
}

bot.action('end', (ctx) => {
  ctx.reply(`Игра окончена. Ваш счет: ${ctx.session.score}`);
});

bot.hears(/^([^/]+)$/, (ctx) => {
  const userAnswer = ctx.message.text.toLowerCase();
  const currentQuestion = questions.find(q => q.question.toLowerCase() === userAnswer);

  if (currentQuestion) {
    ctx.session.score += 1;
    ctx.reply('Правильно!');
  } else {
    ctx.reply('Неправильно!');
  }
});

bot.startPolling();
```

В этом коде мы создаем телеграм-бота с использованием библиотеки Telegraf. У нас есть массив вопросов `questions`, каждый из которых содержит вопрос и правильный ответ. Когда пользователь нажимает кнопку "Старт", у нас есть функция `askQuestion`, которая выбирает случайный вопрос, отправляет его пользователю и запускает 10-секундный таймер.

Если пользователь отвечает правильно на вопрос, его счет `score` увеличивается на 1. Если пользователь нажимает кнопку "Закончить", игра останавливается и выводится итоговый счет.

Мы также используем `bot.hears` для проверки ответа пользователя на каждую строку текста. Если ответ совпадает с текущим вопросом, счет увеличивается, и пользователю отправляется сообщение "Правильно!". Если ответ неправильный, отправляется сообщение "Неправильно!".

Вы можете добавить больше вопросов в массив `questions`, чтобы создать игру с большим количеством вопросов. Также не забудьте заменить `'ваш_API_ключ'` на свой собственный API-ключ Telegram Bot.

Надеюсь, это поможет вам создать свою простую игру-вопросник в телеграм-боте с использованием JavaScript и Telegraf!
Проблема состоит в том, что каждое условие вызывает функцию operatorRandom, которая может вернуть значение "минус" или "плюс". Если в первом условии operatorRandom вернет "минус", а во втором - "плюс", то ни одно из условий не будет выполнено и переменная operation останется пустой, что может вызвать ошибку на следующем этапе. 

Также обратите внимание на ошибку в использовании функции setTimeout. Необходимо заменить ее на setInterval, чтобы регулярно отслеживать время начала игры для каждого пользователя. На сервере должен быть бесконечный игровой цикл, который будет следить за состоянием игроков и отправлять им соответствующую информацию. Например, можно использовать setInterval(cb, 50).

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