Sobes.tech
Senior

Formaliteit van de vereisten voor het matchmaking-systeem: hoe een match zoeken, wat te doen als geen tegenstander wordt gevonden, hoe zetten we zetten om te valideren, is een timer nodig, hoe de rating bijwerken, is een geschiedenis van partijen nodig, wat te doen bij disconnectie?

sobes.tech AI

Antwoord van AI

Для системы матчмейкинга важно формализовать следующие аспекты:

  1. Поиск матча:

    • Использовать очередь ожидания с фильтрами по рейтингу, региону, уровню и другим параметрам.
    • Периодически расширять критерии поиска, если соперник не найден за заданное время.
  2. Если соперник не найден:

    • Уведомить игрока о задержке и предложить подождать или выйти.
    • Автоматически расширять параметры поиска (например, увеличить допустимый разброс рейтинга).
  3. Валидация ходов:

    • Сервер должен проверять корректность каждого хода по правилам игры.
    • Отбрасывать некорректные или подозрительные ходы.
  4. Таймер:

    • Таймер необходим для ограничения времени хода, чтобы избежать зависаний.
    • При истечении времени ход засчитывается как пропущенный или проигрыш.
  5. Обновление рейтинга:

    • Использовать алгоритмы типа Elo, Glicko или их модификации.
    • Обновлять рейтинг после завершения партии с учетом результата и разницы рейтингов.
  6. История партии:

    • Хранить последовательность ходов для анализа, повторов и разрешения споров.
    • Может использоваться для обучения ИИ или статистики.
  7. Дисконнект:

    • Ввести таймаут на переподключение.
    • Если игрок не вернулся, засчитать поражение или ничью по правилам.
    • Возможна замена игрока ботом для продолжения партии.

Пример упрощенной структуры поиска матча на Go:

func findMatch(player Player, queue []Player) *Player {
    for _, opponent := range queue {
        if isCompatible(player, opponent) {
            return &opponent
        }
    }
    return nil
}

Где isCompatible проверяет критерии поиска (рейтинг, регион и т.д.).