package Ġnet . z om is . games . impl . tt t . ult imate Ċ Ċ import Ġnet . z om is . games . common . Grid 2 D Ċ import Ġnet . z om is . games . components . Grid Ċ Ċ data Ġclass ĠT TM NK Parameters ( val Ġwidth : ĠInt , Ġval Ġheight : ĠInt , Ġval Ġconsecutive Required : ĠInt ) Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġclasses Ġthat Ġcan Ġcontain Ġother Ġobjects , Ġ' subs ', Ġin Ġa Ġrect angular Ġway Ċ Ġ* Ċ Ġ* Ġ@ param Ġ< T > ĠType Ġof Ġsub Ċ </ T > Ġ*/ Ċ interface ĠHas Sub < out ĠT > Ġ: ĠWin nable Ġ{ ĊĠĠĠ Ġval Ġwin Con ds : ĠIterable < T TW in Condition > ĊĠĠĠ Ġval Ġsize X : ĠInt ĊĠĠĠ Ġval Ġsize Y : ĠInt ĊĠĠĠ Ġval Ġconsecutive Required : ĠInt ĊĠĠĠ Ġfun Ġget Sub ( x : ĠInt , Ġy : ĠInt ): ĠT ? ĊĠĠĠ Ġfun Ġhas Sub s (): ĠBoolean Ċ } Ċ type alias ĠT ic Factory Ġ= Ġ( parent : ĠTT Base , Ġx : ĠInt , Ġy : ĠInt ) Ġ-> ĠTT Base Ċ object ĠT ic Utils Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġwhich Ġboard Ġa Ġtile Ġwill Ġsend Ġthe Ġopponent Ġto Ġ( in Ġa ĠT TT Ult imate Ġcontext ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtile ĠThe Ġtile Ġto Ġbe Ġplayed ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġboard Ġwhich Ġthe Ġtile Ġdirect s Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Destination Board ( tile : ĠTT Base ): ĠTT Base ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġtile . parent Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġgrand pa Ġ= Ġparent . parent Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġgrand pa . getSub ( tile . x , Ġtile . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġwin Ġconditions Ġwhich Ġcontains Ġa Ġspecific Ġfield ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield ĠThe Ġfield Ġto Ġlook Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġboard ĠWhere Ġto Ġlook Ġfor Ġwin Ġconditions ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġcollection Ġwhich Ġonly Ġcontains Ġwin Ġconditions Ġwhich Ġcontains Ġthe Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠWin nable > Ġget Win Con ds With ( field : ĠE , Ġboard : ĠHas Sub < E >): ĠCollection < T TW in Condition > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoll Ġ= Ġmutable ListOf < T TW in Condition >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( cond Ġin Ġboard . win Con ds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cond . has Win nable ( field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll . add ( cond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcoll ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġsmaller Ġtiles / boards Ġin Ġa Ġboard ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġboard ĠBoard Ġto Ġscan ĊĠĠĠĠ Ġ* Ġ@ return ĠCollection Ġof Ġall Ġsmaller Ġtiles / boards Ġcontained Ġin Ġboard . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > ĠgetAll Sub s ( board : ĠHas Sub < T >): ĠCollection < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < T >() ĊĠĠĠĠĠĠĠ Ġval Ġsize X Ġ= Ġboard . size X ĊĠĠĠĠĠĠĠ Ġval Ġsize Y Ġ= Ġboard . size Y ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġsize X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġsize Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( board . getSub ( x , Ġy ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe cursively Ġscan Ġfor Ġsmaller Ġsubs ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgame ĠThe Ġout erm ost Ġobject Ġto Ġscan ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġcollection Ġcontaining Ġall Ġfields Ġwithin Ġthe Ġspecified Ġ' game ' Ġwhich Ġdo Ġnot Ġhave Ġany Ġsubs ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetAll Sm allest Fields ( game : ĠTT Base ): ĠCollection < TT Base > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġmutable ListOf < TT Base >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( sub Ġin ĠgetAll Sub s ( game )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub . has Sub s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall . addAll ( getAll Sm allest Fields ( sub )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall . add ( sub ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġall ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġwin Ġconditions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġboard ĠThe Ġboard Ġto Ġcreate Ġwin Ġconditions Ġfor ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġall ĠWin Conditions Ġthat Ġwas Ġcreated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsetup W ins ( board : ĠHas Sub < Win nable >): ĠList < T TW in Condition > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! board . has Sub s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < T TW in Condition >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( T TW in Condition ( board )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconsecutive Ġ= Ġboard . con secutive Required ĊĠĠĠĠĠĠĠ Ġval Ġcon ds Ġ= Ġmutable ListOf < T TW in Condition >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠScan Ġcolumns Ġfor Ġa Ġwinner ĊĠĠĠĠĠĠĠ Ġfor Ġ( xx Ġin Ġ 0 Ġuntil Ġboard . size X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Win ( conds , Ġconsecutive , Ġloop Add ( board , Ġxx , Ġ 0 , Ġ 0 , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠScan Ġrows Ġfor Ġa Ġwinner ĊĠĠĠĠĠĠĠ Ġfor Ġ( yy Ġin Ġ 0 Ġuntil Ġboard . size Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Win ( conds , Ġconsecutive , Ġloop Add ( board , Ġ 0 , Ġyy , Ġ 1 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠScan Ġdiag on als Ġfor Ġa Ġwinner : ĠBottom - right ĊĠĠĠĠĠĠĠ Ġfor Ġ( yy Ġin Ġ 0 Ġuntil Ġboard . size Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Win ( conds , Ġconsecutive , Ġloop Add ( board , Ġ 0 , Ġyy , Ġ 1 , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( xx Ġin Ġ 1 Ġuntil Ġboard . size X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Win ( conds , Ġconsecutive , Ġloop Add ( board , Ġxx , Ġ 0 , Ġ 1 , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠScan Ġdiag on als Ġfor Ġa Ġwinner : ĠBottom - left ĊĠĠĠĠĠĠĠ Ġfor Ġ( xx Ġin Ġ 0 Ġuntil Ġboard . size X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Win ( conds , Ġconsecutive , Ġloop Add ( board , Ġxx , Ġ 0 , Ġ- 1 , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( yy Ġin Ġ 1 Ġuntil Ġboard . size Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Win ( conds , Ġconsecutive , Ġloop Add ( board , Ġboard . size X Ġ- Ġ 1 , Ġyy , Ġ- 1 , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcon ds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew Win ( conds : ĠMutable List < T TW in Condition >, Ġconsecutive : ĠInt , Ġwin n ables : ĠList < Win nable >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġshorter Ġwin Ġconditions Ġdoesn 't Ġneed Ġto Ġbe Ġadded Ġas Ġthey Ġwill Ġnever Ġbe Ġable Ġto Ġwin ĊĠĠĠĠĠĠĠ Ġif Ġ( win n ables . size Ġ>= Ġconsecutive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon ds . add ( T TW in Condition ( win n ables , Ġconsecutive )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġloop Add ( board : ĠHas Sub < Win nable >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxx Start : ĠInt , Ġyy Start : ĠInt , Ġdx : ĠInt , Ġdy : ĠInt ): ĠList < Win nable > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġxx Ġ= Ġxx Start ĊĠĠĠĠĠĠĠ Ġvar Ġyy Ġ= Ġyy Start ĊĠĠĠĠĠĠĠ Ġval Ġwin n ables Ġ= Ġmutable ListOf < Win nable >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġtile : ĠWin nable ? ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile Ġ= Ġboard . getSub ( xx , Ġyy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxx Ġ+= Ġdx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyy Ġ+= Ġdy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwin n ables . add ( tile ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( tile Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwin n ables ĊĠĠĠ Ġ} Ċ Ċ } Ċ class ĠTT Base ( val Ġparent : ĠTT Base ?, Ġval Ġx : ĠInt , Ġval Ġy : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmn k Parameters : ĠT TM NK Parameters , Ġfactory : ĠT ic Factory ?) Ġ: ĠWin nable , ĠHas Sub < TT Base >, ĠGrid < TT Base > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsubs : ĠArray < Array < TT Base >> ĊĊĠĠĠ Ġoverride Ġval Ġwin Con ds : ĠList < T TW in Condition > ĊĊĠĠĠ Ġoverride Ġvar Ġwon By : ĠT TP layer Ġ= ĠT TP layer . NONE ĊĊĠĠĠ Ġoverride Ġval Ġsize X : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . mn k Parameters . width ĊĊĠĠĠ Ġoverride Ġval Ġsize Y : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . mn k Parameters . height ĊĊĠĠĠ Ġoverride Ġval Ġconsecutive Required : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . mn k Parameters . con secutive Required ĊĊĠĠĠ Ġval Ġis W on : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwon By Ġ!== ĠT TP layer . NONE ĊĊĠĠĠ Ġval Ġglobal X : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parent . parent Ġ== Ġnull ) Ġx Ġelse Ġparent . x Ġ* Ġparent . parent . size X Ġ+ Ġthis . x ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġglobal Y : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parent . parent Ġ== Ġnull ) Ġy Ġelse Ġparent . y Ġ* Ġparent . parent . size Y Ġ+ Ġthis . y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( parent : ĠTT Base ?, Ġparameters : ĠT TM NK Parameters , Ġfactory : ĠT ic Factory ) Ġ: Ġthis ( parent , Ġ 0 , Ġ 0 , Ġparameters , Ġfactory ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . subs Ġ= ĠArray ( mn k Parameters . height ) Ġ{ Ġyy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( mn k Parameters . width ) Ġ{ Ġxx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory !!. invoke ( this , Ġxx , Ġyy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . win Con ds Ġ= ĠT ic Utils . setup W ins ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdetermine Winner () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġwinner : ĠT TP layer Ġ= ĠT TP layer . NONE ĊĠĠĠĠĠĠĠ Ġfor Ġ( cond Ġin Ġthis . win Con ds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= Ġwinner . or ( cond . determine Winner New ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( winner Ġ== ĠT TP layer . NONE Ġ&& Ġsubs (). all Ġ{ Ġit . is W on Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= ĠT TP layer . BLOCK ED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . won By Ġ= Ġwinner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubs (): ĠList < TT Base > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Sub s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsubs . flatMap Ġ{ Ġit . toList () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Sub ( x : ĠInt , Ġy : ĠInt ): ĠTT Base ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Sub s () Ġ&& Ġx Ġ== Ġ 0 Ġ&& Ġy Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġ 0 Ġ|| Ġy Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( x Ġ>= Ġsize X Ġ|| Ġy Ġ>= Ġsize Y ) Ġnull Ġelse Ġsubs [ y ][ x ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Play edBy ( play edBy : ĠT TP layer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . won By Ġ= Ġplayed By ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Sub s (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsize X Ġ!= Ġ 0 Ġ&& Ġsize Y Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"{ Pos Ġ$ x , Ġ$ y ; ĠSize Ġ$ size X , Ġ$ size Y ; ĠPlay ed Ġby Ġ$ won By . ĠParent Ġis Ġ$ parent }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . set Play edBy ( T TP layer . NONE ) ĊĠĠĠĠĠĠĠ Ġsubs (). forEach Ġ{ Ġit . reset () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sm allest Tile ( x : ĠInt , Ġy : ĠInt ): ĠTT Base ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Left Ġ= Ġget Sub ( 0 , Ġ 0 ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġgrand Parent Ġ= Ġtop Left . has Sub s () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! grand Parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . getSub ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsub X Ġ= Ġx Ġ/ Ġtop Left . size X ĊĠĠĠĠĠĠĠ Ġval Ġsub Y Ġ= Ġy Ġ/ Ġtop Left . size Y ĊĠĠĠĠĠĠĠ Ġval Ġboard Ġ= Ġget Sub ( sub X , Ġsub Y ) Ġ?: Ġthrow ĠNullPointerException (" No Ġsuch Ġsmallest Ġtile Ġfound : Ġ$ x , Ġ$ y ") ĊĠĠĠĠĠĠĠ Ġreturn Ġboard . getSub ( x Ġ- Ġsub X Ġ* Ġsize X , Ġy Ġ- Ġsub Y Ġ* Ġsize Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġvalue : ĠTT Base ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . subs [ y ][ x ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ): ĠTT Base Ġ= Ġthis . subs [ y ][ x ] Ċ Ċ } Ċ Ċ class ĠT TF act ories Ġ{ ĊĊĠĠĠ Ġfun Ġfactory ( mn k : ĠT TM NK Parameters , Ġnext : ĠT ic Factory ): ĠT ic Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ parent , Ġx , Ġy Ġ-> ĠTT Base ( parent , Ġx , Ġy , Ġmn k , Ġnext ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclassic MN K ( width : ĠInt , Ġheight : ĠInt , Ġconsecutive : ĠInt ): ĠTT Base Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTT Base ( null , ĠT TM NK Parameters ( width , Ġheight , Ġconsecutive ), Ġlast Factory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclassic MN K ( mn k : ĠInt ): ĠTT Base Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclassic MN K ( mn k , Ġmn k , Ġmn k ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġult imate ( mn k : ĠInt Ġ= Ġ 3 ): ĠTT Base Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġult imate MN K ( mn k , Ġmn k , Ġmn k ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġult imate MN K ( width : ĠInt , Ġheight : ĠInt , Ġconsecutive : ĠInt ): ĠTT Base Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTT Base ( null , ĠT TM NK Parameters ( width , Ġheight , Ġconsecutive ), Ġarea Factory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġo the l lo ( size : ĠInt ): ĠTT Base Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTT Base ( null , ĠT TM NK Parameters ( size , Ġsize , Ġsize Ġ+ Ġ 1 ), Ġlast Factory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmn k Empty Ġ= ĠT TM NK Parameters ( 0 , Ġ 0 , Ġ 0 ) ĊĊĠĠĠ Ġprivate Ġval Ġlast Factory : ĠT ic Factory Ġ= Ġ{ parent , Ġx , Ġy Ġ-> ĊĠĠĠĠĠĠĠ ĠTT Base ( parent , Ġx , Ġy , Ġmn k Empty , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġarea Factory : ĠT ic Factory Ġ= Ġ{ parent , Ġx , Ġy Ġ-> ĊĠĠĠĠĠĠĠ ĠTT Base ( parent , Ġx , Ġy , Ġparent . mn k Parameters , Ġlast Factory ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ interface ĠTT Move Listener Ġ{ ĊĠĠĠ Ġfun Ġon Move ( play ed At : ĠTT Base ) Ċ } Ċ Ċ enum Ġclass ĠT TP layer Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġplayer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠNONE , ĊĠĠĠ ĠX , ĊĠĠĠ ĠO , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBoth Ġplayers Ġhas Ġsucceeded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠX O , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNeither Ġplayer Ġ( both Ġhave Ġtried , Ġnone Ġhas Ġsucceeded ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠBLOCK ED , ĊĠĠĠ Ġ; ĊĊĠĠĠ Ġval Ġis Exactly One Player : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis Ġ== ĠX Ġ|| Ġthis Ġ== ĠO ĊĊĠĠĠ Ġoperator Ġfun Ġnext (): ĠT TP layer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Exactly One Player ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Only Ġpossible Ġto Ġcall Ġ. next () Ġon Ġa Ġreal Ġplayer Ġbut Ġit Ġwas Ġcalled Ġon Ġ" Ġ+ Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġ== ĠX ) ĠO Ġelse ĠX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġif Ġthis Ġplayer Ġis Ġ( also ) Ġanother Ġplayer .< br ></ br > ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġsame Ġas Ġ` this . and ( other ) Ġ== Ġother ` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġother ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ` is `( other : ĠT TP layer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . and ( other ) Ġ== Ġother ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġand ( other : ĠT TP layer ): ĠT TP layer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== ĠNONE Ġ|| Ġother Ġ== ĠNONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Exactly One Player Ġ&& Ġother . is Exactly One Player ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġother ) Ġthis Ġelse ĠNONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== ĠBLOCK ED Ġ|| Ġother Ġ== ĠBLOCK ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġ== ĠX O ) Ġother Ġelse Ġother . and ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġor ( other : ĠT TP layer ): ĠT TP layer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== ĠNONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== ĠNONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== ĠX O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== ĠBLOCK ED Ġ|| Ġother Ġ== ĠBLOCK ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBLOCK ED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġ!= Ġother ) ĠX O Ġelse Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġis Exactly One Player ( winner : ĠT TP layer ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwinner Ġ!= Ġnull Ġ&& Ġwinner . is Exactly One Player ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠT TW in Condition Ġ: ĠIterable < Win nable > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġwin n ables : ĠList < Win nable > ĊĠĠĠ Ġprivate Ġval Ġconsecutive : ĠInt ĊĊĠĠĠ Ġconstructor ( var arg Ġwin n ables : ĠWin nable ) Ġ: Ġthis ( win n ables . toList ()) ĊĊĠĠĠ Ġconstructor ( win n ables : ĠList < Win nable >) Ġ: Ġthis ( win n ables , Ġwin n ables . size ) ĊĊĠĠĠ Ġconstructor ( win n ables : ĠList < Win nable >, Ġconsecutive : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( win n ables . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġhave Ġan Ġempty Ġwin Ġcondition !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . win n ables Ġ= Ġwin n ables . to Mutable List () ĊĠĠĠĠĠĠĠ Ġthis . con secutive Ġ= Ġconsecutive ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġneeded For Win ( player : ĠT TP layer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwin n ables . size Ġ- Ġhas Currently ( player ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Win nable ( by Player : ĠT TP layer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Currently ( by Player . next ()) Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Currently ( player : ĠT TP layer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( win nable Ġin Ġwin n ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( win nable . won By . and ( player ) Ġ== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdetermine Winner New (): ĠT TP layer Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġwinner : ĠT TP layer Ġ= ĠT TP layer . NONE ĊĊĠĠĠĠĠĠĠ Ġval Ġconsecutive Players Ġ= ĠInt Array ( T TP layer . values (). size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( win nable Ġin Ġwin n ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġwin nable . won By ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pl Ġin ĠT TP layer . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġpl . ordinal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pl . and ( current ) Ġ== Ġpl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsecutive Players [ i ] ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsecutive Players [ i ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( con secutive Players [ i ] Ġ>= Ġthis . con secutive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= Ġwinner . or ( pl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwinner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Win nable ( field : ĠWin nable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwin n ables . contains ( field ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsize (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwin n ables . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Win nable > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . win n ables . to Mutable List (). iterator () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ interface ĠWin nable Ġ{ ĊĊĠĠĠ Ġval Ġwon By : ĠT TP layer Ċ Ċ } Ċ