package Ġche kers . model . players Ċ import Ġche kers . model . game . Check ers Move Ċ import Ġche kers . model . game . Check ers Game Ċ import Ġche kers . model . game . Multi Move Ċ import Ġche kers . model . game . Single Move Ċ import Ġbor ad Games . players . Human Player Ċ Ċ class ĠCheck ers Human Player ( name : ĠString ? Ġ= Ġnull ) Ġ: ĠHuman Player < Check ers Game , ĠCheck ers Move , ĠHuman Player . Human Move < Check ers Move >>( name Ġ?: Ġ" Human ĠPlayer ") Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhuman Move ( game : ĠCheck ers Game , Ġclick Coordinate : ĠPair < Int , ĠInt >, Ġprevious Part : ĠHuman Move < Check ers Move >? ): ĠHuman Move < Check ers Move > Ġ{ ĊĠĠĠĠĠĠĠ Ġconsole . info (" debug : Ġhuman Ġclicked Ġ: Ġ$ click Coordinate Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġhuman Move : ĠHuman Move < Check ers Move > ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Part Ġ== Ġnull Ġ|| Ġprevious Part . data Ġis ĠUnit Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// the Ġhuman Ġhas Ġclicked Ġon Ġthe Ġtool Ġthat Ġhe Ġwant Ġto Ġpick Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhuman Move Ġ= Ġif Ġ( game . possible Moves (). any Ġ{ Ġit . is Start With ( click Coordinate ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info (" debug : Ġhuman Ġpick up Ġtool : Ġ$ click Coordinate Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHuman Move ( move Ġ= Ġnull , ĠwaitFor Another Click Ġ= Ġtrue , Ġdata Ġ= Ġclick Coordinate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info (" debug : Ġhuman Ġclick Ġon Ġinvalid Ġcoordinate : Ġ$ click Coordinate Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Move () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Part . data Ġis ĠPair < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// the Ġhuman Ġhas Ġcompleted Ġthe Ġfirst Ġpart Ġof Ġthe Ġmove Ġ- Ġcreate Ġa Ġsingle Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Click : ĠPair < Int , ĠInt > Ġ= Ġprevious Part . data Ġas ĠPair < Int , ĠInt > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Ġ= Ġgame . possible Moves () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġsingle Move Ġ= Ġif Ġ( it Ġis ĠMulti Move Ġ&& Ġit . moves . isNotEmpty ()) Ġit . moves [ 0 ] Ġelse Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Move Ġ-> Ġsingle Move . start Ġ== Ġprevious Click Ġ&& Ġsingle Move . end Ġ== Ġclick Coordinate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" human Ġplayer Ġdont Ġknow Ġhow Ġto Ġhandle Ġthis Ġmove Ġ$ single Move ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhuman Move Ġ= Ġwhen Ġ( move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġreset Move () // il legal Ġmove , Ġreset Ġto Ġfirst Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Move Ġ-> ĠHuman Move ( move Ġ= Ġmove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMulti Move Ġ-> ĠHuman Move ( move Ġ= Ġmove . moves [ 0 ], ĠwaitFor Another Click Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ Ġthrow ĠIllegalArgumentException (" human Ġplayer Ġdont Ġknow Ġhow Ġto Ġhandle Ġthis Ġmove Ġ$ move ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// user Ġcollected Ġa Ġmult im ove , Ġexpand Ġthe Ġmult im ove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Move Ġ= Ġprevious Part . move Ġ?: Ġthrow ĠRuntimeException (" bug : previous Ġmove Ġcant Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġa Ġvalid Ġmove Ġthat Ġstart Ġwith Ġthe Ġprevious Ġpart Ġand Ġcontinue Ġwith Ġthe Ġgive Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Ġ= Ġgame . possible Moves () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠMulti Move Ġ&& Ġit . is Start With ( previous Move ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit Ġis ĠMulti Move Ġ&& Ġit . is Continue With ( previous Move , Ġclick Coordinate ) Ġ} Ġas ? ĠMulti Move ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhuman Move Ġ= Ġif Ġ( move Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// il legal Ġmove , Ġreset Ġto Ġfirst Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info (" human Ġplayer Ġ: cant Ġfind Ġa Ġmove Ġthat Ġstart Ġwith Ġ$ previous Move Ġand Ġcontinue Ġwith Ġ$ click Coordinate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info (" start Ġwith Ġoptions = Ġ${ game . possible Moves (). filter Ġ{ Ġit Ġis ĠMulti Move Ġ&& Ġit . is Start With ( previous Move ) Ġ}} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info (" continue Ġwith Ġoptions = Ġ${ game . possible Moves (). filter Ġ{ Ġit Ġis ĠMulti Move Ġ&& Ġit . is Continue With ( previous Move , Ġclick Coordinate ) Ġ}} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Move () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelevant Move Size Ġ= Ġmove . moves . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove . apply Ġ{ Ġremove All After ( if Ġ( previous Move Ġis ĠMulti Move ) Ġprevious Move . moves . size Ġelse Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info (" human Ġplayer Ġ: collected Ġ$ move ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHuman Move ( move Ġ= Ġmove , ĠwaitFor Another Click Ġ= Ġmove . moves . size Ġ< Ġrelevant Move Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhuman Move ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġreset Move (): ĠHuman Move < Check ers Move > Ġ{ ĊĠĠĠĠĠĠĠ Ġconsole . info (" human Ġplayer Ġreset Ġmove ") ĊĠĠĠĠĠĠĠ Ġ// mark Ġas Ġreset Ġwith ĠUnit Ġin Ġthe Ġdata ĊĠĠĠĠĠĠĠ Ġ// TODO Ġreset Ġche kers . ui ĊĠĠĠĠĠĠĠ Ġreturn ĠHuman Move ( move Ġ= Ġnull , ĠwaitFor Another Click Ġ= Ġtrue , Ġdata Ġ= ĠUnit )// il legal Ġmove , Ġreset Ġto Ġfirst Ġpos ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠCheck ers Move . is Start With ( first Coordinate : ĠPair < Int , ĠInt >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Move Ġ-> Ġstart Ġ== Ġfirst Coordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMulti Move Ġ-> Ġmoves [ 0 ]. start Ġ== Ġfirst Coordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ Ġthrow ĠIllegalArgumentException (" human Ġplayer Ġdont Ġknow Ġhow Ġto Ġhandle Ġthis Ġmove Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMulti Move . is Start With ( check ers Move : ĠCheck ers Move ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( check ers Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Move Ġ-> Ġmoves [ 0 ] Ġ== Ġcheck ers Move ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMulti Move Ġ-> Ġmoves . size Ġ>= Ġcheck ers Move . moves . size Ġ&& Ġmoves . slice ( 0 .. check ers Move . moves . last Index ) Ġ== Ġcheck ers Move . moves ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ Ġthrow ĠIllegalArgumentException (" human Ġplayer Ġdont Ġknow Ġhow Ġto Ġhandle Ġthis Ġmove Ġ$ check ers Move ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMulti Move . is Continue With ( check ers Move : ĠCheck ers Move , Ġnext Coordinate : ĠPair < Int , ĠInt >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( check ers Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Move Ġ-> Ġmoves [ 1 ]. end Ġ== Ġnext Coordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMulti Move Ġ-> Ġmoves . size Ġ> check ers Move . moves . size Ġ&& Ġmoves [ check ers Move . moves . last Index Ġ+ Ġ 1 ]. end Ġ== Ġnext Coordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ Ġthrow ĠIllegalArgumentException (" human Ġplayer Ġdont Ġknow Ġhow Ġto Ġhandle Ġthis Ġmove Ġ$ check ers Move ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMulti Move . removeAll After ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmoves Slice : ĠMutable List < Single Move > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġmoves . forEach Indexed Ġ{ Ġi , Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ<= Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoves Slice . add ( m ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmoves . clear () ĊĠĠĠĠĠĠĠ Ġmoves . addAll ( moves Slice ) ĊĠĠĠ Ġ} ĊĊ Ċ }