package Ġxyz . wy w ong . just chess . engine . piece čĊč Ċ import Ġxyz . wy w ong . just chess . engine . Board č Ċ import Ġxyz . wy w ong . just chess . engine . Coordinate č Ċ import Ġxyz . wy w ong . just chess . engine . Move č Ċ import Ġxyz . wy w ong . just chess . engine . Piece čĊč Ċ abstract Ġclass ĠBase Piece ( private Ġval Ġmoved : ĠBoolean ) Ġ: ĠPiece Ġ{ čĊčĊĠĠĠ Ġoverride Ġfun Ġhas Moved (): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġmoved čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġcapture Location ( coordinate : ĠCoordinate , Ġboard : ĠBoard ): ĠCoordinate Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġcoordinate čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġget Valid Moves ( board : ĠBoard ): ĠCollection < Collection < Move >> Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġget Possible Moves ( board ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmoves Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is King Checked After Moves ( moves , Ġboard ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġget Possible Moves ( board : ĠBoard ): ĠCollection < Collection < Move >> Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġget Possible ( board ). filter Ġ{ Ġmoves Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġare Moves Valid ( moves , Ġboard ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġget Possible Dest inations ( board : ĠBoard ): ĠCollection < Coordinate > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġget Possible Coordinates ( board ). filter Ġ{ Ġcoordinate Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Destination Valid ( coordinate , Ġboard ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprotected Ġopen Ġfun Ġget Possible ( board : ĠBoard ): ĠCollection < Collection < Move >> Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġget Possible Coordinates ( board ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcoordinate Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Move ( coordinate , Ġthis )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprotected Ġabstract Ġfun Ġget Possible Coordinates ( board : ĠBoard ): ĠCollection < Coordinate > čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġreturns Ġtrue Ġif Ġall Ġmoves Ġare Ġpossible , Ġotherwise Ġfalse čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġare Moves Valid ( moves : ĠCollection < Move >, Ġboard : ĠBoard ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġall Possible : ĠBoolean Ġ= Ġmoves . all Ġ{ Ġmove Ġ-> Ġis Move Valid ( move , Ġboard ) Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġmoves . isNotEmpty () Ġ&& Ġall Possible čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġreturns Ġtrue Ġif Ġthe Ġdestination Ġof Ġthe Ġmove Ġis Ġin Ġthe Ġbounds Ġof Ġthe Ġboard čĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġand Ġif Ġthe Ġdestination Ġcoordinate Ġdoes Ġnot Ġcontain Ġa Ġpiece Ġwith Ġthe Ġsame Ġplayer Ġid čĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġotherwise Ġfalse čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġis Move Valid ( move : ĠMove , Ġboard : ĠBoard ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġis Destination Valid ( move . destination , Ġboard ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġis Destination Valid ( destination : ĠCoordinate , Ġboard : ĠBoard ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdestination In Bounds Ġ= ĠCoordinate . in Bounds ( destination ) čĊĠĠĠĠĠĠĠ Ġval Ġtarget Piece : ĠPiece ? Ġ= Ġboard . get Piece ( destination ) čĊĠĠĠĠĠĠĠ Ġval Ġdestination Empty Or Different Player Ġ= Ġtarget Piece ?. player Id Ġ!= Ġthis . player Id čĊĠĠĠĠĠĠĠ Ġreturn Ġdestination In Bounds Ġ&& Ġdestination Empty Or Different Player čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġreturns Ġtrue Ġif Ġthe Ġking Ġis Ġchecked Ġafter Ġapplying Ġthe Ġmoves , Ġotherwise Ġfalse čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġis King Checked After Moves ( moves : ĠCollection < Move >, Ġboard : ĠBoard ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġpro spect ive Board Ġ= Ġmoves . fold ( board , Ġ{ Ġupdated Board , Ġmove Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Board . move Piece ( move . destination , Ġmove . piece ) čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠ Ġreturn Ġpro spect ive Board . is King In Check ( this . player Id ) čĊĠĠĠ Ġ} č Ċ }