Как разработать частичное предсказание на стороне клиента, если клиент хранит только частичное состояние?
tl; dr: если мы храним истинную государственную тайну и раскрываем только те ее части, которые должны быть видны запрашивающему пользователю через "представление состояния", как мы можем реализовать предсказание на стороне клиента (вещей, которые можно было бы предсказать) с учетом этого состояния обновления работают на "реальном полном состоянии", а не на состояниях просмотра? (без дублирования кода обновления для представлений состояния)
Подумайте о наличии класса "состояние домена" сервера, который отслеживает результаты игроков и количество монет:
class SeverState(object):
scores: Dict[str, int]
coins: Dict[str, int]
нам бы хотелось, чтобы каждый клиент знал оценки других игроков, но держал в тайне счет монет и имел некоторое производное состояние (возможно, используя секретные данные), поэтому мы предоставляем только "представление" о состоянии сервера:
class ServerStateVeiw(object):
scores: Dict[str, int]
my_wealth: int
richest_id: int
def get_state_view(state: ServerState, player_id: int):
return ServerStateVeiw(
state.scores, state.coins[player_id], argmax(state.coins))
игроки могут предпринять определенные действия, чтобы изменить состояние игры
def export_rpc(f):
@wraps(f)
def wrapper(context):
new_state = f(context.player_id, context.game_state)
return get_state_view(new_state)
rpc.register(wrapper)
return wrapper
@export_rpc
def grab_a_coin(state: ServerState, player_id: int):
updated_coin_counts = state.coins[player_id].increment()
return ServerState(coins=updated_coin_counts, scores=state.scores)
@export_rpc
def buy_score(state: ServerState, player_id: int): ...
Конечно, мы не можем знать, кто является самым богатым игроком после хода grab_a_coin
) без указания сервера, но у нас определенно должно быть достаточно данных, чтобы знать наше собственное состояние и оценки других (при условии, что они не изменились).
Предположим, что мы можем полностью разделить нашу кодовую базу с клиентом. Интересно, каковы шаблоны, чтобы не повторяться в такой ситуации: как мы можем позволить пользователю предсказать их обновленное представление состояния, если наш код на стороне сервера работает с исходными состояниями (например, grab_a_coin
функция)?
Один путь для ServerStateView
иметь точно такие же поля, как ServerState
хранение только информации, доступной пользователю, и "секретные поля", вызывающие исключения при доступе или возврате UnknownData()
экземпляры (например, coins
вернет только фактическое число при доступе с текущим player_id
и не будет хранить какие-либо "секретные данные"), например, что-то вроде coins = SecretDict(player_id = state.coins[player_id])
, Но это кажется мне несколько хрупким дизайном, интересно, если другие люди уже "решили это".