Как сделать паузу после выдачи карты ботом?

Пытаюсь написать банального бота для игры в "21". Для основной игровой функции использую цикл while. Но после начала "сдачи карт", бот продолжает их "сдавать", пока не нарушится одно из условий цикла. А мне нужно, чтобы после выдачи карты бот делал паузу, ожидая дальнейшего ввода (продолжить или остановиться).

В сети находил несколько примеров исходного кода с полноценным ботом для игры в блекджек, но ввиду пока недостаточного опыта, я пока хотел использовать более простой вариант. Ниже фрагмент моего кода:

def game(message):
    count = 0
    random.shuffle(cards)
    while True:
        if message.text == 'Test':
            current = cards.pop()
            bot.send_message(message.chat.id, 'Вы получили карту: %d' %current)
            count += current
            if count > 21:
                bot.send_message(message.chat.id, 'Перебор.')
                break
            elif count == 21:
                bot.send_message(message.chat.id, 'Поздравляем! Вы выиграли!')
                break
            else:
                bot.send_message(message.chat.id, 'У вас %d очков.' %count)
        elif message.text == 'Stop':
            bot.send_message(message.chat.id, 'У вас %d очков.' %count)```



https://i.stack.imgur.com/HvkPC.png

Ответы (1 шт):

Автор решения: D. Violet
  • откажемся от while
  • добавим inline кнопки
  • воспользуемся ast и startswith

ast и startswith позволят получить данные из сообщения в callback

import ast

@bot.message_handler(commands=['21'])
def twenty_one(message, cur=0):
    cards = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
    count = 0
    random.shuffle(cards)

    current = cards.pop()
    count += current
    count += int(cur)

    t_o_kb = types.InlineKeyboardMarkup()
    t_o_k_next = types.InlineKeyboardButton(text='дальше', callback_data="['t_o_k_next', '" + str(count) + "']")
    t_o_k_stop = types.InlineKeyboardButton(text='стоп', callback_data='t_o_k_stop')
    t_o_kb.add(t_o_k_next, t_o_k_stop)
    bot.send_message(message.chat.id, 'Получена карта: {}\nОчков: {}'.format(current, count), reply_markup=t_o_kb)

    if count > 21:
        bot.send_message(message.chat.id, 'Перебор.')

    elif count == 21:
        bot.send_message(message.chat.id, 'Поздравляем! Вы выиграли!')


@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.data.startswith("['t_o_k_next'"):
        twenty_one(call.message, ast.literal_eval(call.data)[1])

    elif call.data == 't_o_k_stop':
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                          text='{}'.format(call.message.text))
        bot.send_message(call.message.chat.id, 'Решите сыграть - я всегда готов')

введите сюда описание изображения

UPD:

добавить аргумент e=1 в twenty_one():

def twenty_one(message, cur=0, e=None):
...
# и обработать условием:
    if e is None:
    bot.send_message(message.chat.id, 'Получена карта: {}\nОчков: {}'.format(current, count), reply_markup=t_o_kb)
elif e == 1:
    bot.edit_message_text(chat_id=message.chat.id, message_id=message.message_id,
                          text='Получена карта: {}\nОчков: {}'.format(current, count), reply_markup=t_o_kb)

в callback_inline передавать e=1:

twenty_one(call.message, ast.literal_eval(call.data)[1], e=1)

тогда все сообщения будут изменяться.

→ Ссылка