Как сделать паузу после выдачи карты ботом?
Пытаюсь написать банального бота для игры в "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 шт):
- откажемся от
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)
тогда все сообщения будут изменяться.
