package Ġit . uni bo . ai . did att ica . comp etition . tab lut . game . board Ċ Ċ import Ġit . uni bo . ai . did att ica . comp etition . tab lut . game . rules . Movement Rule Ċ import Ġit . uni bo . ai . did att ica . comp etition . tab lut . domain . Action Ċ import Ġit . uni bo . ai . did att ica . comp etition . tab lut . domain . State Ċ import Ġit . uni bo . ai . did att ica . comp etition . tab lut . domain . State . Pawn Ċ import Ġit . uni bo . ai . did att ica . comp etition . tab lut . domain . State . Turn Ċ import Ġit . uni bo . ai . did att ica . comp etition . tab lut . domain . State Tab lut Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠSize Ġof Ġthe Ġboard . Ċ Ġ*/ Ċ val ĠState . size : ĠInt ĊĠĠĠ Ġget () Ġ= Ġboard . size Ċ Ċ /** Ċ Ġ* ĠCenter Ġcell Ġof Ġthe Ġgame Ġboard . Ċ Ġ*/ Ċ val ĠState . center : ĠCoord ĊĠĠĠ Ġget () Ġ= ĠCoord ( board . size Ġ/ Ġ 2 , Ġboard . size Ġ/ Ġ 2 ) Ċ Ċ /** Ċ Ġ* ĠA Ġlist Ġof Ġall Ġthe Ġpossible Ġcells Ġof Ġthe Ġboard Ġexpressed Ġas Ġa ĠCoord Ġobject . Ċ Ġ*/ Ċ val ĠState . all Coords : ĠCollection < Coord > ĊĠĠĠ Ġget () Ġ= Ġboard . indices . as Sequence (). flatMap Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠ Ġboard . indices . map Ġ{ Ġj Ġ-> ĠCoord ( i , Ġj ) Ġ}. as Sequence () ĊĠĠĠ Ġ}. toList () Ċ Ċ /** Ċ Ġ* ĠA Ġlist Ġof Ġall Ġthe Ġpossible Ġactions Ġ( each Ġof Ġthem , Ġnot Ġjust Ġthe Ġlegal Ġones ) Ġin Ġa Ġstate . Ċ Ġ*/ Ċ val ĠState . all Moves : ĠCollection < Action > ĊĠĠĠ Ġget () Ġ= Ġall Coords . flatMap Ġ{ Ġstart Ġ-> ĊĠĠĠĠĠĠĠ Ġall Coords . map Ġ{ Ġend Ġ-> ĠAction ( start . toString (), Ġend . toString (), Ġturn ) Ġ} ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠThe Ġcells Ġof Ġthe Ġboard Ġwhere Ġblack Ġp awns Ġare Ġposition ed Ġat Ġthe Ġbeginning Ġof Ġthe Ġgame . Ċ Ġ*/ Ċ fun ĠState Tab lut . cit ade ls (): ĠSet < Coord > Ġ= Ġcenter ĊĠĠĠĠĠĠĠ Ġ. coords Around ( size Ġ/ Ġ 2 , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġset Of ( it , Ġ* it . coords Around ( 1 , Ġthis ). to Typed Array ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () Ċ Ċ /** Ċ Ġ* ĠThe Ġcells Ġof Ġthe Ġgame Ġboard Ġthe Ġking Ġmust Ġreach Ġin Ġorder Ġto Ġlet Ġwhite Ġplayer Ġwin . Ċ Ġ*/ Ċ fun ĠState Tab lut . win ning Cells (): ĠSet < Coord > Ġ= Ġall Coords ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( i , Ġj ) Ġ-> Ġi Ġ== Ġ 0 Ġ|| Ġi Ġ== Ġsize Ġ- Ġ 1 Ġ|| Ġj Ġ== Ġ 0 Ġ|| Ġj Ġ== Ġsize Ġ- Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( i , Ġj ) Ġ-> Ġabs ( i Ġ- Ġj ) Ġ!= Ġ 0 Ġ&& Ġabs ( i Ġ- Ġj ) Ġ!= Ġsize Ġ- Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġcoord Ġ-> Ġ! cit ade ls (). contains ( coord ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () Ċ Ċ /** Ċ Ġ* ĠThe Ġset Ġof Ġp awn Ġtypes Ġowned Ġby Ġeach Ġplayer . Ċ Ġ*/ Ċ val ĠTurn . p awns : ĠSet < Pawn > ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTurn . WHITE Ġ-> Ġset Of ( Pawn . WHITE , ĠP awn . K ING ) ĊĠĠĠĠĠĠĠ ĠTurn . BLACK Ġ-> Ġset Of ( Pawn . BLACK ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġset Of () ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠThe Ġplayer Ġwho Ġplays Ġagainst Ġthis Ġone . Ċ Ġ*/ Ċ val ĠTurn . opp onent : ĠTurn ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTurn . WHITE Ġ-> ĠTurn . BLACK ĊĠĠĠĠĠĠĠ ĠTurn . BLACK Ġ-> ĠTurn . WHITE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠCheck Ġwhether Ġa Ġstate Ġis Ġterminal Ġor Ġnot . Ċ Ġ*/ Ċ val ĠTurn . is Terminal : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġthis Ġ== ĠTurn . BLACK WIN Ġ|| Ġthis Ġ== ĠTurn . WHITE WIN Ġ|| Ġthis Ġ== ĠTurn . DRAW Ċ Ċ /** Ċ Ġ* ĠThe Ġp awn Ġcurrently Ġin Ġthe Ġspecified Ġcoordinate Ġof Ġthe Ġboard . Ċ Ġ*/ Ċ fun ĠState . pawn At ( c : ĠCoord ): ĠP awn Ġ= Ġboard [ c . x ][ c . y ] Ċ Ċ /** Ċ Ġ* ĠGet Ġall Ġlegal Ġmoves Ġfor Ġthe Ġplayer Ġwho Ġhas Ġto Ġmove . Ċ Ġ*/ Ċ fun ĠState . all Legal Moves ( rules : ĠCollection < Movement Rule >): ĠSet < Action > Ġ= ĊĠĠĠ Ġplayer Coords ( turn ) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlegal Moves For Coord ( it , Ġrules ). as Sequence () Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () Ċ Ċ /** Ċ Ġ* ĠGet Ġthe Ġcoordinates Ġof Ġall Ġthe Ġp awns Ġthe Ġcurrent Ġplayer Ġowns . Ċ Ġ*/ Ċ fun ĠState . player Coords ( player : ĠTurn ): ĠSet < Coord > Ġ= ĊĠĠĠ Ġboard . as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġrow Ġ-> Ġrow . map Indexed Ġ{ Ġj , Ġp awn Ġ-> ĠCoord ( i , Ġj ) Ġto Ġp awn Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ(_, Ġp awn ) Ġ-> Ġplayer . p awns . contains ( pawn ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( coord , Ġ_) Ġ-> Ġcoord Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () Ċ Ċ /** Ċ Ġ* ĠThe Ġcoordinate Ġwhere Ġthere Ġis Ġthe Ġking . Ċ Ġ*/ Ċ val ĠState . king Coord : ĠCoord ĊĠĠĠ Ġget () Ġ= Ġplayer Coords ( Turn . WHITE ). first Ġ{ Ġp awn At ( it ) Ġ== ĠP awn . K ING Ġ} Ċ Ċ /** Ċ Ġ* ĠGet Ġall Ġlegal Ġmoves Ġfor Ġthe Ġpassed Ġposition Ġin Ġthe Ġcurrent Ġboard Ġstate . Ċ Ġ*/ Ċ fun ĠState . legal Moves For Coord ( coord : ĠCoord , Ġrules : ĠCollection < Movement Rule >): ĠSet < Action > Ġ= ĊĠĠĠ ĠDirection . values () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlegal Coords In Direction ( coord , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠAction ( coord . toString (), Ġit . toString (), Ġturn ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠisValid Move ( it , Ġrules ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () Ċ Ċ /** Ċ Ġ* ĠGet Ġall Ġthe Ġexisting Ġcoordinates Ġstarting Ġfrom Ġa Ġgiven Ġposition Ġand Ċ Ġ* Ġproceed ing Ġalways Ġin Ġthe Ġsame Ġdirection Ġuntil Ġthe Ġend Ġof Ġthe Ġboard Ġis Ġreached . Ċ Ġ*/ Ċ fun ĠState . coords In Direction ( coord : ĠCoord , Ġdir : ĠDirection ): ĠList < Coord > Ġ= Ġwhen Ġ( dir ) Ġ{ ĊĠĠĠ ĠDirection . TOP Ġ-> Ġcoord . coords Re aching ( Coord ( 0 , Ġcoord . y )) ĊĠĠĠ ĠDirection . DOWN Ġ-> Ġcoord . coords Re aching ( Coord ( board . size Ġ- Ġ 1 , Ġcoord . y )) ĊĠĠĠ ĠDirection . LEFT Ġ-> Ġcoord . coords Re aching ( Coord ( coord . x , Ġ 0 )) ĊĠĠĠ ĠDirection . RIGHT Ġ-> Ġcoord . coords Re aching ( Coord ( coord . x , Ġboard . size Ġ- Ġ 1 )) Ċ } Ċ Ċ /** Ċ Ġ* ĠGet Ġall Ġthe Ġexisting Ġcoordinates Ġstarting Ġfrom Ġa Ġgiven Ġposition Ġand Ċ Ġ* Ġproceed ing Ġalways Ġin Ġthe Ġsame Ġdirection Ġuntil Ġa Ġp awn Ġis Ġmet Ġor Ġthe Ġend Ġof Ġthe Ġboard Ġis Ġreached . Ċ Ġ*/ Ċ fun ĠState . legal Coords In Direction ( coord : ĠCoord , Ġdir : ĠDirection ): ĠList < Coord > Ġ= ĊĠĠĠ Ġcoords In Direction ( coord , Ġdir ). as Sequence (). take While Ġ{ Ġp awn At ( it ) Ġ== ĠP awn . EMPTY Ġ}. toList () Ċ Ċ /** Ċ Ġ* ĠCheck Ġif Ġthe Ġaction Ġis Ġvalid Ġor Ġnot Ġconsidering Ġthe Ġgame Ġrules Ġand Ġthe Ġcurrent Ġgame Ġstate . Ċ Ġ*/ Ċ fun ĠState . isValid Move ( action : ĠAction , Ġrules : ĠCollection < Movement Rule >): ĠBoolean Ġ= ĊĠĠĠ Ġrules . all Ġ{ Ġit . check ( this , Ġaction ) Ġ}