I'm FanJae.

[EA FC Pro club Draft Bot] 6. Draft Logic 개선 본문

Toy Project/EA FC Pro club Draft Bot [Python]

[EA FC Pro club Draft Bot] 6. Draft Logic 개선

FanJae 2024. 9. 19. 20:55

1. 기존 구현했던 Draft Logic의 문제점

- 기존 Draft Logic을 생각해보면 아래와 같은 문제가 있다.

 

① 한 팀의 추첨을 위해 설계되었다.

- 이 프로클럽이라는 모드는 보통 2팀(22인)이서 게임을 한다.

- 이 드래프트는 최대 1팀에서 최대 8팀 정도까지도 사용이 가능해야 한다. (필요에 따라서는 그 이상도 가능할 것이다.)

- 이에 따라서 봇을 재설계 하기로 했다.

 

② 기존 코드의 재사용이 어렵다.

- 기존 로직은 여러 팀으로 나눠서 하기에는 코드가 복잡해질 여지가 높았다.

- 이에 따라서, 로직을 아예 새롭게 구성하기로 하였다.

 

2. 개선 방향

 

2-1. 삭제 사항

① pick_and_remove() 삭제

def pick_and_remove(player_list, count):
    logging.debug(f"{player_list}")  # 디버깅 로그 추가
    if len(player_list) < count:
        count = len(player_list)
    choose_player = random.sample(player_list,count)

    for player in choose_player:
        player_list.remove(player)

    return choose_player

삭제 사유 : 기존 드래프트에서는 선택된 인원을 구분하기 위해 사용하였지만, 로직을 개선하면서 제거하였다.

 

2-2. 수정 사항 (드래프트 로직 전체 개선)

① 팀 수 변경 조정 및 팀 할당을 위한 데이터 구조 초기화

TEAM_COUNT = none # 팀 수 변경을 위한 처리
teams = {team_number: {} for team_number in range(1, TEAM_COUNT+1)}

- 테스트를 진행할 떄는 임의로 팀의 개수를 2팀으로 처리하였다.

 

② 슬롯 추가

if key_value in ['CM', 'CB']:
    slots_per_team = 2
else:
    slots_per_team = 1

# 슬롯 수를 계산한다.
total_slots = TEAM_COUNT * slots_per_team

- 포지션 별로 각각 필요한 인원을 슬롯으로 구분한다.

- 4-3-3 포메이션에서 CM과 CB는 각각 2명씩 필요하여 2명으로 구분하였고, 다른 인원은 팀당 1명만 있다.

 

③ 슬롯에 팀 번호를 할당

# 슬롯에 각각의 팀 번호라는 개념을 부여한다.
# 예를들어 2팀에 대한 CM을 뽑는다면 [1, 1, 2, 2] 와 같이 만들고 섞는다.
slot_assignments = []
for team_number in range(1, TEAM_COUNT+1):
    slot_assignments.extend([team_number] * slots_per_team)
    
# 슬롯 순서를 랜덤하게 섞는다.
random.shuffle(slot_assignments)

- 각 슬롯에 팀 번호를 할당해준다. 이를 랜덤하게 섞어서 플레이어들을 배정할 때 사용한다.

 

④ 랜덤 배정

# 플레이어들을 랜덤한 슬롯에 배정
for idx, team_number in enumerate(slot_assignments):
     if idx < len(users):
        user_id = users[idx]
        teams[team_number][key_value].append(user_id)
     else:
        teams[team_number][key_value].append(None) # 남은 플레이어가 없을때 사용한다.
        # 이는 추후, '남은 포지션 출력'에 사용될 예정이다.

 

if idx < len(users):
   user_id = users[idx]
   teams[team_number][key_value].append(user_id)

- 플레이어의 수(users)가 슬롯 수 보다 적은 경우에는 남은 플레이어가 없으므로 None을 배정하도록 처리한다.

 

3. TODO

1) 드래프트시 각 팀 별로 남은 포지션 인원을 한 눈에 볼 수 있도록 처리 작업 필요.

2) 여러 인원이 드래프트를 돌릴때 발생하는 문제점 해결 하기.

 

 

Comments