package Ġtw . life hack ers . bg helper Ċ Ċ import Ġtw . life hack ers . bg helper . Calculation Parameter . Companion . MINUS _ WEIGHT ING _ OP POSE Ċ import Ġtw . life hack ers . bg helper . Calculation Parameter . Companion . MINUS _ WEIGHT ING _ SAME _ TEAM Ċ import Ġtw . life hack ers . bg helper . Calculation Parameter . Companion . POWER _ NUM _ TIME _ PLAY ED Ċ import Ġtw . life hack ers . bg helper . Calculation Parameter . Companion . SCORE _ BASE _ NUM _ TIME _ PLAY ED Ċ import Ġtw . life hack ers . bg helper . model . Player Ċ import Ġtw . life hack ers . bg helper . model . Team Ċ import Ġtw . life hack ers . bg helper . util . log Ċ import Ġkotlin . math . absolute Value Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . random . Random Ċ Ċ class ĠSh uff ler Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdebug Logging Ġ= ĠBuild Config . DEBUG ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġtotal Random Set Ġ= Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġshuffle (): ĠMatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame States Ġ= ĠApp . game States ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Players Ġ= Ġgame States . get Available Players () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug Logging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdbg (" --------+ ĠAll ĠAvailable ĠP layers Ġ+ -------- ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Players . forEach Indexed Ġ{ Ġindex , Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdbg ("$ index Ġ- Ġ${ player . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdbg (" -------------------------------- --------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Set Ġ= Ġmutable Set Of < Match >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( total Random Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Set . add ( create Random Match Set ( available Players )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdbg (" Number Ġof Ġsets : Ġ${ random Set . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfact Ġ= ĠGame States Fact . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted List Ġ= Ġrandom Set . sorted By Ġ{ Ġmatch Set Ġ-> Ġmatch Set . get Score ( fact ) Ġ}. reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug Logging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdbg (" -----------+ ĠTop ĠTen ĠMatch Ġ+ ------------- ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Or 1 0 Ġ= ĠMath . min ( sort edList . size , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub List ( 0 , Ġsize Or 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Indexed Ġ{ Ġindex , Ġmatch Ġ-> Ġdbg ("[ ${ index Ġ+ Ġ 1 } ][ ${ match . get Score ( fact )} ] Ġ$ match ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdbg (" -------------------------------- --------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġsorted List . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdbg (" Selected Ġmatch : Ġ$ selected , Ġscore : Ġ${ selected . get Score ( fact )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġselected ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdbg ( str : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! debug Logging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ("[ Shuffle ] Ġ$ str ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Random Match Set ( available Players : ĠList < Player >): ĠMatch Ġ= Ġmutable ListOf < Player >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġadd All ( available Players ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteam A Ġ= ĠTeam . create ( getRandom And Remove (), ĠgetRandom And Remove ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteam B Ġ= ĠTeam . create ( getRandom And Remove (), ĠgetRandom And Remove ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMatch . create ( team A , Ġteam B ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠMatch Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġteam A : ĠTeam , ĊĠĠĠĠĠĠĠ Ġval Ġteam B : ĠTeam ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate ( team X : ĠTeam , Ġteam Y : ĠTeam ): ĠMatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hash Set Of ( team X . player 1 , Ġteam X . player 2 , Ġteam Y . player 1 , Ġteam Y . player 2 ). size Ġ!= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" duplicate Ġplayer Ġin Ġa ĠMatch ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( team X . player 1 . name Ġ< Ġteam Y . player 1 . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatch ( team X , Ġteam Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatch ( team Y , Ġteam X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġscore : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Score ( game States Fact : ĠGame States Fact ): ĠInt Ġ= Ġscore Ġ?: Ġcalculate Score ( game States Fact ). let Ġ{ Ġcalculation Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Match . score Ġ= Ġcalculation Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculation Result ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate Score ( game States Fact : ĠGame States Fact ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscore Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ+= Ġ( game States Fact . high NumberOf Play ed Games Ġ- Ġteam A . player 1 . getNum Times Play ed ()). toDouble (). times ( SCORE _ BASE _ NUM _ TIME _ PLAY ED ). power ( POWER _ NUM _ TIME _ PLAY ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ+= Ġ( game States Fact . high NumberOf Play ed Games Ġ- Ġteam A . player 2 . getNum Times Play ed ()). toDouble (). times ( SCORE _ BASE _ NUM _ TIME _ PLAY ED ). power ( POWER _ NUM _ TIME _ PLAY ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ+= Ġ( game States Fact . high NumberOf Play ed Games Ġ- Ġteam B . player 1 . getNum Times Play ed ()). toDouble (). times ( SCORE _ BASE _ NUM _ TIME _ PLAY ED ). power ( POWER _ NUM _ TIME _ PLAY ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ+= Ġ( game States Fact . high NumberOf Play ed Games Ġ- Ġteam B . player 2 . getNum Times Play ed ()). toDouble (). times ( SCORE _ BASE _ NUM _ TIME _ PLAY ED ). power ( POWER _ NUM _ TIME _ PLAY ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ-= ĠApp . game States . getPlayer Pair Attributes ( team A )?. num Team Up ?. toDouble ()?. times ( MINUS _ WEIGHT ING _ SAME _ TEAM ) Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ-= ĠApp . game States . getPlayer Pair Attributes ( team B )?. num Team Up ?. toDouble ()?. times ( MINUS _ WEIGHT ING _ SAME _ TEAM ) Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ-= ĠApp . game States . getPlayer Pair Attributes ( Team . create ( team A . player 1 , Ġteam B . player 1 )) ?. num Opp ose ?. toDouble ()?. times ( MINUS _ WEIGHT ING _ OP POSE ) Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ-= ĠApp . game States . getPlayer Pair Attributes ( Team . create ( team A . player 1 , Ġteam B . player 2 )) ?. num Opp ose ?. toDouble ()?. times ( MINUS _ WEIGHT ING _ OP POSE ) Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ-= ĠApp . game States . getPlayer Pair Attributes ( Team . create ( team A . player 2 , Ġteam B . player 1 )) ?. num Opp ose ?. toDouble ()?. times ( MINUS _ WEIGHT ING _ OP POSE ) Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ-= ĠApp . game States . getPlayer Pair Attributes ( Team . create ( team A . player 2 , Ġteam B . player 2 )) ?. num Opp ose ?. toDouble ()?. times ( MINUS _ WEIGHT ING _ OP POSE ) Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġscore . round ToInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠDouble . power ( power : ĠDouble ): ĠDouble Ġ= ĠMath . pow ( this , Ġpower ) Ċ private Ġfun ĠDouble . power ( power : ĠInt ): ĠDouble Ġ= ĠMath . pow ( this , Ġpower . toDouble ()) Ċ Ċ class ĠCalcul ation Parameter Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS CORE _ BASE _ NUM _ TIME _ PLAY ED Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPO WER _ NUM _ TIME _ PLAY ED Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN US _ WEIGHT ING _ SAME _ TEAM Ġ= Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN US _ WEIGHT ING _ OP POSE Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠGame States Fact Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġhigh NumberOf Play ed Games : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate (): ĠGame States Fact Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame States Ġ= ĠApp . game States ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhigh NumberOf Play ed Games Ġ= Ġgame States . getPlayer List (). map Ġ{ Ġplayer Ġ-> Ġplayer . getNum Times Play ed () Ġ}. max () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGame States Fact ( high NumberOf Play ed Games ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< E > ĠCollection < E >. getRandom (): ĠE Ġ{ ĊĠĠĠ Ġval Ġindex Ġ= ĠRandom . nextInt (). absolute Value Ġ% Ġsize ĊĠĠĠ Ġreturn Ġelement At ( index ) Ċ } Ċ Ċ private Ġfun Ġ< E > ĠMutable Collection < E >. getRandom And Remove (): ĠE Ġ{ ĊĠĠĠ Ġval Ġvalue Ġ= ĠgetRandom () ĊĠĠĠ Ġremove ( value ) ĊĠĠĠ Ġreturn Ġvalue Ċ } Ċ