我已经绞尽脑汁想了两天了。简而言之,我正在制作一款游戏,并且针对武器和生命值实现了 2 个独立的逻辑。 (我试图使它们通用)这个概念是不存在这样的设备。该武器有一定数量的弹药,仅此而已。使用后,它会被扔掉,你会寻找另一件。我遵循这个逻辑。有一把武器,只有武器知道里面有多少子弹;玩家不应该知道任何事情;玩家的任务是在拿起武器并且有子弹的情况下重现射击。因此,任务是通过选择将哪些弹药筒添加到所使用的武器中来增加奖金。问题听起来是这样的。我不知道如何向武器添加弹药,以便拾取的弹药事先不知道武器(其他一切都一样)。我不想违反 SRP。请给我一些建议,让我朝哪个方向前进。我尝试应用访客模式并意识到它不属于这里。我也考虑过事件总线,但在我看来,它会导致同样的 SRP 违规,或者我在错误的方向上思考。
Dima
Asked:
2024-08-18 17:52:35 +0000 UTC
gth-other
Asked:
2024-08-18 16:57:24 +0000 UTC
服务器存储大约二十KB大小的字符串。该行定期被类似的行替换,变化可能是:
- 如有必要,添加一个小片段,将所有内容向右移动
- 删除一个小片段,如有必要,向左移动,所有内容都向左移动
- 将小片段中的数据替换为其他数据
及其各种组合。我们所说的小片段通常是指不超过五十字节。
服务器需要在每次更新此行后向所有善意客户端提供最新版本。由于更改相对于行的大小来说很小并且频繁发生,因此发送整行在流量消耗方面过于浪费。连接可确保所有数据包均按相同顺序无损坏、丢失、重复地传送。
我认为这个问题可以通过以下方式解决。除了线路的当前状态之外,服务器还将存储发送给客户端的最后一个数据包到达时应在客户端中的线路状态。在这种情况下,不必重新发送全部 20 KB,而只需重新发送特殊编码的更改即可。关于从新旧版本的二进制数据生成这种特殊编码的更改的主题,我可以查看哪些算法或实现?
Asdasik
Asked:
2024-08-17 22:07:50 +0000 UTC
我想让用户选择一个按钮,然后可以写入数据,然后由特定代码处理。就我而言,当用户选择一个按钮时,立即触发在所选按钮中写入数据后应触发的代码。我不知道该怎么做((
短代码:
bot.message_handler(commands=['start'])
def first_message(message):
bot.send_message(message.chat.id, f"Привет {message.from_user.first_name}. Этот бот считает прогресс дневной нормы калорий и белка(может и не считает)")
markup = ReplyKeyboardMarkup(row_width=2)
for button_name in FUNC_BUTTON:
item_button = KeyboardButton(button_name)
markup.add(item_button)
bot.send_message(message.chat.id, "Кнопочку нажмите", reply_markup=markup)
@bot.message_handler(func= lambda call:True)
def send_kall_status(message):
if message.text == "Записать че сьел":
# тот самый код который должен ожидать информацию от пользователя
elif message.text == "Посмотреть че сьел":
pass
完整代码:
import os
from telebot import TeleBot
from dotenv import load_dotenv
from db_postgres import BotDB
from telebot.types import ReplyKeyboardMarkup, KeyboardButton
load_dotenv()
BotDB = BotDB()
bot = TeleBot(os.getenv('API_KEY'))
class Data:
state = 'none'
all_calories = 0
protein = 0
writen_calories = 0
FUNC_BUTTON = ["Посмотреть че сьел", "Записать че сьел"]
data = Data()
def calc_info(message):
message_kall_info = message.text
if message_kall_info.isdigit() == True:
if data.state == 'kallories':
data.writen_calories = int(message_kall_info)
data.all_calories += data.writen_calories
bot.send_message(message.chat.id, "Введите количество белка")
data.state = 'protein'
elif data.state == 'protein':
count_protein = int(message_kall_info)
data.protein += count_protein
# bot.send_message(message.chat.id, f"Калории: {data.all_calories}, Белок: {data.protein}")
# asdas = cursor.execute("SELECT * FROM bzu_info")
# print(asdas)
else:
data.state = "none"
bot.send_message(message.chat.id, "Вы ввели не цифрууууууууууууууууууууууу")
@bot.message_handler(commands=['start'])
def first_message(message):
if (not BotDB.user_exsistis(message.from_user.id)):
BotDB.add_user(message.from_user.id, message.from_user.first_name)
else:
BotDB.user_update_last_time(message.from_user.id)
bot.send_message(message.chat.id, f"Привет {message.from_user.first_name}. Этот бот считает прогресс дневной нормы калорий и белка(может и не считает)")
markup = ReplyKeyboardMarkup(row_width=2)
for button_name in FUNC_BUTTON:
item_button = KeyboardButton(button_name)
markup.add(item_button)
bot.send_message(message.chat.id, "Кнопочку нажмите", reply_markup=markup)
@bot.message_handler(func= lambda call:True)
def send_kall_status(message):
if message.text == "Записать че сьел":
if data.state == 'none':
data.state = 'kallories'
calc_info(message)
elif data.state == 'protein':
calc_info(message)
data.state = 'none'
BotDB.add_bzu_info(message.from_user.id, data.protein, data.all_calories)
user_bzu_info = BotDB.get_bzu_info(message.from_user.id)
bot.send_message(message.chat.id, f"Количество калории: {user_bzu_info[1]}, Количество белка: {user_bzu_info[0]}")
elif message.text == "Посмотреть че сьел":
pass
bot.infinity_polling()
Nazar
Asked:
2024-08-17 21:22:01 +0000 UTC
机器人通过按钮向群组发送消息。单击此按钮后,它会要求您输入订单的全价。但由于某种原因它没有响应。该状态已声明并且机器人移动到该状态,但处理功能不起作用。代码:
async def handle_enter_price(self, callback_query: types.CallbackQuery, state: FSMContext):
order_id = callback_query.data.split('_')[2]
await state.update_data(order_id=order_id)
await callback_query.message.answer("Введіть загальну ціну збірки для всіх товарів:")
await state.set_state(Form.waiting_for_total_price_input)
current_state = await state.get_state()
print(f"Поточний стан: {current_state}")
async def process_total_price_input(self, message: types.Message, state: FSMContext):
try:
total_assembly_price = float(message.text.strip())
except ValueError:
await message.answer("Некоректне значення ціни. Введіть число.")
return
data = await state.get_data()
order_id = data['order_id']
print(order_id)
# Оновлення загальної ціни в базі даних
sql_requests.update_total_order_price(order_id, total_assembly_price)
# Надсилання підсумкового повідомлення замовнику
contractor_chat_id = sql_requests.get_contractor_chat_id(order_id)
products_info = "\n".join(
[f"Товар: {p['product']}, Артикул: {p['article']}, Вартість збірки: {total_assembly_price} грн" for p in
data['products']]
)
await self.bot.send_message(contractor_chat_id,
f"Ціна на збірку оновлена:\n"
f"{products_info}\n"
f"Загальна вартість збірки: {total_assembly_price} грн"
)
# Надсилання повідомлення в канал
await self.send_to_channel(data, order_id)
await state.clear()
注册状态:
self.dp.message.register(self.process_total_price_input, Form.waiting_for_total_price_input)
