Создай код для бота телеграм Ты — симулятор рулетки. Отвечай как игровой бот,...

📅 23.02.2026, 22:03:29
Создай код для бота телеграм Ты — симулятор рулетки. Отвечай как игровой бот, управляй балансом одного игрока и обрабатывай команды на русском. Всегда соблюдай правила ниже. Правила игры: - Колёса: числа от 0 до 36. - Цвета: 0 — зелёное (никакое не красное/чёрное, не чёт/не нечёт). Остальные числа имеют стандартные цвета рулетки (список ниже). - Ставки доступны: - Прямая (number) — ставка на конкретное число 0–36. Выплата 35:1. - Красное/чёрное — red или black. Выплата 1:1. - Чёт/Нечёт — even или odd. Выплата 1:1. (0 — проигрыш для чёт/нечёт.) - Когда игрок делает ставку и бот проводит спин, бот случайно выбирает число 0–36 (равновероятно), сообщает число и цвет и рассчитывает выигрыш/проигрыш. - Баланс игрока обновляется: при выигрыше выплачивается прибыль по коэффициенту плюс возвращается ставка (стандартная выплата), при проигрыше ставка списывается. - Ошибочные команды — вежливое объяснение, не меняй баланс. Команды (формат ввода): - сетны <сумма> — выдать/зачислить указанную сумму игроку (положительное целое). Например: сетны 1000 - баланс — показать текущий баланс. - ставка number <число> <сумма> — прямая ставка на число. Пример: ставка number 17 50 - ставка color <red|black> <сумма> — ставка на цвет. Пример: ставка color red 200 - ставка parity <even|odd> <сумма> — ставка на чёт/нечёт. Пример: ставка parity odd 150 - help — краткая подсказка по командам. Правила выплат: - number (прямой): выигрыш = ставка 35 (прибыль). Итог к счёту = ставка + ставка35. - color / parity: выигрыш = ставка 1 (прибыль). Итог к счёту = ставка + ставка1. - В случае проигрыша ставка удерживается (списывается). Цвета чисел (европейская раскладка): Красные: 1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36 Чёрные: 2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35 Ноль: 0 (зелёный) Требования к ответу бота при командах: - При сетны <сумма>: подтвердить зачисление и показать новый баланс. - Пример ответа: Выданы 1000. Баланс: 1200. - При баланс: показать текущий баланс. - При ставка ...: 1. Проверить, корректны ли параметры и достаточно ли средств. Если нет — сообщение об ошибке. 2. Списать ставку (временно), выполнить рандомный спин (число 0–36). 3. Сообщить: выпавшее число и цвет, выиграна ли ставка, сумма выигрыша/проигрыша и новый баланс. - Формат результата: кратко и понятно. - При help: краткий список команд. Примеры взаимодействия (как бот должен отвечать): Игрок: сетны 1000 Бот: Выданы 1000. Баланс: 1000. Игрок: ставка color red 200 Бот: Спин... Выпало 7 (red). Вы выиграли 200. Баланс: 1200. Игрок: ставка number 17 50 Бот: Спин... Выпало 2 (black). Вы проиграли 50. Баланс: 1150. Игрок: ставка parity even 100 Бот: Спин... Выпало 0 (green). Вы проиграли 100. Баланс: 1050. Игрок: баланс Бот: Баланс: 1050. Дополнительно: - Всегда используй случайность (равномерно распределённую) при выборе числа. - Не предлагай реальные денежные операции или обмен на реальные деньги — это симуляция. - Если игрок вводит несколько ставок в одном сообщении, обработай их по очереди (каждая — отдельный спин) или попроси разделить команды — выбери поведение и опиши его кратко. Добавь Hash и сделай чтобы бот работал идеально и без ошибок и сделай код по длинее Создай систему бонуса которая будет давать по 12500-50000 каждые 12 часов
## Ответ: Вот **полный рабочий код Telegram-бота на Python (aiogram 3)**. Один игрок, баланс хранится в памяти. Если в сообщении несколько команд — бот обрабатывает **каждую строку отдельно (каждая — отдельный спин)**. Установить: ```bash pip install aiogram ``` Создать файл `bot.py` и вставить код: ```python import asyncio import random import hashlib import time from datetime import datetime, timedelta from aiogram import Bot, Dispatcher, types from aiogram.types import Message from aiogram.filters import CommandStart TOKEN = "ВАШ_ТОКЕН_БОТА_ЗДЕСЬ" bot = Bot(token=TOKEN) dp = Dispatcher() # ================= ДАННЫЕ ИГРОКА ================= balance = 0 last_bonus_time = None # ================= КОНСТАНТЫ ================= RED_NUMBERS = { 1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36 } BLACK_NUMBERS = { 2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35 } BONUS_MIN = 12500 BONUS_MAX = 50000 BONUS_COOLDOWN = 12 * 60 * 60 # 12 часов в секундах # ================= ВСПОМОГАТЕЛЬНЫЕ ================= def get_color(number: int) -> str: if number == 0: return "green" if number in RED_NUMBERS: return "red" if number in BLACK_NUMBERS: return "black" return "unknown" def generate_hash() -> str: data = str(random.random()) + str(time.time()) return hashlib.sha256(data.encode()).hexdigest()[:16] def can_get_bonus(): global last_bonus_time if last_bonus_time is None: return True return (time.time() - last_bonus_time) >= BONUS_COOLDOWN def time_until_bonus(): global last_bonus_time if last_bonus_time is None: return 0 remaining = BONUS_COOLDOWN - (time.time() - last_bonus_time) return max(0, int(remaining)) # ================= КОМАНДЫ ================= @dp.message(CommandStart()) async def start_handler(message: Message): await message.answer("Рулетка запущена. Введите help для списка команд.") @dp.message() async def handle_message(message: Message): global balance, last_bonus_time responses = [] lines = message.text.strip().split("\n") for line in lines: parts = line.strip().split() if not parts: continue cmd = parts[0].lower() # ================= HELP ================= if cmd == "help": responses.append( "Команды:\n" "сетны <сумма>\n" "баланс\n" "ставка number <0-36> <сумма>\n" "ставка color <red|black> <сумма>\n" "ставка parity <even|odd> <сумма>\n" "бонус" ) # ================= БАЛАНС ================= elif cmd == "баланс": responses.append(f"Баланс: {balance}.") # ================= СЕТНЫ ================= elif cmd == "сетны": if len(parts) != 2 or not parts[1].isdigit(): responses.append("Ошибка: укажите положительную сумму.") continue amount = int(parts[1]) if amount <= 0: responses.append("Ошибка: сумма должна быть положительной.") continue balance += amount responses.append(f"Выданы {amount}. Баланс: {balance}.") # ================= БОНУС ================= elif cmd == "бонус": if can_get_bonus(): bonus = random.randint(BONUS_MIN, BONUS_MAX) balance += bonus last_bonus_time = time.time() responses.append( f"Бонус получен: {bonus}. Баланс: {balance}." ) else: remaining = time_until_bonus() hours = remaining // 3600 minutes = (remaining % 3600) // 60 responses.append( f"Бонус будет доступен через {hours}ч {minutes}м." ) # ================= СТАВКА ================= elif cmd == "ставка": if len(parts) < 4: responses.append("Ошибка: неверный формат ставки.") continue bet_type = parts[1].lower() # ---------- NUMBER ---------- if bet_type == "number": if len(parts) != 4: responses.append("Ошибка: ставка number <число> <сумма>") continue if not parts[2].isdigit() or not parts[3].isdigit(): responses.append("Ошибка: число и сумма должны быть целыми.") continue number = int(parts[2]) amount = int(parts[3]) if number < 0 or number > 36: responses.append("Ошибка: число 0–36.") continue if amount <= 0 or amount > balance: responses.append("Ошибка: недостаточно средств.") continue balance -= amount spin = random.randint(0, 36) color = get_color(spin) spin_hash = generate_hash() if spin == number: win = amount * 35 balance += amount + win responses.append( f"Спин... Выпало {spin} ({color}). " f"Вы выиграли {win}. Баланс: {balance}. Hash: {spin_hash}" ) else: responses.append( f"Спин... Выпало {spin} ({color}). " f"Вы проиграли {amount}. Баланс: {balance}. Hash: {spin_hash}" ) # ---------- COLOR ---------- elif bet_type == "color": if len(parts) != 4: responses.append("Ошибка: ставка color <red|black> <сумма>") continue choice = parts[2].lower() if choice not in ("red", "black"): responses.append("Ошибка: только red или black.") continue if not parts[3].isdigit(): responses.append("Ошибка: сумма должна быть числом.") continue amount = int(parts[3]) if amount <= 0 or amount > balance: responses.append("Ошибка: недостаточно средств.") continue balance -= amount spin = random.randint(0, 36) color = get_color(spin) spin_hash = generate_hash() if spin != 0 and color == choice: win = amount balance += amount + win responses.append( f"Спин... Выпало {spin} ({color}). " f"Вы выиграли {win}. Баланс: {balance}. Hash: {spin_hash}" ) else: responses.append( f"Спин... Выпало {spin} ({color}). " f"Вы проиграли {amount}. Баланс: {balance}. Hash: {spin_hash}" ) # ---------- PARITY ---------- elif bet_type == "parity": if len(parts) != 4: responses.append("Ошибка: ставка parity <even|odd> <сумма>") continue choice = parts[2].lower() if choice not in ("even", "odd"): responses.append("Ошибка: только even или odd.") continue if not parts[3].isdigit(): responses.append("Ошибка: сумма должна быть числом.") continue amount = int(parts[3]) if amount <= 0 or amount > balance: responses.append("Ошибка: недостаточно средств.") continue balance -= amount spin = random.randint(0, 36) color = get_color(spin) spin_hash = generate_hash() win_condition = ( spin != 0 and ((spin % 2 == 0 and choice == "even") or (spin % 2 == 1 and choice == "odd")) ) if win_condition: win = amount balance += amount + win responses.append( f"Спин... Выпало {spin} ({color}). " f"Вы выиграли {win}. Баланс: {balance}. Hash: {spin_hash}" ) else: responses.append( f"Спин... Выпало {spin} ({color}). " f"Вы проиграли {amount}. Баланс: {balance}. Hash: {spin_hash}" ) else: responses.append("Ошибка: неизвестный тип ставки.") else: responses.append("Неизвестная команда. Введите help.") await message.answer("\n".join(responses)) # ================= ЗАПУСК ================= async def main(): await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) ``` --- ### Что реализовано: ✔ Полная рулетка 0–36 ✔ Цвета по европейской раскладке ✔ Все типы ставок ✔ Корректные выплаты 35:1 и 1:1 ✔ Проверка ошибок ✔ Хеш каждого спина ✔ Несколько команд в одном сообщении ✔ Бонус 12500–50000 каждые 12 часов ✔ Чёткая обработка баланса ✔ Без реальных денег (симуляция) Если нужно — сделаю версию с базой данных и поддержкой нескольких игроков.