Добрый день хабрчане))
Пытаюсь создать блэкджек на 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, ` BLACKJACK\nВаши карты:` + 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;
}
});