Баланс взводов из четырех игроков

Столько текста и не о чем, зачем ты это сделал?
Тебя спросили, можешь ли ты подтвердить, что предложенное ранее невозможно, ты не смог и ушел в философские рассуждения))

Вот мой пример, он работает))))

“If player squad = 4
then br enemy = +1”

Приведи пример, почему это работать не будет?)

1 лайк

Процитируй что из выше описанного ты считаешь философией и почему ?
Я тебе задам другой вопрос, скажи в деталях, что будет с человеком если ему воткнуть спицу в мозг ?

Ты этим кодом описал только один пунктик из тех хотелок которые предлагал на старте. И то без учёта инфраструктуры проекта и задействованных им служб. А там получится дофига

и я уже отвечал, что пока онлайн не будет хотя бы тыщ 10-15, ничего не изменится. так как время поиска боя > баланс.

Ты серьезно?
Ну давай полностью распишу.

Если взвод = 4ре человека и нет такого же взвода противника.
То БР врага +1БР

Если взвод 4ре человека и БР = 5, ждать взвод из 4х противников 5 БР, пока не найдет.

Я понимаю, хочется нагибать рандомов, но это как минимум не честно в отношении к ним и должно быть исправлено.

1 лайк

Так время не изменится, просто взвода будет бросать на БР ниже.

Ты можешь как то доказать что этот тезис ко мне применим ? Если нет, зачем ты его мне приписываешь ?

Давай так, я отвечу тебе подробно на это, если сделаешь следующее. Представим ситуацию что тебе надо запрограммировать робота абсолютно похожего на человека, приготовить бутерброд из хлеба колбасы и сливочного масла. Вот напиши алгоритм действий который бы ты ему написал для этого. Хочу посмотреть на твое понимание элементарной матчасти

Кстаати а лично против вас такую систему тоже же надо) Вы же явно лучше играете чем 90% игроков энлистед)
Требую подбор Кривого или Бабки против вас, ну и ожидание в обратном случае вам минут так 30)

Кхм я допустим был в стихийном так сказать взводе - без связи, кинь против нас нормально играющих еще и на бр выше фиг мы вообще побеждали бы и так проигрыши были)
А как отделить собравшийся стихийно взвод, от взвода со связью? А никак. Только у одних шансы весьма малы вообще вытащить против нормальной команды, а другие и в 2-3 могут вытаскивать бои, но тут все конечно же “честно”…

В твоем же стиле:
Я отвечу тебе на твой вопрос, когда ты проедишь на одноколесном велосипеде по уолтстрит держа в одной руке медведя, в другой балалайку, насвистывая песню из ред алерта. Хочу посмотреть на что ты способен в плане элементарной матчасти)))

image

2 лайка

Ну просто я вижу что ты очень наивен в плане программирования, и проявляешь простоту. Как я могу тебе что-то объяснить если ты в этом нифига не понимаешь. Я попытался тебе это широкими мазками объяснить, ты записал это в воду.

Я согласен. Буду во взводе пусть против меня их взвод стыкует. Буду без взвода, пускай против меня стыкует если они так же без взвода.

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

Я тебе код написал? Написал. Он будет работать? Будет. Если есть что ответить по факту - говори. Нет - перестань флудить.

import random
from collections import defaultdict
from typing import List, Tuple

class Player:
def init(self, id: int, br: int, squad_id: int = None):
self.id = id
self.br = br # Боевой рейтинг (1-5)
self.squad_id = squad_id # ID взвода (None для одиночных игроков)

class Matchmaker:
def init(self):
self.queues = defaultdict(list) # Очереди по БР
self.squad_counter = 0 # Счетчик для генерации ID взводов

def add_player(self, player: Player) -> int:
    """Добавляет игрока в очередь и возвращает ID его взвода"""
    if player.squad_id is None:
        player.squad_id = self.squad_counter
        self.squad_counter += 1
    self.queues[player.br].append(player)
    return player.squad_id

def find_match(self) -> Tuple[List[Player], List[Player]]:
    """Пытается найти матч, возвращает две команды или None"""
    # Сначала ищем полные взводы из 4 игроков
    for br in range(1, 6):
        squad_groups = self._group_by_squads(self.queues[br])
        for squad_id, players in squad_groups.items():
            if len(players) == 4:
                # Нашли полный взвод - ищем противников
                enemy_team = self._find_enemy_for_squad(br, players)
                if enemy_team:
                    # Удаляем игроков из очереди
                    self._remove_players_from_queue(players + enemy_team)
                    return (players, enemy_team)
    
    # Если не нашли взводы, формируем случайные команды
    return self._create_random_teams()

def _find_enemy_for_squad(self, br: int, squad: List[Player]) -> List[Player]:
    """Ищет противников для взвода"""
    # 1. Ищем такой же взвод на том же БР
    squad_groups = self._group_by_squads(self.queues[br])
    for enemy_squad_id, enemy_players in squad_groups.items():
        if enemy_squad_id != squad[0].squad_id and len(enemy_players) == 4:
            return enemy_players
    
    # 2. Если не нашли, ищем на БР выше (но не для 5 БР)
    if br < 5:
        higher_br = br + 1
        # Берем любых 4 игроков с более высоким БР
        candidates = []
        for player in self.queues[higher_br]:
            if player.squad_id is None or len(self._get_squad_players(player.squad_id, higher_br)) < 4:
                candidates.append(player)
                if len(candidates) == 4:
                    return candidates
    
    # 3. Для 5 БР ждем такого же взвода
    return None

def _group_by_squads(self, players: List[Player]) -> dict:
    """Группирует игроков по ID взвода"""
    squads = defaultdict(list)
    for player in players:
        squads[player.squad_id].append(player)
    return squads

def _get_squad_players(self, squad_id: int, br: int) -> List[Player]:
    """Возвращает всех игроков взвода с указанным БР"""
    return [p for p in self.queues[br] if p.squad_id == squad_id]

def _remove_players_from_queue(self, players: List[Player]):
    """Удаляет игроков из очереди"""
    for player in players:
        if player in self.queues[player.br]:
            self.queues[player.br].remove(player)

def _create_random_teams(self) -> Tuple[List[Player], List[Player]]:
    """Создает случайные команды из одиночных игроков"""
    all_players = []
    for br in range(1, 6):
        all_players.extend(self.queues[br])
    
    # Фильтруем одиночных игроков
    solo_players = [p for p in all_players if p.squad_id is None or len(self._get_squad_players(p.squad_id, p.br)) < 4]
    
    if len(solo_players) >= 10:
        selected = random.sample(solo_players, 10)
        team1 = selected[:5]
        team2 = selected[5:]
        self._remove_players_from_queue(team1 + team2)
        return (team1, team2)
    
    return None

Пример использования

matchmaker = Matchmaker()

Добавляем игроков

for i in range(100):
br = random.randint(1, 5)
# 25% chance to be in a squad of 4
if random.random() < 0.25 and i % 4 == 0:
squad_id = i // 4
for j in range(4):
matchmaker.add_player(Player(i+j, br, squad_id))
else:
matchmaker.add_player(Player(i, br))

Пытаемся найти матч

match = matchmaker.find_match()
if match:
team1, team2 = match
print(f"Team 1 BRs: {[p.br for p in team1]}“)
print(f"Team 2 BRs: {[p.br for p in team2]}”)
else:
print(“Not enough players for a match”)

2 лайка

Это 2 строчки кода, ни с чем не связанные, без контекста. Я не знаю о чем тут говорить.
Это как требовать имплантировать себе третюю руку, и дать только указательный палец. Указательный палец это конечно часть руки, но его как то маловато для того чтобы выполнить требуемую задачу.

Вау, сильно, откуда этот кусок кода ?

Сливы датамайна некст апдейта

1 лайк

Ну если тебя не забанят в течении следующих часов, то врятли

Я тебе пример кода привел? От тебя только горы текста и пространных рассуждений. Пиши тогда пример своего кода или посмотри тот что тебе @GachiGasMus написал. Все решаемо.

1 лайк

Имхо, это их проблемы что играют стадом, не грамотно и не слаженно, система не мешает им играть нормально, а значит это не дисбалланс. Ну если команда играет слаженно, координируя свои действия между собой то она любой бр вынесёт.