package Ġgames . game 2 0 4 8 Ċ Ċ import Ġboard . Cell Ċ import Ġboard . Direction Ċ import Ġboard . Direction .* Ċ import Ġboard . Game Board Ċ import Ġboard . create Game Board Ċ import Ġgames . game . Game Ċ Ċ /* Ċ Ġ* ĠYour Ġtask Ġis Ġto Ġimplement Ġthe Ġgame Ġ 2 0 4 8 Ġhttps :// en . wikipedia . org / wiki / 2 0 4 8 _( video _ game ). Ċ Ġ* ĠImplement Ġthe Ġutility Ġmethods Ġbelow . Ċ Ġ* Ċ Ġ* ĠAfter Ġimplementing Ġit Ġyou Ġcan Ġtry Ġto Ġplay Ġthe Ġgame Ġrunning Ġ' Play Game 2 0 4 8 '. Ċ Ġ*/ Ċ fun Ġnew Game 2 0 4 8 ( initializer : ĠGame 2 0 4 8 Initializer < Int > Ġ= ĠRandom Game 2 0 4 8 Initializer ): ĠGame Ġ= ĊĠĠĠĠĠĠĠ ĠGame 2 0 4 8 ( initializer ) Ċ Ċ class ĠGame 2 0 4 8 ( private Ġval Ġinitializer : ĠGame 2 0 4 8 Initializer < Int >) Ġ: ĠGame Ġ{ ĊĠĠĠ Ġprivate Ġval Ġboard Ġ= Ġcreate Game Board < Int ? >( 4 ) ĊĊĠĠĠ Ġoverride Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard . add NewValue ( initializer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Move () Ġ= Ġboard . any Ġ{ Ġit Ġ== Ġnull Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas W on () Ġ= Ġboard . any Ġ{ Ġit Ġ== Ġ 2 0 4 8 Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Move ( direction : ĠDirection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( board . move Values ( direction )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard . add NewValue ( initializer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( i : ĠInt , Ġj : ĠInt ): ĠInt ? Ġ= Ġboard . run Ġ{ Ġget ( getCell ( i , Ġj )) Ġ} Ċ } Ċ Ċ /* Ċ Ġ* ĠAdd Ġa Ġnew Ġvalue Ġproduced Ġby Ġ' initializer ' Ġto Ġa Ġspecified Ġcell Ġin Ġa Ġboard . Ċ Ġ*/ Ċ fun ĠGame Board < Int ?> . add NewValue ( initializer : ĠGame 2 0 4 8 Initializer < Int >) Ġ{ ĊĠĠĠ Ġval Ġpair : ĠPair < Cell , ĠInt >? Ġ= Ġinitializer . next Value ( this ) ĊĠĠĠ Ġpair ?. let Ġ{ Ġthis [ pair . first ] Ġ= Ġpair . second Ġ} Ċ } Ċ Ċ /* Ċ Ġ* ĠUpdate Ġthe Ġvalues Ġstored Ġin Ġa Ġboard , Ċ Ġ* Ġso Ġthat Ġthe Ġvalues Ġwere Ġ" moved " Ġin Ġa Ġspecified Ġrow Or Column Ġonly . Ċ Ġ* ĠUse Ġthe Ġhelper Ġfunction Ġ' move And Merge Equal ' Ġ( in ĠGame 2 0 4 8 Helper . kt ). Ċ Ġ* ĠThe Ġvalues Ġshould Ġbe Ġmoved Ġto Ġthe Ġbeginning Ġof Ġthe Ġrow Ġ( or Ġcolumn ), Ċ Ġ* Ġin Ġthe Ġsame Ġmanner Ġas Ġin Ġthe Ġfunction Ġ' move And Merge Equal '. Ċ Ġ* ĠReturn Ġ' true ' Ġif Ġthe Ġvalues Ġwere Ġmoved Ġand Ġ' false ' Ġotherwise . Ċ Ġ*/ Ċ fun ĠGame Board < Int ?> . move Values In Row Or Column ( row Or Column : ĠList < Cell >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġoriginal Values Ġ= Ġrow Or Column . map Ġ{ Ġthis [ it ] Ġ} ĊĠĠĠ Ġval Ġmoved Values : ĠList < Int > Ġ= Ġoriginal Values . move And Merge Equal Ġ{ Ġi Ġ-> Ġi Ġ* Ġ 2 Ġ} ĊĠĠĠ Ġif Ġ( moved Values . isEmpty () Ġ|| Ġmoved Values Ġ== Ġoriginal Values ) Ġreturn Ġfalse ĊĊĠĠĠ Ġrow Or Column . forEach Indexed Ġ{ Ġidx , Ġcell Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ>= Ġmoved Values . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ cell ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ cell ] Ġ= Ġmoved Values [ idx ] ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ /* Ċ Ġ* ĠUpdate Ġthe Ġvalues Ġstored Ġin Ġa Ġboard , Ċ Ġ* Ġso Ġthat Ġthe Ġvalues Ġwere Ġ" moved " Ġto Ġthe Ġspecified Ġdirection Ċ Ġ* Ġfollowing Ġthe Ġrules Ġof Ġthe Ġ 2 0 4 8 Ġgame Ġ. Ċ Ġ* ĠUse Ġthe Ġ' move Values In Row Or Column ' Ġfunction Ġabove . Ċ Ġ* ĠReturn Ġ' true ' Ġif Ġthe Ġvalues Ġwere Ġmoved Ġand Ġ' false ' Ġotherwise . Ċ Ġ*/ Ċ fun ĠGame Board < Int ?> . move Values ( direction : ĠDirection ): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUP Ġ-> ĠgetAll Columns (). forEach Ġ{ Ġresult Ġ= Ġmove Values In Row Or Column ( it ) Ġ|| Ġresult Ġ} ĊĠĠĠĠĠĠĠ ĠDOWN Ġ-> ĠgetAll Columns (). forEach Ġ{ Ġresult Ġ= Ġmove Values In Row Or Column ( it . reversed ()) Ġ|| Ġresult Ġ} ĊĠĠĠĠĠĠĠ ĠRIGHT Ġ-> ĠgetAll Rows (). forEach Ġ{ Ġresult Ġ= Ġmove Values In Row Or Column ( it . reversed ()) Ġ|| Ġresult } ĊĠĠĠĠĠĠĠ ĠLEFT Ġ-> ĠgetAll Rows (). forEach Ġ{ Ġresult Ġ= Ġmove Values In Row Or Column ( it ) Ġ|| Ġresult } ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ // 1 ĠĠĠĠĠĠ 3 ĠĠĠĠ Ġnull ĠĠĠĠ 4 Ċ // null ĠĠĠ 8 ĠĠĠĠĠĠ 3 ĠĠĠ Ġnull Ċ // 8 ĠĠĠĠ Ġnull ĠĠĠĠ 4 ĠĠĠĠĠĠ 3 Ċ // null ĠĠĠ 3 ĠĠĠĠĠ Ġnull ĠĠĠ 2 Ċ Ċ private Ġfun ĠGame Board < Int ?> . getAll Columns (): ĠList < List < Cell >> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < List < Cell >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. width ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . add ( getColumn ( 1 .. width , Ġi )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun ĠGame Board < Int ?> . getAll Rows (): ĠList < List < Cell >> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < List < Cell >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. width ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . add ( getRow ( i , Ġ 1 .. width )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } ĊĊ