Создание игры телеграм бота, как исправить?
Добрый день хабрчане))
Пытаюсь создать блэкджек на javascript в телеграм боте.
Поможет кто нибудь исправить проблему?
Заключается в том, что не срабатывает условие если у пользователя более 21 очка
Вот код:
const TelegramBot = require('node-telegram-bot-api'); const deck = [], suits = ['♥', '♦', '♠', '♣'], values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']; // Creating deck for (const value of values) { for (const suit of suits) { let points = parseInt(value) || (value === "A" ? 11 : 10) deck.push({ value, suit, points }); } } // Shuffles the deck for (let i = deck.length - 1; i > 0; i--) { let r = ~~(Math.random() * (i + 1)); //Switches cards [deck[i], deck[r]] = [deck[r], deck[i]] } class Player { constructor( /*bet = null, split = false*/ ) { this._cards = []; /*this.bet = bet; this.split = split;*/ } hit() { this._cards.push(deck.shift()); } double() { //this.bet *= 2; bet *= 2 this.hit(); } get points() { return this._cards.map(c => c.points) } get value() { let val = this.points.reduce((a, b) => a + b); let aces = this.points.filter(p => p === 11).length; while (val > 21 && aces--) val -= 10; if (isNaN(val)) throw new Error("Value is NaN") return val; } get print() { return this._cards.map((a) => a.value + a.suit).join(' '); } } // Declaring player and dealer const player = new Player( /*bet*/ ); const dealer = new Player(); //To start the game - Player - 2 cards / Dealer - 1 player.hit(); player.hit(); dealer.hit(); if (msg.text === '/bj') { client.deleteMessage(msg.chat.id, msg.message_id).catch(err => {return;}) if (player.value === 21) { if (dealer.value === 21) { client.sendMessage(msg.chat.id, `♻️ НичьяnВаши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value, { disable_notification: true, }) } else { client.sendMessage(msg.chat.id, ` BLACKJACKnВаши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value, { disable_notification: true, }) } } else { const msgWait = await client.sendMessage(msg.chat.id, `Ваши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value, { reply_markup: { inline_keyboard: [ [ { text: "Карту", callback_data: "hit" }, { text: "Вскрыть", callback_data: "stand" } ] ] }, disable_notification: true, }) } } |
const TelegramBot = require('node-telegram-bot-api'); const deck = [], suits = ['♥', '♦', '♠', '♣'], values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']; // Creating deck for (const value of values) { for (const suit of suits) { let points = parseInt(value) || (value === "A" ? 11 : 10) deck.push({ value, suit, points }); } } // Shuffles the deck for (let i = deck.length - 1; i > 0; i--) { let r = ~~(Math.random() * (i + 1)); //Switches cards [deck[i], deck[r]] = [deck[r], deck[i]] } class Player { constructor( /*bet = null, split = false*/ ) { this._cards = []; /*this.bet = bet; this.split = split;*/ } hit() { this._cards.push(deck.shift()); } double() { //this.bet *= 2; bet *= 2 this.hit(); } get points() { return this._cards.map(c => c.points) } get value() { let val = this.points.reduce((a, b) => a + b); let aces = this.points.filter(p => p === 11).length; while (val > 21 && aces--) val -= 10; if (isNaN(val)) throw new Error("Value is NaN") return val; } get print() { return this._cards.map((a) => a.value + a.suit).join(' '); } } // Declaring player and dealer const player = new Player( /*bet*/ ); const dealer = new Player(); //To start the game - Player - 2 cards / Dealer - 1 player.hit(); player.hit(); dealer.hit(); if (msg.text === '/bj') { client.deleteMessage(msg.chat.id, msg.message_id).catch(err => {return;}) if (player.value === 21) { if (dealer.value === 21) { client.sendMessage(msg.chat.id, `♻️ НичьяnВаши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value, { disable_notification: true, }) } else { client.sendMessage(msg.chat.id, ` BLACKJACKnВаши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value, { disable_notification: true, }) } } else { const msgWait = await client.sendMessage(msg.chat.id, `Ваши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value, { reply_markup: { inline_keyboard: [ [ { text: "Карту", callback_data: "hit" }, { text: "Вскрыть", callback_data: "stand" } ] ] }, disable_notification: true, }) } }
А это обработчик кнопок:
client.on('callback_query', query => { const {chat, message_id } = query.message; const action = query.data; const userid = query.from.id; const emoji = "" let text; if(action === 'hit') { let turn = 0, state = true turn++ player[query.data]() text = `Ваши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value; client.editMessageText(text, { chat_id: chat.id, message_id: message_id, reply_markup: { inline_keyboard: [ [ { text: "Карту", callback_data: "hit" }, { text: "Вскрыть", callback_data: "stand" } ] ] } }) if (player.value > 21) { text = `ПроигралnВаши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value; client.editMessageText(text, { chat_id: chat.id, message_id: message_id, }) return; } }); |
client.on('callback_query', query => { const {chat, message_id } = query.message; const action = query.data; const userid = query.from.id; const emoji = "" let text; if(action === 'hit') { let turn = 0, state = true turn++ player[query.data]() text = `Ваши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value; client.editMessageText(text, { chat_id: chat.id, message_id: message_id, reply_markup: { inline_keyboard: [ [ { text: "Карту", callback_data: "hit" }, { text: "Вскрыть", callback_data: "stand" } ] ] } }) if (player.value > 21) { text = `ПроигралnВаши карты:` + player.print + `nОчки:` + player.value + `nКарты дилера:` + dealer.print + `nОчки:` + dealer.value; client.editMessageText(text, { chat_id: chat.id, message_id: message_id, }) return; } });
Дополнительно:
Action в этот момент точно hit?
Вопрос решил сам
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для создания игры в телеграм-боте необходимо следовать нескольким шагам:
1. Создание бота в Telegram:
- Зайдите в Telegram и найдите бота под названием BotFather.
- Напишите ему сообщение /newbot и следуйте инструкциям, чтобы создать нового бота.
- Получите токен доступа к вашему боту.
2. Настройка бота:
- Напишите код на языке программирования, который будет обрабатывать запросы от пользователей и отправлять им ответы.
- Для этого можно использовать библиотеки для работы с Telegram API, например, python-telegram-bot для Python.
3. Реализация игры:
- Определите правила игры и создайте логику, которая будет управлять состоянием игры.
- Можно использовать различные типы сообщений в Telegram для взаимодействия с пользователем, например, текстовые сообщения, кнопки, изображения и т. д.
4. Тестирование и отладка:
- Протестируйте вашего бота, убедитесь, что он корректно обрабатывает запросы пользователей и отвечает на них.
- Если возникают ошибки, используйте отладчик для их исправления.
5. Развитие функционала:
- Добавьте новые возможности в вашу игру, чтобы сделать ее более интересной для пользователей.
- Продолжайте развивать и улучшать своего бота, следуя обратной связи от пользователей.
Приведенные выше шаги помогут вам создать игру в телеграм-боте и обеспечить ее успешную работу. Не забывайте следить за обновлениями Telegram API и библиотек, чтобы быть в курсе последних изменений и улучшений.