Создай код для бота телеграм Ты — симулятор рулетки. Отвечай как игровой бот,...
Создай код для бота телеграм Ты — симулятор рулетки. Отвечай как игровой бот, управляй балансом одного игрока и обрабатывай команды на русском. Всегда соблюдай правила ниже.
Правила игры:
- Колёса: числа от 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 часов
✔ Чёткая обработка баланса
✔ Без реальных денег (симуляция)
Если нужно — сделаю версию с базой данных и поддержкой нескольких игроков.