package Ġcom . al im illi . android . tile game . data Objects Ċ Ċ import Ġjava . util . Random Ċ Ċ class ĠTile Board ( rows : ĠInt , Ġcols : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġrows Count Ġ= Ġrows ĊĠĠĠ Ġval Ġcolumns Count Ġ= Ġcols ĊĊĠĠĠ Ġvar Ġmoves Count Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġtiles Ġ= Ġempty Array < Tile >() ĊĠĠĠ Ġprivate Ġval Ġempty Tile : ĠTile ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Tile Position Ġ= ĠTile Position ( row Ġ= Ġrows Count Ġ- Ġ 1 , Ġcolumn Ġ= Ġcolumns Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġempty Tile Ġ= ĠTile ( init Position Ġ= Ġempty Tile Position , Ġcontent Ġ= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġrows Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 0 Ġuntil Ġcolumns Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠTile Position ( row Ġ= Ġrow , Ġcolumn Ġ= Ġcol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġempty Tile Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtiles Ġ+= Ġempty Tile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent : ĠInt ? Ġ= Ġcol Ġ+ Ġ( row Ġ* Ġcolumns Count ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Ġ= ĠTile ( init Position Ġ= Ġposition , Ġcontent Ġ= Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtiles Ġ+= Ġtile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtile Position At Linear Index ( linear Index : ĠInt ): ĠTile Position ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( linear Index Ġ< Ġ 0 Ġ|| Ġlinear Index Ġ> Ġ( rows Count Ġ* Ġcolumns Count )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcol Ġ= Ġlinear Index Ġ% Ġcolumns Count ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġ( linear Index Ġ- Ġcol ) Ġ/ Ġcolumns Count ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTile Position ( row Ġ= Ġrow , Ġcolumn Ġ= Ġcol ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtile At Linear Index ( linear Index : ĠInt ): ĠTile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġtile Position At Linear Index ( linear Index Ġ= Ġlinear Index ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtile ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtile At ( row : ĠInt , Ġcol : ĠInt ): ĠTile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tile Ġin Ġtiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile . current Position . row Ġ== Ġrow Ġ&& Ġtile . current Position . column Ġ== Ġcol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtile ( at Position : ĠTile Position ?): ĠTile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( at Position Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtile At ( row Ġ= Ġat Position . row , Ġcol Ġ= Ġat Position . column ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Move Tile ( at Position : ĠTile Position ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( empty Tile . current Position Ġ== Ġat Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( empty Tile . current Position . row Ġ== Ġat Position . row Ġ|| Ġempty Tile . current Position . column Ġ== Ġat Position . column ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Tile ( at Position : ĠTile Position ): ĠArray < Tile Movement > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmov ements Ġ= Ġempty Array < Tile Movement >() ĊĠĠĠĠĠĠĠ Ġval Ġdirection : ĠInt ĊĊĠĠĠĠĠĠĠ Ġif Ġ( empty Tile . current Position . row Ġ== Ġat Position . row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Range : ĠClosed Range < Int > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( at Position . column Ġ> Ġempty Tile . current Position . column ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Range Ġ= Ġempty Tile . current Position . column .. at Position . column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Range Ġ= Ġat Position . column .. empty Tile . current Position . column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcolumn Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= ĠTile Position ( row Ġ= Ġat Position . row , Ġcolumn Ġ= Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= ĠTile Position ( row Ġ= Ġat Position . row , Ġcolumn Ġ= Ġi Ġ+ Ġdirection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to . column Ġ> Ġcolumn Range . end Inclusive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . column Ġ= Ġcolumn Range . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to . column Ġ< Ġcolumn Range . start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . column Ġ= Ġcolumn Range . end Inclusive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmov ements Ġ+= ĠTile Movement ( from Ġ= Ġfrom , Ġto Ġ= Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( empty Tile . current Position . column Ġ== Ġat Position . column ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Range : ĠClosed Range < Int > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( at Position . row Ġ> Ġempty Tile . current Position . row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Range Ġ= Ġempty Tile . current Position . row .. at Position . row ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Range Ġ= Ġat Position . row .. empty Tile . current Position . row ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrow Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= ĠTile Position ( row Ġ= Ġi , Ġcolumn Ġ= Ġat Position . column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= ĠTile Position ( row Ġ= Ġi Ġ+ Ġdirection , Ġcolumn Ġ= Ġat Position . column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to . row Ġ> Ġrow Range . end Inclusive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . row Ġ= Ġrow Range . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to . row Ġ< Ġrow Range . start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . row Ġ= Ġrow Range . end Inclusive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmov ements Ġ+= ĠTile Movement ( from Ġ= Ġfrom , Ġto Ġ= Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġmove Ġall Ġtiles Ġat Ġa Ġtime ĊĠĠĠĠĠĠĠ Ġvar Ġtiles To Move Ġ= Ġempty Array < Tile >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( movement Ġin Ġmov ements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Tile Ġ= Ġtile ( at Position Ġ= Ġmovement . from ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from Tile Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtiles To Move Ġ+= Ġfrom Tile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( movement Index Ġin Ġ 0 Ġuntil Ġmov ements . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile To Move Ġ= Ġtiles To Move [ movement Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile To Move . current Position Ġ= Ġmov ements [ movement Index ]. to ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmoves Count Ġ+= Ġmov ements . size Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmov ements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Random Move (): ĠArray < Tile Movement > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tiles . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmax T ries Ġ= Ġtiles . size Ġ* Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmax T ries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Index Ġ= ĠRandom (). nextInt ( tiles . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Tile Ġ= Ġtiles [ random Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Ġcan Move Tile ( at Position Ġ= Ġrandom Tile . current Position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmove Tile ( at Position Ġ= Ġrandom Tile . current Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprint (" not Ġable Ġto Ġfind Ġrandom Ġmov able Ġtile ") ĊĠĠĠĠĠĠĠ Ġreturn Ġempty Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshuffle (): ĠArray < Tile Movement > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Positions Ġ= Ġtiles . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Random Move () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsh uffled Positions Ġ= Ġtiles . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġmov ements Ġ= Ġempty Array < Tile Movement >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcurrent Positions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovement Ġ= ĠTile Movement ( from Ġ= Ġcurrent Positions [ i ], Ġto Ġ= Ġsh uffled Positions [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmov ements Ġ+= Ġmovement ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmoves Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmov ements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Complete (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tile Ġin Ġtiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile . current Position Ġ!= Ġtile . actual Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ