package Ġcom . sap ug l ha . t ict act oe . controller Ċ Ċ import Ġandroidx . databinding . Base Observable Ċ import Ġandroidx . databinding . Bind able Ċ import Ġcom . sap ug l ha . t ict act oe . BR Ċ import Ġcom . sap ug l ha . t ict act oe . model . Board Ċ import Ġcom . sap ug l ha . t ict act oe . model . Board . Companion . MATRIX _ SIZE Ċ import Ġcom . sap ug l ha . t ict act oe . model . Player Type Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠGame Status Handler Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgame : ĠBoard Ċ ) Ġ: ĠBase Observable () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġwinner : ĠPlayer Type ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Player : ĠPlayer Type Ġ= ĠPlayer Type . X ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMain Ġgame Ġflow ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġreturns : Ġtrue Ġif Ġthere Ġwas Ġa Ġwinner Ġafter Ġthe Ġlast Ġplay ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġalready Ġhave Ġa Ġwinner Ġprevent Ġnew Ġplays ĊĠĠĠĠĠĠĠ Ġif Ġ( winner Ġ!= Ġnull ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġreject Ġinvalid Ġplays ĊĠĠĠĠĠĠĠ Ġif Ġ(! game . setPosition ( x , Ġy , Ġcurrent Player )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġdispatch Ġa Ġboard Ġupdate ĊĠĠĠĠĠĠĠ Ġnotify PropertyChanged ( BR ._ all ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcheck For Winner ( x , Ġy , Ġcurrent Player ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġotherwise , Ġprepare Ġfor Ġnext Ġmove ĊĠĠĠĠĠĠĠ Ġset Next Player () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame . reset () ĊĠĠĠĠĠĠĠ Ġwinner Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Player Ġ= ĠPlayer Type . X ĊĊĠĠĠĠĠĠĠ Ġnotify PropertyChanged ( com . sap ug l ha . t ict act oe . BR ._ all ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bind able ĊĠĠĠ Ġfun Ġget Winner (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ!= Ġwinner ) Ġwinner !!. toString () Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Player Resource ( x : ĠInt , Ġy : ĠInt ): ĠPlayer Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgame . getPosition ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Next Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Player Ġ= Ġif Ġ( current Player Ġ=== ĠPlayer Type . X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Type . O ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Type . X ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck For Winner ( x : ĠInt , Ġy : ĠInt , Ġplayer : ĠPlayer Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġwinner Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġrow , Ġiterate Ġcolumns : ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game . getPosition ( x , Ġj ) Ġ=== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( winner Count Ġ== ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġcolumn , Ġiterate Ġrows : ĊĠĠĠĠĠĠĠ Ġwinner Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game . getPosition ( i , Ġy ) Ġ=== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( winner Count Ġ== ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġone Ġdiagonal , Ġbut Ġonly Ġif Ġthe Ġplayed Ġposition Ġhas Ġthe Ġsame ĠX Ġand ĠY ĊĠĠĠĠĠĠĠ Ġwinner Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game . getPosition ( i , Ġi ) Ġ=== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( winner Count Ġ== ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFinally , Ġcheck Ġthe Ġother Ġdiagonal ĊĠĠĠĠĠĠĠ Ġwinner Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠMAT RIX _ SIZE Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game . getPosition ( i , Ġj ) Ġ=== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( winner Count Ġ== ĠMAT RIX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ