Telegram猜数字机器人每次收用户猜测就更换秘密数字问题求解
问题修复方案
核心错误点
- 赋值逻辑反向:你想将生成的随机数存入
guess_number.variable做全局存储,但代码里写成了将不存在的guess_number.variable赋值给临时变量a,直接触发未定义访问报错 - 命令处理函数结构错误:
/start命令绑定的guess_number函数没有接收telebot要求传入的message参数,也没有和后续的欢迎消息发送逻辑做关联 - 无属性初始化逻辑:第一次调用函数前
guess_number.variable不存在,直接访问必然报错
单用户可用修复代码
import random import telebot from telebot.types import Message bot = telebot.TeleBot("-token-") # 提前初始化函数属性避免首次访问报错 guess_number.variable = random.randint(0, 100) @bot.message_handler(commands = ('start')) def send_welcome(message): # 启动游戏时生成新的秘密数字存入函数属性 guess_number.variable = random.randint(0, 100) bot.send_message(message.chat.id, "you entered a guessing game, traveller. Guess a number from 0 to 100, or be eaten by a dragon.") @bot.message_handler(func=lambda message: True) def checking(message): try: user_message = int(message.text) if user_message > guess_number.variable: bot.send_message(message.chat.id, "your number is greater than mine") elif user_message < guess_number.variable: bot.send_message(message.chat.id, "your number is smaller than mine") else: bot.send_message(message.chat.id, "yep, that's the right number. Send /start to play again.") except ValueError: bot.send_message(message.chat.id, "you must enter an integer") bot.polling()
多用户兼容优化
上述单用户版本所有用户共用同一个秘密数字,若需要支持多用户同时游玩互不干扰,可改用字典按会话ID存储秘密数字:
import random import telebot from telebot.types import Message bot = telebot.TeleBot("-token-") # 全局存储字典:key为聊天会话ID,value为对应会话的秘密数字 secret_numbers = {} @bot.message_handler(commands = ('start')) def send_welcome(message): secret_numbers[message.chat.id] = random.randint(0, 100) bot.send_message(message.chat.id, "you entered a guessing game, traveller. Guess a number from 0 to 100, or be eaten by a dragon.") @bot.message_handler(func=lambda message: True) def checking(message): # 校验用户是否已启动游戏 if message.chat.id not in secret_numbers: bot.send_message(message.chat.id, "Send /start to start the game first.") return try: user_message = int(message.text) secret = secret_numbers[message.chat.id] if user_message > secret: bot.send_message(message.chat.id, "your number is greater than mine") elif user_message < secret: bot.send_message(message.chat.id, "your number is smaller than mine") else: bot.send_message(message.chat.id, "yep, that's the right number. Send /start to play again.") # 猜对后清除当前会话的记录 del secret_numbers[message.chat.id] except ValueError: bot.send_message(message.chat.id, "you must enter an integer") bot.polling()
内容的提问来源于stack exchange,提问作者Mistann
相关产品推荐
相关产品推荐

