package Ġtop . ce clin . chinese _ chess Ċ Ċ import Ġtop . ce clin . chinese _ chess . exception . Invalid Move Exception Ċ import Ġtop . ce clin . chinese _ chess . exception . Piece NotFoundException Ċ import Ġkotlin . math . absolute Value Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġrepresents Ġthe Ġstatus Ġof Ġa Ġche ss board . Ċ Ġ*/ Ċ internal Ġclass ĠChe ss board Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġinitial (): ĠChe ss board Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠChe ss board (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( R ook Piece ( false , ĠChe ss Position (' a ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( R ook Piece ( false , ĠChe ss Position (' i ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( H orse Piece ( false , ĠChe ss Position (' b ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( H orse Piece ( false , ĠChe ss Position (' h ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ele ph ant Piece ( false , ĠChe ss Position (' c ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ele ph ant Piece ( false , ĠChe ss Position (' g ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ad vis er Piece ( false , ĠChe ss Position (' d ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ad vis er Piece ( false , ĠChe ss Position (' f ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( King Piece ( false , ĠChe ss Position (' e ', Ġ' 0 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( C annon Piece ( false , ĠChe ss Position (' b ', Ġ' 2 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( C annon Piece ( false , ĠChe ss Position (' h ', Ġ' 2 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( false , ĠChe ss Position (' a ', Ġ' 3 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( false , ĠChe ss Position (' c ', Ġ' 3 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( false , ĠChe ss Position (' e ', Ġ' 3 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( false , ĠChe ss Position (' g ', Ġ' 3 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( false , ĠChe ss Position (' i ', Ġ' 3 '))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( R ook Piece ( true , ĠChe ss Position (' a ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( R ook Piece ( true , ĠChe ss Position (' i ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( H orse Piece ( true , ĠChe ss Position (' b ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( H orse Piece ( true , ĠChe ss Position (' h ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ele ph ant Piece ( true , ĠChe ss Position (' c ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ele ph ant Piece ( true , ĠChe ss Position (' g ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ad vis er Piece ( true , ĠChe ss Position (' d ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Ad vis er Piece ( true , ĠChe ss Position (' f ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( King Piece ( true , ĠChe ss Position (' e ', Ġ' 9 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( C annon Piece ( true , ĠChe ss Position (' b ', Ġ' 7 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( C annon Piece ( true , ĠChe ss Position (' h ', Ġ' 7 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( true , ĠChe ss Position (' a ', Ġ' 6 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( true , ĠChe ss Position (' c ', Ġ' 6 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( true , ĠChe ss Position (' e ', Ġ' 6 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( true , ĠChe ss Position (' g ', Ġ' 6 '))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Piece ( Pawn Piece ( true , ĠChe ss Position (' i ', Ġ' 6 '))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom F EN ( fen : ĠString ): ĠChe ss board Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠChe ss board (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġf en . split (' Ġ', Ġlimit Ġ= Ġ 2 ). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr . split ('/ '). forEach Indexed Ġ{ Ġindex , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠCharacter . get Numeric Value ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ x ][ 9 Ġ- Ġindex ] Ġ= ĠEmpty Piece ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠChe ss Position (' a ' Ġ+ Ġx , Ġ' 0 ' Ġ+ Ġ 9 Ġ- Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ x ][ 9 Ġ- Ġindex ] Ġ= Ġmake Piece From Code ( c , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġboard : ĠArray < Array < Che ss Piece >> Ġ= ĠArray ( 9 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠArray ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Piece Ġas ĠChe ss Piece Ġ// ĠFor ĠKotlin Ġcompiler ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Piece From Code ( code : ĠChar , Ġpos : ĠChe ss Position ) Ġ= Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ' r ' Ġ-> ĠR ook Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' R ' Ġ-> ĠR ook Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' n ' Ġ-> ĠH orse Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' N ' Ġ-> ĠH orse Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' b ' Ġ-> ĠE le ph ant Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' B ' Ġ-> ĠE le ph ant Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' a ' Ġ-> ĠAd vis er Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' A ' Ġ-> ĠAd vis er Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' k ' Ġ-> ĠKing Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' K ' Ġ-> ĠKing Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' c ' Ġ-> ĠC annon Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' C ' Ġ-> ĠC annon Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' p ' Ġ-> ĠP awn Piece ( true , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ' P ' Ġ-> ĠP awn Piece ( false , Ġpos ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" It Ġis Ġnot Ġa Ġvalid Ġpiece Ġcode : Ġ$ code ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġto F EN (): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfun Ġappend Count If Ne cessary () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 9 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 .. 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpiece Ġ= Ġboard [ x ][ y ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( piece Ġ== ĠEmpty Piece ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Count If Ne cessary () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġbetter Ġto Ġextract Ġit Ġas Ġa Ġmember Ġfunction Ġof ĠChe ss Piece ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( piece ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠR ook Piece Ġ-> Ġappend (' r '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠH orse Piece Ġ-> Ġappend (' n '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE le ph ant Piece Ġ-> Ġappend (' b '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAd vis er Piece Ġ-> Ġappend (' a '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKing Piece Ġ-> Ġappend (' k '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC annon Piece Ġ-> Ġappend (' c '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠP awn Piece Ġ-> Ġappend (' p '. let Ġ{ Ġif Ġ( piece . is Black ) Ġit Ġelse Ġit . toUpperCase () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Count If Ne cessary () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ('/') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Piece ( piece : ĠChe ss Piece ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġco Ġ= Ġpiece . position . to Coordinate () ĊĠĠĠĠĠĠĠ Ġboard [ co . first ][ co . second ] Ġ= Ġpiece ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty ( pos : ĠChe ss Position ): ĠBoolean Ġ= Ġpos . to Coordinate (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġboard [ it . first ][ it . second ] Ġ== ĠEmpty Piece ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis NotEmpty ( pos : ĠChe ss Position ): ĠBoolean Ġ= Ġ! isEmpty ( pos ) ĊĊĠĠĠ Ġfun Ġpiece At ( pos : ĠChe ss Position ): ĠChe ss Piece Ġ= Ġpos . to Coordinate (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġboard [ it . first ][ it . second ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġan Ġavailable Ġpiece Ġat Ġ[ pos ], Ġreturn Ġit , Ġotherwise Ġthrow Ġan Ġ[ Piece NotFoundException ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ exception ĠPiece NotFoundException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġensure NotEmpty ( pos : ĠChe ss Position ): ĠChe ss Piece Ġ= ĊĠĠĠĠĠĠĠ Ġpiece At ( pos ). take Unless Ġ{ Ġit Ġ== ĠEmpty Piece Ġ} Ġ?: Ġthrow ĠPiece NotFoundException ( pos ) ĊĊĊĠĠĠ Ġprivate Ġobject ĠEmpty Piece Ġ: ĠChe ss Piece Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġche ss board : ĠChe ss board ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Black : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġposition : ĠChe ss Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġre tract To ( previous : ĠChe ss Position , Ġe aten : ĠChe ss Piece ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġinner Ġclass ĠAbstract Piece ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Black : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpos : ĠChe ss Position ĊĠĠĠ Ġ) Ġ: ĠChe ss Piece Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġche ss board : ĠChe ss board ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Che ss board ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġposition : ĠChe ss Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġpos ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġtarget . to Coordinate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpiece Ġ= Ġboard [ next . first ][ next . second ]. take Unless Ġ{ Ġit Ġ== ĠEmpty Piece Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( piece Ġ!= Ġnull Ġ&& Ġpiece . is Black Ġ== Ġis Black ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ next . first ][ next . second ] Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġpos . to Coordinate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ current . first ][ current . second ] Ġ= ĠEmpty Piece ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpiece ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġre tract To ( previous : ĠChe ss Position , Ġe aten : ĠChe ss Piece ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġpos . to Coordinate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ current . first ][ current . second ] Ġ= Ġe aten Ġ?: ĠEmpty Piece ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġprevious ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre Ġ= Ġprevious . to Coordinate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ pre . first ][ pre . second ] Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcheck King Piece Before Move ( move : ĠChe ss Move ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpieces Ġ= Ġ( (' 0 ' Ġuntil Ġmove . from . y ) Ġ+ Ġ(( move . from . y Ġ+ Ġ 1 ) .. ' 9 ')) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠChe ss Position ( move . from . x , Ġit ). to Coordinate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġboard [ it . first ][ it . second ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit Ġ== ĠEmpty Piece Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġprev : ĠChe ss Piece ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( p Ġin Ġpieces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Ġis ĠKing Piece Ġ&& Ġp Ġis ĠKing Piece ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( move ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠKing Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid X ( pos : ĠChe ss Position ) Ġ= Ġpos . x Ġin Ġ' d ' .. ' f ' ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid Y ( pos : ĠChe ss Position ) Ġ= Ġif Ġ( is Black ) Ġpos . y Ġin Ġ' 7 ' .. ' 9 ' Ġelse Ġpos . y Ġin Ġ' 0 ' .. ' 2 ' ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( valid X ( pos ) Ġ&& Ġvalid Y ( pos ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġposition Ġ$ pos Ġfor ĠKing Ġche ss Ġpiece ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' k ' Ġelse Ġ' K ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( valid X ( target ) Ġ&& Ġvalid Y ( target ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ== Ġtarget . x Ġ-> Ġ( target . y Ġ- Ġposition . y ). absolute Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ== Ġtarget . y Ġ-> Ġ( target . x Ġ- Ġposition . x ). absolute Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( is Black ) Ġ( target . y Ġ- Ġ 1 ) Ġdown To Ġ' 0 ' Ġelse Ġ( target . y Ġ+ Ġ 1 ) .. ' 9 ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠChe ss Position ( target . x , Ġit ). to Coordinate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġboard [ it . first ][ it . second ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit Ġ!= ĠEmpty Piece Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġif Ġ( it Ġis ĠKing Piece ) Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠAd vis er Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid ( pos : ĠChe ss Position ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġin Ġif Ġ( is Black ) ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' d ', Ġ' 9 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' d ', Ġ' 7 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' f ', Ġ' 9 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' f ', Ġ' 7 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' e ', Ġ' 8 ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' d ', Ġ' 0 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' d ', Ġ' 2 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' f ', Ġ' 0 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' f ', Ġ' 2 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' e ', Ġ' 1 ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! valid ( pos )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġposition Ġ$ pos Ġfor ĠAd vis er Ġche ss Ġpiece ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' a ' Ġelse Ġ' A ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget Ġ|| Ġ! valid ( target )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġwhen Ġ( position . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' e ' Ġ-> Ġtarget . x Ġin ĠarrayOf (' d ', Ġ' f ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtarget . x Ġ== Ġ' e ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck King Piece Before Move ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠE le ph ant Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid ( pos : ĠChe ss Position ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġin Ġif Ġ( is Black ) ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' c ', Ġ' 9 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' g ', Ġ' 9 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' e ', Ġ' 7 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' a ', Ġ' 7 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' i ', Ġ' 7 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' c ', Ġ' 5 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' g ', Ġ' 5 ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' c ', Ġ' 0 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' g ', Ġ' 0 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' e ', Ġ' 2 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' a ', Ġ' 2 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' i ', Ġ' 2 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' c ', Ġ' 4 '), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position (' g ', Ġ' 4 ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! valid ( pos )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġposition Ġ$ pos Ġfor ĠE le ph ant Ġche ss Ġpiece ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' b ' Ġelse Ġ' B ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget Ġ|| Ġ! valid ( target )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġwhen Ġ( position . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' c ' Ġ-> Ġtarget . x Ġin ĠarrayOf (' a ', Ġ' e ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' g ' Ġ-> Ġtarget . x Ġin ĠarrayOf (' i ', Ġ' e ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' e ' Ġ-> Ġtarget . x Ġin ĠarrayOf (' c ', Ġ' g ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' a ' Ġ-> Ġtarget . x Ġ== Ġ' c ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' i ' Ġ-> Ġtarget . x Ġ== Ġ' g ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠError () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle Ġ= ĠChe ss Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( position . x . toInt () Ġ+ Ġtarget . x . toInt ()) Ġ/ Ġ 2 ). to Char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( position . y . toInt () Ġ+ Ġtarget . y . toInt ()) Ġ/ Ġ 2 ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotEmpty ( middle )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck King Piece Before Move ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠH orse Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' n ' Ġelse Ġ' N ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġwhen Ġ(( target . x Ġ- Ġposition . x ). absolute Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( target . y Ġ- Ġposition . y ). absolute Value Ġ== Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠisEmpty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( position . y . toInt () Ġ+ Ġtarget . y . toInt ()) Ġ/ Ġ 2 ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( target . y Ġ- Ġposition . y ). absolute Value Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠisEmpty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChe ss Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( position . x . toInt () Ġ+ Ġtarget . x . toInt ()) Ġ/ Ġ 2 ). to Char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck King Piece Before Move ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠR ook Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' r ' Ġelse Ġ' R ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ== Ġtarget . x Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position . y Ġ< Ġtarget . y ) Ġ( position . y Ġ+ Ġ 1 ) Ġuntil Ġtarget . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( target . y Ġ+ Ġ 1 ) Ġuntil Ġposition . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . any Ġ{ Ġis NotEmpty ( Che ss Position ( position . x , Ġit )) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ== Ġtarget . y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position . x Ġ< Ġtarget . x ) Ġ( position . x Ġ+ Ġ 1 ) Ġuntil Ġtarget . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( target . x Ġ+ Ġ 1 ) Ġuntil Ġposition . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . any Ġ{ Ġis NotEmpty ( Che ss Position ( it , Ġposition . y )) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck King Piece Before Move ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠC annon Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' c ' Ġelse Ġ' C ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ== Ġtarget . x Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position . y Ġ< Ġtarget . y ) Ġ( position . y Ġ+ Ġ 1 ) Ġuntil Ġtarget . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( target . y Ġ+ Ġ 1 ) Ġuntil Ġposition . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġrange . count Ġ{ Ġis NotEmpty ( Che ss Position ( position . x , Ġit )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( count Ġ== Ġ 0 Ġ&& ĠisEmpty ( target ) Ġ|| Ġcount Ġ== Ġ 1 Ġ&& Ġis NotEmpty ( target ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ== Ġtarget . y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position . x Ġ< Ġtarget . x ) Ġ( position . x Ġ+ Ġ 1 ) Ġuntil Ġtarget . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( target . x Ġ+ Ġ 1 ) Ġuntil Ġposition . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġrange . count Ġ{ Ġis NotEmpty ( Che ss Position ( it , Ġposition . y )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( count Ġ== Ġ 0 Ġ&& ĠisEmpty ( target ) Ġ|| Ġcount Ġ== Ġ 1 Ġ&& Ġis NotEmpty ( target ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck King Piece Before Move ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠP awn Piece ( is Black : ĠBoolean , Ġpos : ĠChe ss Position ) Ġ: ĠAbstract Piece ( is Black , Ġpos ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcode : ĠChar Ġ= Ġif Ġ( is Black ) Ġ' p ' Ġelse Ġ' P ' ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove To ( target : ĠChe ss Position ): ĠChe ss Piece ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ== Ġtarget . x Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġok Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Black ) Ġtarget . y Ġ- Ġposition . y Ġ== Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtarget . y Ġ- Ġposition . y Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ== Ġtarget . y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġ( if Ġ( is Black ) Ġposition . y Ġin Ġ' 0 ' .. ' 4 ' Ġelse Ġposition . y Ġin Ġ' 5 ' .. ' 9 ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( target . x Ġ- Ġposition . x ). absolute Value Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid Move Exception ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck King Piece Before Move ( Che ss Move ( position , Ġtarget )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . moveTo ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ