package Ġde . ich mann . android . non od roid Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġorg . f reen ono . model . Game Board Ċ import Ġorg . f reen ono . model . GameState Ċ import Ġorg . f reen ono . model . Token Ċ import Ġorg . f reen ono . model . data . Non o gram Ċ import Ġjava . io .* Ċ import Ġkotlin . math . floor ĊĊ Ċ class ĠN ono gram View ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: ĠView ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Non o gram View " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcurrent Non o gram : ĠN ono gram ĊĊĠĠĠ Ġ/ **************** ***** ĠConstants Ġ***************** ****/ ĊĊĠĠĠ Ġprivate Ġval ĠMIN _ CAP TION _ HEIGHT Ġ= Ġ 5 ĊĠĠĠ Ġprivate Ġval ĠMIN _ CAP TION _ WIDTH Ġ= Ġ 5 ĊĠĠĠ Ġprivate Ġval ĠMAX _ TILE _ SIZE Ġ= Ġ 6 0 . 0 f ĊĠĠĠ Ġprivate Ġval ĠMIN _ TILE _ SIZE Ġ= Ġ 2 4 . 0 f ĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ TILE _ SIZE Ġ= Ġ 1 0 0 . 0 f ĊĠĠĠ Ġ// Ġset Ġcorrection Ġvalue Ġfor Ġcenter ing Ġtext Ġin Ġcaption Ġtiles ĊĠĠĠ Ġprivate Ġval Ġx Correction Size : ĠFloat Ġ= Ġ 0 . 2 5 f ĊĠĠĠ Ġprivate Ġval Ġy Correction Size : ĠFloat Ġ= Ġ 0 . 7 5 f ĊĊĠĠĠ Ġprivate Ġvar Ġtile Size : ĠFloat Ġ= ĠDEFAULT _ TILE _ SIZE ĊĠĠĠ Ġprivate Ġvar Ġpadding Top : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġpadding Left : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgame Board : ĠGame Board ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgame Controller : ĠGame Controller ĊĊĠĠĠ Ġ/ **************** ***** ĠInput Ġhandling Ġ***************** ****/ ĊĊĠĠĠ Ġprivate Ġval Ġgame Board Gest ures Listener Ġ= Ġ Ġobject Ġ: ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Down ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġdetector : ĠGest ure Detector Ġ= ĠGest ure Detector ( context , Ġgame Board Gest ures Listener ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( game Controller . game Status Ġ!= ĠGameState . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Tile Ġ= Ġfloor (( event . x Ġ- Ġpadding Left Ġ- Ġcurrent Non o gram . line Caption Width Ġ* Ġtile Size ) Ġ/ Ġtile Size ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Tile Ġ= Ġfloor (( event . y Ġ- Ġpadding Top Ġ- Ġcurrent Non o gram . column Caption Height Ġ* Ġtile Size ) Ġ/ Ġtile Size ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ<= Ġx Tile Ġ&& Ġx Tile Ġ< Ġcurrent Non o gram . width () Ġ&& Ġ 0 Ġ<= Ġy Tile Ġ&& Ġy Tile Ġ< Ġcurrent Non o gram . height ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Clicked Ġon Ġtile Ġ(" Ġ+ Ġx Tile Ġ+ Ġ", Ġ" Ġ+ Ġy Tile Ġ+ Ġ"). ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game Board . can Occ upy ( x Tile , Ġy Tile )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! game Board . occ upy ( x Tile , Ġy Tile )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Controller . apply Pen alty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġgame Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game Controller . is S olved ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Controller . stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Non o gram Ġwas Ġsolved , Ġgame Ġended .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Non o gram Ġwas Ġsolved !! !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game Controller . is Lost ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Controller . stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Game Ġwas Ġlost .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" You Ġlost Ġthe Ġgame !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ HO VER _ ENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Hover ĠEvent !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* return Ġdetector . on Touch Event ( event ). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println (" xxx ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/ **************** ***** ĠCustom Ġdrawing Ġ***************** ****/ ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtile Count Width Ġ= Ġcurrent Non o gram . width () Ġ+ ĠMath . max ( MIN _ CAP TION _ WIDTH , Ġcurrent Non o gram . line Caption Width Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtile Count Height Ġ= Ġcurrent Non o gram . height () Ġ+ ĠMath . max ( MIN _ CAP TION _ HEIGHT , Ġcurrent Non o gram . column Caption Height Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtile Width Ġ= Ġw Ġ/ Ġtile Count Width Ġ* Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġtile Height Ġ= Ġh Ġ/ Ġtile Count Height Ġ* Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġtile Size Ġ= ĠMath . min ( tile Height , Ġtile Width ) ĊĊĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġ( w Ġ- Ġ( current Non o gram . width () Ġ+ Ġcurrent Non o gram . line Caption Width ) Ġ* Ġtile Size ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġpadding Top Ġ= Ġ( h Ġ- Ġ( current Non o gram . height () Ġ+ Ġcurrent Non o gram . column Caption Height ) Ġ* Ġtile Size ) Ġ/ Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġstyle Ġfor Ġcapt ions ĊĠĠĠĠĠĠĠ Ġval Ġcaption Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . GRAY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġ 0 . 7 5 f Ġ* Ġtile Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype face Ġ= ĠType face . MON O SPACE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAccount Ġfor Ġpadding Ġon ĠView . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠMove Ġcalculations Ġto Ġon Size Changed () Ġand Ġuse Ġonly Ġcanvas . apply {} Ġhere . ĊĊĠĠĠĠĠĠĠ Ġ// Ġpaint Ġcolumn Ġcapt ions ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġ.. Ġcurrent Non o gram . width ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Current Block Ġ= Ġ( x Ġ+ Ġcurrent Non o gram . line Caption Width ) Ġ* Ġtile Size Ġ+ Ġpadding Left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( x Current Block , Ġpadding Top , Ġx Current Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Non o gram . column Caption Height Ġ* Ġtile Size Ġ+ Ġpadding Top , Ġcaption Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdraw Ġcolumn Ġcaption Ġlabels ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġcurrent Non o gram . width ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Current Block Ġ= Ġ( x Ġ+ Ġcurrent Non o gram . line Caption Width Ġ+ Ġx Correction Size ) Ġ* Ġtile Size Ġ+ Ġpadding Left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumbers Ġ= Ġcurrent Non o gram . getColumn Numbers ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Difference Ġ= Ġcurrent Non o gram . column Caption Height Ġ- Ġcurrent Non o gram . getColumn Numbers Count ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( i , n ) Ġin Ġnumbers . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( n . toString (), Ġx Current Block , Ġ( block Difference Ġ+ Ġi Ġ+ Ġy Correction Size ) Ġ* Ġtile Size Ġ+ Ġpadding Top , Ġcaption Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpaint Ġrow Ġcapt ions ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġ.. Ġcurrent Non o gram . height ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Current Block Ġ= Ġ( y Ġ+ Ġcurrent Non o gram . column Caption Height ) Ġ* Ġtile Size Ġ+ Ġpadding Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( padding Left , Ġy Current Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Non o gram . line Caption Width Ġ* Ġtile Size Ġ+ Ġpadding Left , Ġy Current Block , Ġcaption Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdraw Ġrow Ġcaption Ġlabels ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġcurrent Non o gram . height ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Current Block Ġ= Ġ( y Ġ+ Ġcurrent Non o gram . column Caption Height Ġ+ Ġy Correction Size ) Ġ* Ġtile Size Ġ+ Ġpadding Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumbers Ġ= Ġcurrent Non o gram . getLine Numbers ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Difference Ġ= Ġcurrent Non o gram . line Caption Width Ġ- Ġcurrent Non o gram . get LineNumber Count ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( i , n ) Ġin Ġnumbers . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( n . toString (), Ġ( block Difference Ġ+ Ġi Ġ+ Ġx Correction Size ) Ġ* Ġtile Size Ġ+ Ġpadding Left , Ġy Current Block , Ġcaption Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġstyle Ġfor Ġgame Ġboard ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġ 5 0 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpaint Ġgame Ġboard ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġcurrent Non o gram . height ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġcurrent Non o gram . width ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( game Board . getField Value ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . FREE Ġ-> Ġp . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . OCC U PI ED Ġ-> Ġp . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . MARK ED Ġ-> Ġp . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Unexpected Ġvalue Ġfor ĠToken Ġfound Ġin ĠGame Board !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect (( x + current Non o gram . getLine Caption Width ()) * tile Size Ġ+ Ġpadding Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( y + current Non o gram . getColumn Caption Height ()) * tile Size Ġ+ Ġpadding Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( x + current Non o gram . getLine Caption Width ()) * tile Size Ġ+ Ġtile Size Ġ+ Ġpadding Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( y + current Non o gram . getColumn Caption Height ()) * tile Size Ġ+ Ġtile Size Ġ+ Ġpadding Top , Ġp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************** ***** ĠGame Ġlogic Ġmethods Ġ***************** ****/ ĊĊĠĠĠ Ġfun Ġset Non o gram ( non o gram File : ĠInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠAndroid Non o gram Serializer () ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġa . load ( non o gram File ) ĊĠĠĠĠĠĠĠ Ġcurrent Non o gram Ġ= Ġl . first () ĊĠĠĠĠĠĠĠ Ġgame Board Ġ= ĠGame Board ( current Non o gram ) ĊĠĠĠĠĠĠĠ Ġgame Controller Ġ= ĠGame Controller ( current Non o gram , Ġgame Board ) ĊĠĠĠĠĠĠĠ Ġgame Controller . start () ĊĠĠĠĠĠĠĠ Ġ// Ġrefresh ĠView ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Controller . stop () ĊĠĠĠ Ġ} Ċ }