Как разработать частичное предсказание на стороне клиента, если клиент хранит только частичное состояние? - PullRequest
0 голосов
/ 16 июня 2019

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 функция)?

Oneспособ для ServerStateView иметь те же поля, что и ServerState, хранить только информацию, доступную пользователю, и «секретные поля», вызывающие исключения при доступе или возвращающие UnknownData() экземпляры (например, coins будет возвращать только фактическоеномер при доступе с текущим player_id и не будет содержать никаких «секретных данных», например что-то вроде coins = SecretDict(player_id = state.coins[player_id]).Но мне кажется, что это довольно хрупкий дизайн, интересно, другие люди уже «решили его».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...