Бот игнорирует и не обрабатывает ответ. Телеграм Бот - Камень, Ножницы, Бумага
Все функции работают без ошибки но бот не обрабатывает выбор игрока и игрока2, а просто игнорирует после начала игры. Не понимаю что не так, даже chatgpt не смог исправить, всё равно игнорирует выбор игрока из 3 вариантов(камень, ножницы, бумага) но работает Сдаться.
import json
import os
from telebot import types
from config import BOT_TOKEN
bot = telebot.TeleBot(BOT_TOKEN)
# Загрузка файла profiles.json
if os.path.exists('profiles.json'):
with open('profiles.json', 'r') as f:
try:
profiles = json.load(f)
except json.JSONDecodeError:
profiles = {}
else:
profiles = {}
#сохранение данных в файл profiles.json
def save_profiles():
with open('profiles.json', 'w') as f:
json.dump(profiles, f, indent=4)
# /start
@bot.message_handler(commands=['start'])
def start(message):
user_id = str(message.from_user.id)
if user_id not in profiles:
profiles[user_id] = {'wins': 0, 'losses': 0, 'draws': 0}
save_profiles()
args = message.text.split()
if len(args) > 1:
# переход по уникальной ссылке
game_id = args[1]
if game_id in profiles:
if 'opponent' not in profiles[game_id]:
profiles[game_id]['opponent'] = user_id
profiles[user_id]['opponent'] = game_id
save_profiles()
# меню выбора
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton("Камень")
btn2 = types.KeyboardButton("Ножницы")
btn3 = types.KeyboardButton("Бумага")
btn4 = types.KeyboardButton("Сдаться")
markup.add(btn1, btn2, btn3, btn4)
# Уведомляем обоих игроков
bot.send_message(message.chat.id, "Игра началась! Выберите ваш вариант:", reply_markup=markup)
bot.send_message(game_id, "Игра началась! Выберите ваш вариант:", reply_markup=markup)
return
else:
bot.send_message(message.chat.id, "Ошибка: Игра уже началась.")
return
else:
bot.send_message(message.chat.id, "Ошибка: Неверный идентификатор игры.")
return
# Если не был найден game_id, показываем меню
show_main_menu(message.chat.id)
# Функция для отображения основного меню
def show_main_menu(chat_id):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton("Начать игру")
btn2 = types.KeyboardButton("Мой профиль")
markup.add(btn1, btn2)
bot.send_message(chat_id, "Добро пожаловать в игру 'Камень, ножницы, бумага'!", reply_markup=markup)
# нажатия на кнопки меню
@bot.message_handler(func=lambda message: True)
def menu_handler(message):
user_id = str(message.from_user.id)
if message.text == "Начать игру":
link = f"https://t.me/{bot.get_me().username}?start={user_id}"
profiles[user_id]['game_id'] = user_id
save_profiles()
bot.send_message(message.chat.id, f"Отправьте эту ссылку вашему другу для начала игры:\n{link}")
elif message.text == "Мой профиль":
wins = profiles[user_id]['wins']
losses = profiles[user_id]['losses']
draws = profiles[user_id]['draws']
bot.send_message(message.chat.id, f"Ваш профиль:\nПобеды: {wins}\nПоражения: {losses}\nНичьи: {draws}")
elif message.text == "Сдаться":
surrender_game(message)
# выбор варианта (камень, ножницы, бумага)
@bot.message_handler(func=lambda message: message.text in ["Камень", "Ножницы", "Бумага", "Сдаться"])
def play_round(message):
user_id = str(message.from_user.id)
choice = message.text
if user_id in profiles:
if 'opponent' in profiles[user_id]:
opponent_id = profiles[user_id]['opponent']
if choice == "Сдаться":
surrender_game(message)
return
if 'choice' not in profiles[user_id]:
profiles[user_id]['choice'] = choice
bot.send_message(message.chat.id, "Принято! Ваш выбор зафиксирован.")
if 'choice' in profiles[opponent_id]:
opponent_choice = profiles[opponent_id]['choice']
result = determine_winner(choice, opponent_choice)
if result == "win":
profiles[user_id]['wins'] += 1
profiles[opponent_id]['losses'] += 1
bot.send_message(message.chat.id, f"Вы выиграли! Противник выбрал {opponent_choice}.")
bot.send_message(opponent_id, f"Вы проиграли! Противник выбрал {choice}.")
elif result == "lose":
profiles[user_id]['losses'] += 1
profiles[opponent_id]['wins'] += 1
bot.send_message(message.chat.id, f"Вы проиграли! Противник выбрал {opponent_choice}.")
bot.send_message(opponent_id, f"Вы выиграли! Противник выбрал {choice}.")
else:
profiles[user_id]['draws'] += 1
profiles[opponent_id]['draws'] += 1
bot.send_message(message.chat.id, f"Ничья! Вы оба выбрали {choice}.")
bot.send_message(opponent_id, f"Ничья! Вы оба выбрали {choice}.")
del profiles[user_id]['choice']
del profiles[opponent_id]['choice']
del profiles[user_id]['opponent']
del profiles[opponent_id]['opponent']
save_profiles()
show_main_menu(message.chat.id)
show_main_menu(opponent_id)
else:
bot.send_message(message.chat.id, "Ждем выбора противника...")
else:
bot.send_message(message.chat.id, "Вы уже сделали свой выбор.")
else:
bot.send_message(message.chat.id, "Игра не началась или противник не присоединился.")
else:
bot.send_message(message.chat.id, "Игра не началась или вы не участвуете в игре.")
# команда сдаться
def surrender_game(message):
user_id = str(message.from_user.id)
opponent_id = profiles[user_id].get('opponent')
if opponent_id:
profiles[user_id]['losses'] += 1
profiles[opponent_id]['wins'] += 1
bot.send_message(message.chat.id, "Вы сдались! Противник выиграл.")
bot.send_message(opponent_id, "Противник сдался! Вы выиграли.")
del profiles[user_id]['opponent']
del profiles[opponent_id]['opponent']
save_profiles()
show_main_menu(message.chat.id)
show_main_menu(opponent_id)
else:
bot.send_message(message.chat.id, "Игра не началась или вы не участвуете в игре.")
# определения победителя
def determine_winner(choice1, choice2):
if choice1 == choice2:
return "draw"
if (choice1 == "Камень" and choice2 == "Ножницы") or \
(choice1 == "Ножницы" and choice2 == "Бумага") or \
(choice1 == "Бумага" and choice2 == "Камень"):
return "win"
return "lose"
bot.polling()
Ответы (1 шт):
Автор решения: kretoffer
→ Ссылка
У тебя есть два message_handler'а, по этому срабатывает только 1. Размести второй message_handler (который отвечает за варианты выбора) в коде выше первого, это должно помочь