Skip to content

Fantasy Football Draft Implementation #17

Description

@cmay10

I'm trying to implement a rather complicated application of this. I'm trying to do a fantasy football draft. I have a class for the draft, league members, and nfl players. Everytime it is my turn to draft, I want to simulate the entire draft to determine the best possible pick. Can somebody try to point me in the right direction? I feel like I'm really close. I've added only a few members and players and set the number of rounds to 2 for testing. Obviously these classes are bare bones and I would have to make some more constraints. I'm just trying to get logic to work. Thanks.

from __future__ import division

from copy import deepcopy
from mcts import mcts
from functools import reduce
import operator

# Class for a Member of a League. Has a name, draft position, and me = True if member is me
class Member:
  def __init__(self,name,draft_pos,me=False):
    self.name = name
    self.draft_pos = draft_pos
    self.me = me
    self.roster = []

  @property
  def total_pts(self):
    return sum([p.proj for p in self.roster])

# Class for a NFL Player. Has a name, team, position, and projected Points.
class Player:
  def __init__(self,name,team,pos,proj):
    self.name = name
    self.team = team
    self.pos = pos
    self.proj = proj
    self.drafted = False


  def __repr__(self):
    return f'{self.name} {self.proj}'

# Class for a Draft. Has members, players, and number of rounds
class Draft:
  def __init__(self,members,players,num_rounds):
    self.members = members
    self.players = players
    self.num_rounds = num_rounds

  # Get Players that have been drafted
  @property
  def drafted_players(self):
    return [p for p in self.players if p.drafted == True]

  # Get Players that are undrafted
  @property
  def undrafted_players(self):
    return [p for p in self.players if p.drafted == False]

  # Get current overall pick in draft
  @property
  def current_overall_pick(self):
    return len(self.drafted_players) + 1

  # Get current round of draft
  @property
  def current_round(self):
    return ((self.current_overall_pick -1) // len(self.members)) + 1

  # Get current pick in the round
  @property
  def current_pick_in_round(self):
    return self.current_overall_pick - (len(self.members)*(self.current_round - 1))

  # Get the member that is currently drafting
  @property
  def current_member_drafting(self):
    if self.current_round % 2 != 0:
      return next((m for m in self.members if m.draft_pos == self.current_pick_in_round), None)
    elif self.current_round % 2 == 0:
      return next((m for m in self.members if m.draft_pos == (len(self.members) - self.current_pick_in_round + 1)), None)

  # Draft a player to the member that is currently drafting
  def draft_player(self,player):
    self.current_member_drafting.roster.append(player)
    print(f'{self.current_member_drafting.name} drafted {player.name}')
    player.drafted = True

  # If I am drafting, return 1, else return -1
  def getCurrentPlayer(self):
    if self.current_member_drafting.me == True:
      return 1
    else:
      return -1

  # Get a list of all players available to draft
  def getPossibleActions(self):
    possible_actions = []
    for player in self.undrafted_players:
      possible_actions.append(player)

    return possible_actions

  # Create copy of state and draft player to the current member drafting
  def takeAction(self,action):
    new = deepcopy(self)
    new.draft_player(action)
    return new

  # Node is terminal when all teams are full
  def isTerminal(self):

    if all(len(m.roster) == self.num_rounds for m in self.members):
      return True
    else:
      return False


  def getReward(self):
    me = next((m for m in self.members if m.me == True), None)
    others = [m for m in self.members if m.me == False]
    if all(me.total_pts > m.total_pts for m in others):
      return 1
    else:
      return False



if __name__=="__main__":
  m1 = Member('m1',1,me=True)
  m2 = Member('m2',2)
  m3 = Member('m3',3)

  members = [m1,m2,m3]

  p1 = Player('Tom Brady','TB','QB',300)
  p2 = Player('Josh Allen','BUF','QB',325)
  p3 = Player('Russell Wilson','DEN','QB',275)
  p4 = Player('Mac Jones','NE','QB',350)
  p5 = Player('Matt Ryan','DEN','QB',250)
  p6 = Player('Drew Lock','NE','QB',225)

  players = [p1,p2,p3,p4,p5,p6]
  draft = Draft(members,players,num_rounds=2)

  searcher = mcts(iterationLimit=10)
  action = searcher.search(initialState=draft)

  print(action)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions