- Регистрация
- 13 Июн 2022
- Сообщения
- 61
- Автор темы
- #1
Для работы вам понадобятся библиотеки: Aiogram( >=3.0 ) , asyncio, json, os.
А также, создайте файл "db.json" в папке с данным файлом
Не забудьте заполнить переменную
Бот работает только в группах!
Логика игры:
1. Игрок вводит /start в группе
2. Бот генерирует пример и начинает игру
3. Кто первый введёт правильное число - победил. Бот также отсчитывает время, за сколько секунд был дан ответ.
А также, создайте файл "db.json" в папке с данным файлом
Не забудьте заполнить переменную
token
в коде.Бот работает только в группах!
Логика игры:
1. Игрок вводит /start в группе
2. Бот генерирует пример и начинает игру
3. Кто первый введёт правильное число - победил. Бот также отсчитывает время, за сколько секунд был дан ответ.
Python:
import asyncio
import json
import random
import time
from aiogram import Bot, Dispatcher, F
from aiogram.filters import Command
from aiogram.types import Message, CallbackQuery
from aiogram.types import (ReplyKeyboardMarkup, KeyboardButton,
InlineKeyboardMarkup, InlineKeyboardButton)
token = "" # Сюда токен
bot = Bot(token)
dp = Dispatcher()
class js: # Класс для работы с JSON
def write(tab):
tab = json.dumps(tab)
tab = json.loads(str(tab))
with open("db.json", 'w', encoding='utf-8') as file:
json.dump(tab, file, indent=4, ensure_ascii=False)
def read():
with open("db.json", 'r', encoding='utf-8') as file:
return json.load(file)
data = js.read()
def is_digit(n): # Функция для проверки на число
try:
int(n)
return True
except ValueError:
return False
def generateExample(lens): # Функция для генерации примера
oper = ""
z = ["+", "-", "*"] # Массив с + - *
for i in range(lens):
if i != (lens - 1):
oper += "" + str(random.randint(1, 10)) + "" + z[random.randint(0, 2)] # Генерируем пример( вид 2*2 )
else:
oper += "" + str(random.randint(1, 20))
return oper
def calc(oper):
return eval(oper)
class db: # Класс для быстрой работы с жс-бд
def get_group_cursor(group_id): # Функция для получения курсора на таблицу
if group_id not in data:
data[group_id] = {
"status": 0,
"operation": "",
"result": 0,
"start_time": 0
}
js.write(data)
return data[group_id]
def start_game(group_id, ex, res): # Функция для старта игры
data[group_id] = {
"status": 1,
"operation": ex,
"result": int(res),
"start_time": time.time()
}
js.write(data)
def stop_game(group_id): # Функция для окончания игры
data[group_id] = {
"status": 0,
"operation": "",
"result": 0,
"start_time": 0
}
js.write(data)
class keyboard: # Класс работы с клавиатурой
def main():
kb = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(text="Начать новую игру", callback_data = "new_game")
]
],
resize_keyboard = True
)
return kb
@dp.message(Command("start")) # Обработчик команды /start
async def start_message(message: Message):
if message.chat.type == "private": # Если мы используем бота в лс
await message.answer(
"➗ Добро пожаловать в MathBot!\n"
"Для использования бота добавьте его в группу."
)
elif message.chat.type == "group": # Если в группе
group_id = str(message.chat.id)
cur = db.get_group_cursor(group_id) # Получаем курсор на группу
if cur["status"] == 0: # Если там не идёт игра
example = generateExample(random.randint(2, 4)) # Генерируем пример
db.start_game(group_id, example, calc(example)) # Начинаем игру
await message.answer(
f"Игра успешно начата!\nПример: {example}"
)
@dp.message() # Обработчик всех сообщений
async def handler_message(message: Message):
if message.chat.type == "group" and message.text:
if is_digit(message.text): # Проверяем текст на число
num = int(message.text)
group_id = str(message.chat.id)
cur = db.get_group_cursor(group_id)
if cur["status"] == 1: # Если идёт игра
if cur["result"] == num: # Если число равно результату примера
db.stop_game(group_id) # Останавливаем игру
await message.answer(
f"@{message.from_user.username} первый решил пример!\nОтвет: {num}"
f"\n\nПример был решен за {int(time.time() - cur["start_time"])} сек.",
reply_markup = keyboard.main()
)
@dp.callback_query() # Обработчик inline кнопок
async def callbackquery(call: CallbackQuery):
if call.data == "new_game":
group_id = str(call.message.chat.id)
cur = db.get_group_cursor(group_id)
if cur["status"] == 0: # Если нет игры
example = generateExample(random.randint(2, 4))
db.start_game(group_id, example, calc(example))
await bot.send_message(group_id,
f"Игра успешно начата!\nПример: {example}"
)
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())