package Ġdev . n athan pb . dog o . min ig ames . t ict act oe Ċ Ċ /* Ċ Copyright Ġ 2 0 1 9 ĠN athan ĠB omb ana Ċ Ċ Licensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ you Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ You Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ċ http :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ċ Unless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ distributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ WITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ See Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ limitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ /** Ċ Ġ* ĠThe ĠT ic ĠT ac ĠTo e Ġgame Ġimplementation . Ċ Ġ* Ċ Ġ* Ġ@ param Ġon Win Ġblock Ġexecuted Ġwhen Ġa Ġplayer Ġwon Ġthe Ġgame . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ TT TP layer ] Ċ Ġ* Ċ Ġ* Ġ@ author ĠN athan PB Ċ Ġ* Ġ@ since Ġ 3 . 1 . 0 Ċ Ġ*/ Ċ open Ġclass ĠT ic T ac To e ( val Ġon Win : Ġ( TT TP layer ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTemplate Ġof Ġall Ġwins Ġavailable . Ġ( 1 Ġmeans Ġthe Ġplayer Ġyou Ġare Ġchecking , Ġ 0 Ġmeans Ġeverything Ġelse Ġ( including Ġthe Ġplayer Ġitself )). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġwins Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 1 1 0 0 0 0 0 0 ", Ġ" 1 0 0 1 0 0 1 0 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 0 0 1 1 1 0 0 0 ", Ġ" 0 0 0 0 0 0 1 1 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 1 0 0 1 0 0 1 0 ", Ġ" 0 0 1 0 0 1 0 0 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 0 0 0 1 0 0 0 1 ", Ġ" 0 0 1 0 1 0 1 0 0 " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrue Ġif Ġthe Ġgame Ġis Ġdone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġhas Winner Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġgame Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMust Ġbe Ġa Ġ 9 Ġcharacters Ġ[ String ]. ĠThe Ġfollowing Ġcharacters Ġare Ġallowed : ĊĠĠĠĠ Ġ* Ġ- Ġ* 0 * Ġmeans Ġempty . ĊĠĠĠĠ Ġ* Ġ- Ġ* 1 * Ġmeans Ġ[ TT TP layer . P 1 ] ĊĠĠĠĠ Ġ* Ġ- Ġ* 2 * Ġmeans Ġ[ TT TP layer . P 2 ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtable Ġ= Ġ" 0 0 0 0 0 0 0 0 0 " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay s Ġthe Ġgame Ġ( I Ġlost ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġalso Ġlooks Ġfor Ġwin ners Ġand Ġexecutes Ġ[ on Win ] Ġif Ġsomeone Ġwas Ġfound . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param [ index ] Ġthe Ġindex Ġon Ġtable Ġthat Ġthe Ġplayer Ġchanged . ĊĠĠĠĠ Ġ* Ġ@ param [ player ] Ġthe Ġplayer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( index : ĠInt , Ġplayer : ĠTT TP layer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable Ġ= Ġcopy Table With ( index , Ġplayer , Ġtable ) ĊĠĠĠĠĠĠĠ Ġ( has Winner ( table ) Ġ?: Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Empty Spaces ( table ) Ġ<= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreturn er Ġ: ĠTT TP layer ? Ġ= ĠTT TP layer . ENVIRONMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" 1 2 ", Ġ" 2 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toCharArray (). map Ġ{ Ġit . toString () Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġworking On Ġ= Ġtable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking On Ġ= Ġcopy Table With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Empty Space ( working On ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ" 1 ") ĠTT TP layer . P 1 Ġelse ĠTT TP layer . P 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking On ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Winner ( working On ) Ġ!= Ġnull ) Ġreturn er Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn er ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ()) ?. let Ġ{ Ġhas Winner Ġ= Ġtrue ; Ġon Win ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe places Ġa Ġspecified Ġindex Ġin Ġa Ġ[ String ] Ġwith Ġa ĠTT TP layer Ġmark . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param [ index ] Ġthe Ġindex Ġto Ġreplace . ĊĠĠĠĠ Ġ* Ġ@ param [ TT TP layer ] Ġthe ĠTT TP layer Ġto Ġmark . ĊĠĠĠĠ Ġ* Ġ@ param [ table ] Ġthe Ġtable Ġto Ġanalyze . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġreplaced Ġtable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcopy Table With ( index : ĠInt , ĠTT TP layer : ĠTT TP layer , Ġtable : ĠString ) Ġ= Ġ"${ table . substring ( 0 , Ġindex )} ${ TT TP layer . id }${ table . substring ( index Ġ+ Ġ 1 )}" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġa Ġtable Ġhas Ġa Ġwinner . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param [ table ] Ġthe Ġtable Ġto Ġanalyze . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ TT TP layer . P 1 ] Ġif Ġthe Ġfirst Ġplayer Ġwon ; Ġ[ TT TP layer . P 2 ] Ġif Ġthe Ġsecond Ġplayer Ġwon . Ġ[ TT TP layer . ENVIRONMENT ] Ġif Ġthe Ġgame Ġtied Ġand Ġnull Ġif Ġthe Ġgame Ġdidn 't Ġended . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Winner ( table : ĠString ): ĠTT TP layer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( TT TP layer . P 1 , ĠTT TP layer . P 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġtable . replace (( if Ġ( it Ġ== ĠTT TP layer . P 1 ) ĠTT TP layer . P 2 Ġelse ĠTT TP layer . P 1 ). id , Ġ" 0 "). replace (" 2 ", Ġ" 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwins . any Ġ{ Ġwin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatch Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwin . toCharArray (). forEach Indexed Ġ{ Ġindex , Ġit Ġ-> Ġ Ġif ( it Ġ== Ġ' 1 ' Ġ&& Ġcopy [ index ] Ġ!= Ġit ) Ġmatch Ġ= Ġfalse } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCount Ġhow Ġmany Ġzero es Ġthe Ġ[ table ] Ġcontains . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param [ table ] Ġthe Ġtable Ġto Ġanalyze . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġhow Ġmany Ġzero es Ġthe Ġ[ table ] Ġcontains . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcount Empty Spaces ( table : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtable . toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! array Of ( TT TP layer . P 1 , ĠTT TP layer . P 2 ). map Ġ{ Ġit . id Ġ}. any Ġ{ Ġ"$ c " Ġ== Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġnext Ġ* 0 * Ġon Ġ[ table ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ table ] Ġthe Ġtable Ġto Ġanalyze . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġindex Ġof Ġthe Ġfirst Ġ* 0 *. Ġ- 1 Ġif Ġnot Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġnext Empty Space ( table : ĠString ) Ġ= Ġtable . indexOf ( TT TP layer . ENVIRONMENT . id ) ĊĊ Ċ }