package Ġcom . jem . te trac ube engine Ċ Ċ import Ġcom . jem . te trac ube engine . listener . GameState Listener Ċ import Ġcom . jem . te trac ube engine . pieces . OP iece Ċ import Ġcom . jem . te trac ube engine . pieces . Piece Ċ import Ġcom . jem . te trac ube engine . util . Piece Util Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠTe trac ube Engine Ġis Ġused Ġto Ġ" run " Ġthe Ġentire Ġgame . Ċ Ġ* ĠThe Ġplayer Ġcontrols , Ġboard Ġparams , Ġetc Ġcan Ġall Ġbe Ġaccessed Ġvia Ġthe ĠTe trac ube Engine Ġinstance . Ċ Ġ*/ Ċ class ĠTe trac ube Engine Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġboard Ġon Ġwhich Ġthe ĠTe trac ube Ġpieces Ġare Ġplaced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġboard : ĠTe trac ube Board Ġ= ĠTe trac ube Board () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpiece Ġthat Ġis Ġcurrently Ġcontrolled Ġby Ġthe Ġplayer Ġ& Ġis Ġbeing Ġdropped Ġin Ġthe Ġboard ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent Piece : ĠPiece Ġ= ĠOP iece () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpiece Ġthat Ġwill Ġbe Ġdropped Ġnext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġnext Piece : ĠPiece Ġ= ĠPiece Util . getRandom Piece () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListener Ġto Ġupdate Ġclient Ġregarding Ġstate Ġchanges Ġin Ġthe Ġgame ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġgame State Listener : ĠGameState Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġsettings : ĠTe trac ube Settings Ġ= ĠTe trac ube Settings () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlast Ġknown ĠX Ġposition Ġof Ġthe Ġcurrent Ġpiece ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġprevious X : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlast Ġknown ĠY Ġposition Ġof Ġthe Ġcurrent Ġpiece ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġprevious Y : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlast Ġknown ĠZ Ġposition Ġof Ġthe Ġcurrent Ġpiece ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġprevious Z : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTimer Ġto Ġschedule Ġthe Ġpiece Ġposition Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġtick Timer : ĠTimer ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTimer Task Ġthat Ġcontains Ġthe Ġlogic Ġof Ġwhat Ġhappens Ġeach Ġtime Ġthe Ġtimer Ġticks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġgame Task : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġprevious Y -- ĊĠĠĠĠĠĠĠ Ġval Ġplace Status Ġ= Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( place Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWas Ġable Ġto Ġplace Ġpiece Ġsuccessfully ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġpiece Ġcan Ġbe Ġmoved Ġfurther Ġdown Ġnext Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State Listener ?. on Grid Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . grid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . bread th ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . LAYER _ FIL LED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġshouldn 't Ġbe Ġoccur ring Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġtim ber Ġlogs Ġto Ġcheck Ġwhy Ġthis Ġcase Ġis Ġar ising ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . OUT _ OF _ BOUN DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Y Ġ- Ġcurrent Piece . height Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrent Ġpiece Ġhit Ġthe Ġbottom Ġof Ġthe Ġgrid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Current Piece And Calculate Score () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare New Piece () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould n 't Ġoccur , Ġbut Ġif Ġit Ġdoes , Ġthen Ġit 's Ġprobably Ġone Ġof Ġthe Ġfollowing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . Ġwidth / bread th Ġfor Ġthe Ġgrid Ġwas Ġtoo Ġsmall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . Ġprevious X / previous Z Ġis Ġexceed ing Ġwidth / bread th Ġlimits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġtim ber Ġlog Ġto Ġcheck Ġabove Ġcases ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . OVER LAP _ WITH _ EXIST ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Y Ġ== Ġboard . height Ġ- Ġcurrent Piece . height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Game () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrent Ġpiece Ġhit Ġsome Ġother Ġexisting Ġblocks Ġon Ġthe Ġgrid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Current Piece And Calculate Score () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare New Piece () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġstart New Game ( settings : ĠTe trac ube Settings Ġ= ĠTe trac ube Settings ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtick Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġtick Timer ?. purge () ĊĠĠĠĠĠĠĠ Ġthis . settings Ġ= Ġsettings ĊĠĠĠĠĠĠĠ Ġboard Ġ= ĠTe trac ube Board ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġthis . settings . board Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġthis . settings . board Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb read th Ġ= Ġthis . settings . board B read th ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprepare New Piece () ĊĠĠĠĠĠĠĠ Ġtick Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġtick Timer ?. schedule At Fixed Rate ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Task . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġthis . settings . initial Tick Delay , Ġthis . settings . tick Interval ) ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Game Started ( this . settings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġtick Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġtick Timer ?. purge () ĊĠĠĠĠĠĠĠ Ġtick Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġtick Timer ?. schedule At Fixed Rate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Task . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠResume Ġwith Ġinitial Ġdelay Ġas Ġtick Interval Ġ( because Ġit Ġmakes Ġmore Ġsense Ġfrom ĠUX Ġperspective ĠI MO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . settings . tick Interval , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . settings . tick Interval ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Game Res umed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġtick Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġtick Timer ?. purge () ĊĠĠĠĠĠĠĠ Ġtick Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Game Paused () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġtick Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġtick Timer ?. purge () ĊĠĠĠĠĠĠĠ Ġtick Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Game Ended () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Current Piece And Calculate Score () Ġ{ ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġval Ġplace Status Ġ= Ġboard . place Piece ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Piece , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious X , Ġprevious Y Ġ+ Ġ 1 , Ġprevious Z , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Layer Filled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( place Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSuccessfully Ġplaced , Ġbut Ġno Ġlayers Ġwhere Ġcleared , Ġno Ġscore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . LAYER _ FIL LED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPl acing Ġcurrent Ġpiece Ġcauses Ġ 1 Ġor Ġmore Ġlayers Ġto Ġbe Ġfilled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcleared Layers Ġ= Ġboard . clear Layers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠClear Ġthe Ġrows Ġand Ġcalculate Ġthe Ġscore ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠConsider Ġwhether Ġmaybe Ġthis Ġshould Ġjust Ġbe Ġa Ġcallback Ġto Ġthe Ġapp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġand Ġthe Ġapp Ġdec ides Ġwhen Ġthe Ġlayers Ġwill Ġbe Ġcleared ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ĠSo Ġas Ġto Ġallow Ġtime Ġfor Ġclear Ġanimations . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġshouldn 't Ġoccur , Ġpl acing Ġthe Ġpiece Ġshould Ġdefinitely Ġbe Ġa Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġtim ber Ġlog Ġto Ġcheck Ġexactly Ġwhat Ġcase Ġthis Ġis Ġ& Ġwhy Ġit Ġoccurs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Grid Updated ( board . grid , Ġboard . height , Ġboard . width , Ġboard . bread th ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhard Drop () Ġ{ ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġprevious Y Ġ= Ġboard . drop Height ( current Piece , Ġprevious X , Ġprevious Z , Ġprevious Y ) ĊĠĠĠĠĠĠĠ Ġ// ĠIncrement Ġbecause Ġthe Ġvalue Ġis Ġdecrement ed Ġin Ġgame Task ĊĠĠĠĠĠĠĠ Ġprevious Y ++ ĊĠĠĠĠĠĠĠ Ġgame Task . run () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġflag Ġfor Ġhard Ġdrop Ġand Ġmultiply Ġlayer Ġfill Ġscore Ġaccordingly ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdrop One Layer () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Task . run () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġflag Ġfor Ġsoft Ġdrop Ġand Ġmultiply Ġlayer Ġfill Ġscore Ġaccordingly ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Left () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( previous X Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold X Ġ= Ġprevious X ĊĠĠĠĠĠĠĠ Ġprevious X -- ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġval Ġplace Status Ġ= Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( place Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . OVER LAP _ WITH _ EXIST ING , ĠTe trac ube Board . Place Status . OUT _ OF _ BOUN DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġa Ġvalid Ġmove , Ġrevert Ġto Ġprevious Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġif Ġit 's Ġpossible Ġto Ġcheck Ġfor Ġthis Ġcase , Ġinstead Ġof Ġdoing Ġ& Ġthen Ġre verting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious X Ġ= Ġold X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġvalid , Ġpe ace Ġout . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Grid Updated ( board . grid , Ġboard . height , Ġboard . width , Ġboard . bread th ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Right () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( previous X Ġ+ Ġcurrent Piece . width Ġ> Ġboard . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold X Ġ= Ġprevious X ĊĠĠĠĠĠĠĠ Ġprevious X ++ ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġval Ġplace Status Ġ= Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( place Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . OVER LAP _ WITH _ EXIST ING , ĠTe trac ube Board . Place Status . OUT _ OF _ BOUN DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġa Ġvalid Ġmove , Ġrevert Ġto Ġprevious Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġif Ġit 's Ġpossible Ġto Ġcheck Ġfor Ġthis Ġcase , Ġinstead Ġof Ġdoing Ġ& Ġthen Ġre verting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious X Ġ= Ġold X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġvalid , Ġpe ace Ġout . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Grid Updated ( board . grid , Ġboard . height , Ġboard . width , Ġboard . bread th ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate Clock wise () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Piece . rotate Clock wise () ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġval Ġplace Status Ġ= Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( place Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . OVER LAP _ WITH _ EXIST ING , ĠTe trac ube Board . Place Status . OUT _ OF _ BOUN DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġa Ġvalid Ġmove , Ġrevert Ġto Ġprevious Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġif Ġit 's Ġpossible Ġto Ġcheck Ġfor Ġthis Ġcase , Ġinstead Ġof Ġdoing Ġ& Ġthen Ġre verting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Piece . rotate Counter Clock wise () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġvalid , Ġpe ace Ġout . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Grid Updated ( board . grid , Ġboard . height , Ġboard . width , Ġboard . bread th ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate Counter Clock wise () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Piece . rotate Counter Clock wise () ĊĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠ Ġval Ġplace Status Ġ= Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( place Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTe trac ube Board . Place Status . OVER LAP _ WITH _ EXIST ING , ĠTe trac ube Board . Place Status . OUT _ OF _ BOUN DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġa Ġvalid Ġmove , Ġrevert Ġto Ġprevious Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġif Ġit 's Ġpossible Ġto Ġcheck Ġfor Ġthis Ġcase , Ġinstead Ġof Ġdoing Ġ& Ġthen Ġre verting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Piece . rotate Clock wise () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . undo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . place Piece ( current Piece , Ġprevious X , Ġprevious Y , Ġprevious Z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġvalid , Ġpe ace Ġout . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Grid Updated ( board . grid , Ġboard . height , Ġboard . width , Ġboard . bread th ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare New Piece () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Piece Ġ= Ġnext Piece ĊĠĠĠĠĠĠĠ Ġnext Piece Ġ= ĠPiece Util . getRandom Piece () ĊĠĠĠĠĠĠĠ Ġgame State Listener ?. on Piece Changed ( current Piece , Ġnext Piece ) ĊĠĠĠĠĠĠĠ Ġprevious X Ġ= Ġboard . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġprevious Z Ġ= Ġboard . bread th Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġprevious Y Ġ= Ġboard . height Ġ- Ġ( current Piece . height Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġboard . commit () ĊĠĠĠ Ġ} Ċ Ċ }