Advertisement
kompilainenn

Untitled

Aug 11th, 2024
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.48 KB | None | 0 0
  1. import random
  2.  
  3. from aiogram import Bot, Dispatcher, F
  4. from aiogram.filters import Command, CommandStart
  5. from aiogram.types import Message
  6.  
  7. # Вместо BOT TOKEN HERE нужно вставить токен вашего бота,
  8. # полученный у @BotFather
  9. with open('TOKEN.txt') as f:
  10.     BOT_TOKEN = f.read()
  11.  
  12. # Создаем объекты бота и диспетчера
  13. bot = Bot(BOT_TOKEN)
  14. dp = Dispatcher()
  15.  
  16. # Количество попыток, доступных пользователю в игре
  17. ATTEMPTS = 7
  18.  
  19. # Словарь, в котором будут храниться данные пользователя
  20. users = {}
  21.  
  22.  
  23. # Функция возвращающая случайное целое число от 1 до 100
  24. def get_random_number() -> int:
  25.     return random.randint(1, 100)
  26.  
  27.  
  28. # Этот хэндлер будет срабатывать на команду "/start"
  29. @dp.message(CommandStart())
  30. async def process_start_command(message: Message):
  31.     await message.answer(
  32.         'Привет!\nДавайте сыграем в игру "Угадай число"?\n\n'
  33.         'Чтобы получить правила игры и список доступных '
  34.         'команд - отправьте команду /help'
  35.     )
  36.     # Если пользователь только запустил бота и его нет в словаре '
  37.     # 'users - добавляем его в словарь
  38.     if message.from_user.id not in users:
  39.         users[message.from_user.id] = {
  40.             'in_game': False,
  41.             'secret_number': None,
  42.             'attempts': None,
  43.             'total_games': 0,
  44.             'wins': 0
  45.         }
  46.  
  47.  
  48. # Этот хэндлер будет срабатывать на команду "/help"
  49. @dp.message(Command(commands='help'))
  50. async def process_help_command(message: Message):
  51.     await message.answer(
  52.         f'Правила игры:\n\nЯ загадываю число от 1 до 100, '
  53.         f'а вам нужно его угадать\nУ вас есть {ATTEMPTS} '
  54.         f'попыток\n\nДоступные команды:\n/help - правила '
  55.         f'игры и список команд\n/cancel - выйти из игры\n'
  56.         f'/stat - посмотреть статистику\n\nДавай сыграем?'
  57.     )
  58.  
  59.  
  60. # Этот хэндлер будет срабатывать на команду "/stat"
  61. @dp.message(Command(commands='stat'))
  62. async def process_stat_command(message: Message):
  63.     await message.answer(
  64.         f'Всего игр сыграно: '
  65.         f'{users[message.from_user.id]["total_games"]}\n'
  66.         f'Игр выиграно: {users[message.from_user.id]["wins"]}'
  67.     )
  68.  
  69.  
  70. # Этот хэндлер будет срабатывать на команду "/cancel"
  71. @dp.message(Command(commands='cancel'))
  72. async def process_cancel_command(message: Message):
  73.     if users[message.from_user.id]['in_game']:
  74.         users[message.from_user.id]['in_game'] = False
  75.         await message.answer(
  76.             'Вы вышли из игры. Если захотите сыграть '
  77.             'снова - напишите об этом'
  78.         )
  79.     else:
  80.         await message.answer(
  81.             'А мы итак с вами не играем. '
  82.             'Может, сыграем разок?'
  83.         )
  84.  
  85.  
  86. # Этот хэндлер будет срабатывать на согласие пользователя сыграть в игру
  87. @dp.message(F.text.lower().in_(['да', 'давай', 'сыграем', 'игра',
  88.                                 'играть', 'хочу играть']))
  89. async def process_positive_answer(message: Message):
  90.     if not users[message.from_user.id]['in_game']:
  91.         users[message.from_user.id]['in_game'] = True
  92.         users[message.from_user.id]['secret_number'] = get_random_number()
  93.         users[message.from_user.id]['attempts'] = ATTEMPTS
  94.         await message.answer(
  95.             'Ура!\n\nЯ загадал число от 1 до 100, '
  96.             'попробуй угадать!'
  97.         )
  98.     else:
  99.         await message.answer(
  100.             'Пока мы играем в игру я могу '
  101.             'реагировать только на числа от 1 до 100 '
  102.             'и команды /cancel и /stat'
  103.         )
  104.  
  105.  
  106. # Этот хэндлер будет срабатывать на отказ пользователя сыграть в игру
  107. @dp.message(F.text.lower().in_(['нет', 'не', 'не хочу', 'не буду']))
  108. async def process_negative_answer(message: Message):
  109.     if not users[message.from_user.id]['in_game']:
  110.         await message.answer(
  111.             'Жаль :(\n\nЕсли захотите поиграть - просто '
  112.             'напишите об этом'
  113.         )
  114.     else:
  115.         await message.answer(
  116.             'Мы же сейчас с вами играем. Присылайте, '
  117.             'пожалуйста, числа от 1 до 100'
  118.         )
  119.  
  120.  
  121. # Этот хэндлер будет срабатывать на отправку пользователем чисел от 1 до 100
  122. @dp.message(lambda x: x.text and x.text.isdigit() and 1 <= int(x.text) <= 100)
  123. async def process_numbers_answer(message: Message):
  124.     if users[message.from_user.id]['in_game']:
  125.         if int(message.text) == users[message.from_user.id]['secret_number']:
  126.             users[message.from_user.id]['in_game'] = False
  127.             users[message.from_user.id]['total_games'] += 1
  128.             users[message.from_user.id]['wins'] += 1
  129.             await message.answer(
  130.                 'Ура!!! Вы угадали число!\n\n'
  131.                 'Может, сыграем еще?'
  132.             )
  133.         elif int(message.text) > users[message.from_user.id]['secret_number']:
  134.             users[message.from_user.id]['attempts'] -= 1
  135.             await message.answer('Мое число меньше')
  136.         elif int(message.text) < users[message.from_user.id]['secret_number']:
  137.             users[message.from_user.id]['attempts'] -= 1
  138.             await message.answer('Мое число больше')
  139.  
  140.         if users[message.from_user.id]['attempts'] == 0:
  141.             users[message.from_user.id]['in_game'] = False
  142.             users[message.from_user.id]['total_games'] += 1
  143.             await message.answer(
  144.                 f'К сожалению, у вас больше не осталось '
  145.                 f'попыток. Вы проиграли :(\n\nМое число '
  146.                 f'было {users[message.from_user.id]["secret_number"]}'
  147.                 f'\n\nДавайте сыграем еще?'
  148.             )
  149.     else:
  150.         await message.answer('Мы еще не играем. Хотите сыграть?')
  151.  
  152.  
  153. # Этот хэндлер будет срабатывать на остальные любые сообщения
  154. @dp.message()
  155. async def process_other_answers(message: Message):
  156.     if users[message.from_user.id]['in_game']:
  157.         await message.answer(
  158.             'Мы же сейчас с вами играем. '
  159.             'Присылайте, пожалуйста, числа от 1 до 100'
  160.         )
  161.     else:
  162.         await message.answer(
  163.             'Я довольно ограниченный бот, давайте '
  164.             'просто сыграем в игру?'
  165.         )
  166.  
  167.  
  168. if __name__ == '__main__':
  169.     dp.run_polling(bot)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement