Создание мини-игры в Telegram: Бот для сбора ресурсов и сражений

import logging
import random
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, CallbackContext

# Включаем логирование
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    level=logging.INFO)
logger = logging.getLogger(__name__)

# Состояние игры (простой пример)
user_data = {}

# Главное меню (включая игровые действия)
def get_main_menu():
    keyboard = [
        [InlineKeyboardButton("Собрать ресурсы", callback_data='collect_resources')],
        [InlineKeyboardButton("Улучшить персонажа", callback_data='upgrade_character')],
        [InlineKeyboardButton("Сразиться с врагом", callback_data='fight_enemy')],
        [InlineKeyboardButton("Награды", callback_data='rewards')],
        [InlineKeyboardButton("Рефералы", callback_data='referrals')],
        [InlineKeyboardButton("Колесо Фортуны", callback_data='fortune')]
    ]
    return InlineKeyboardMarkup(keyboard)

# Инициализация игрока
def init_user(user_id):
    if user_id not in user_data:
        user_data[user_id] = {
            'resources': 0,
            'level': 1,
            'health': 100
        }

# Функция для начала игры
async def start(update: Update, context: CallbackContext):
    user_id = update.message.from_user.id
    init_user(user_id)

    await update.message.reply_text('Добро пожаловать в мини-игру! Выберите действие:', reply_markup=get_main_menu())

# Функция для сбора ресурсов
async def collect_resources(update: Update, context: CallbackContext):
    user_id = update.callback_query.from_user.id
    init_user(user_id)

    resources_collected = random.randint(5, 20)
    user_data[user_id]['resources'] += resources_collected

    await update.callback_query.answer()
    await update.callback_query.edit_message_text(
        f"Вы собрали {resources_collected} ресурсов! У вас теперь {user_data[user_id]['resources']} ресурсов."
    )

# Функция для улучшения персонажа
async def upgrade_character(update: Update, context: CallbackContext):
    user_id = update.callback_query.from_user.id
    init_user(user_id)

    if user_data[user_id]['resources'] < 10:
        await update.callback_query.answer()
        await update.callback_query.edit_message_text(
            "Недостаточно ресурсов для улучшения! Нужно минимум 10 ресурсов."
        )
    else:
        user_data[user_id]['resources'] -= 10
        user_data[user_id]['level'] += 1

        await update.callback_query.answer()
        await update.callback_query.edit_message_text(
            f"Ваш персонаж улучшен! Уровень: {user_data[user_id]['level']}. Ресурсы: {user_data[user_id]['resources']}"
        )

# Функция для сражения с врагом
async def fight_enemy(update: Update, context: CallbackContext):
    user_id = update.callback_query.from_user.id
    init_user(user_id)

    if user_data[user_id]['health'] <= 0:
        await update.callback_query.answer()
        await update.callback_query.edit_message_text(
            "Ваш персонаж мертв и не может сражаться. Сначала улучшите его!"
        )
    else:
        enemy_health = random.randint(20, 50)
        damage_dealt = random.randint(10, 30)

        user_data[user_id]['health'] -= damage_dealt

        if user_data[user_id]['health'] <= 0:
            await update.callback_query.answer()
            await update.callback_query.edit_message_text(
                f"Вы сразились с врагом! Враг нанёс {damage_dealt} урона. Вы погибли. Ваш уровень: {user_data[user_id]['level']}. "
                "Начните заново!"
            )
            user_data[user_id]['health'] = 100  # сбрасываем здоровье
        else:
            await update.callback_query.answer()
            await update.callback_query.edit_message_text(
                f"Вы сразились с врагом! Враг нанёс {damage_dealt} урона. Ваше здоровье: {user_data[user_id]['health']}."
            )

# Обработка нажатий на кнопки меню
async def button(update: Update, context: CallbackContext):
    query = update.callback_query
    await query.answer()

    if query.data == 'rewards':
        await query.edit_message_text("В этом разделе будут отображаться награды, которые вы можете получить.")
    elif query.data == 'referrals':
        await query.edit_message_text("В этом разделе вы можете пригласить друзей!")
    elif query.data == 'fortune':
        result = random.choice(['Вы выиграли бонус!', 'Повезет в следующий раз!', 'Поздравляем, получите награду!'])
        await query.edit_message_text(f"Результат Колеса Фортуны: {result}")
    elif query.data == 'collect_resources':
        await collect_resources(update, context)
    elif query.data == 'upgrade_character':
        await upgrade_character(update, context)
    elif query.data == 'fight_enemy':
        await fight_enemy(update, context)

# Основная функция
def main():
    application = Application.builder().token("ваш_токен").build()

    # Команды
    application.add_handler(CommandHandler("start", start))

    # Обработчики для кнопок меню
    application.add_handler(CallbackQueryHandler(button))

    # Запуск бота
    application.run_polling()

if __name__ == '__main__':
    main()