package Ġcom . ny i . game . t ict act oe Ċ Ċ import Ġcom . ny i . game . t ict act oe . model . Action Ċ import Ġcom . ny i . game . t ict act oe . model . Player Ċ import Ġcom . ny i . game . t ict act oe . model . Player . PLAYER _ EMPTY Ċ import Ġcom . ny i . game . t ict act oe . model . Player . PLAYER _ O _ MIN I Ċ import Ġcom . ny i . game . t ict act oe . model . Player . PLAYER _ X _ MAX I Ċ import Ġcom . ny i . game . t ict act oe . model . State Ċ Ċ object ĠT ic T ac To e Ġ{ ĊĊĠ Ġconst Ġval ĠP LAYER _ X _ WIN Ġ= Ġ 3 ĊĠ Ġconst Ġval ĠP LAYER _ O _ WIN Ġ= Ġ- 3 ĊĊĠ Ġfun Ġplayer ( state : ĠState ) Ġ: ĠPlayer Ġ{ ĊĠĠĠĠĠ Ġwhen ( state . last Play ed Player ){ ĊĠĠĠĠĠĠĠ ĠP LAYER _ O _ MIN I Ġ-> Ġreturn ĠP LAYER _ X _ MAX I ĊĠĠĠĠĠĠĠ ĠP LAYER _ X _ MAX I Ġ-> Ġreturn ĠP LAYER _ O _ MIN I ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠP LAYER _ EMPTY ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠP LAYER _ EMPTY ĊĠ Ġ} ĊĊĠ Ġfun Ġaction ( state : ĠState ) Ġ: ĠList < Action >{ ĊĠĠĠ Ġval Ġavailable Action Ġ= Ġmutable ListOf < Action >() ĊĠĠĠ Ġstate . state List . forEach Indexed Ġ{ Ġindex , Ġplayer Ġ-> ĊĠĠĠĠĠ Ġwhen ( player ){ ĊĠĠĠĠĠĠĠ ĠP LAYER _ EMPTY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval ĠnewState List Ġ= Ġstate . state List . copyOf () ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġlast e Play Player Ġ= ĠP LAYER _ EMPTY ĊĊĠĠĠĠĠĠĠĠĠ Ġwhen ( state . last Play ed Player ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP LAYER _ X _ MAX I Ġ-> Ġlast e Play Player Ġ= ĠP LAYER _ O _ MIN I ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP LAYER _ O _ MIN I Ġ-> Ġlast e Play Player = ĠP LAYER _ X _ MAX I ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠnewState List [ index ] Ġ= Ġlast e Play Player ĊĠĠĠĠĠĠĠĠĠ Ġavailable Action . add ( Action ( State ( last e Play Player , ĠnewState List ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġavailable Action ĊĠ Ġ} ĊĊĠ Ġfun Ġresult ( state : ĠState , Ġaction : ĠAction ) Ġ: ĠState { ĊĠĠĠ Ġreturn Ġaction . state ĊĠ Ġ} ĊĊĠ Ġfun Ġterminal ( state : ĠState ) Ġ: ĠBoolean { ĊĊĠĠĠ Ġval Ġfirst Horizontal Ġ= Ġstate . state List [ 0 ]. code Ġ+ Ġstate . state List [ 1 ]. code Ġ+ Ġstate . state List [ 2 ]. code ĊĠĠĠ Ġval Ġsecond Horizontal Ġ= Ġstate . state List [ 3 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 5 ]. code ĊĠĠĠ Ġval Ġthird Horizontal Ġ= Ġstate . state List [ 6 ]. code Ġ+ Ġstate . state List [ 7 ]. code Ġ+ Ġstate . state List [ 8 ]. code ĊĊĠĠĠ Ġval Ġfirst Vertical Ġ= Ġstate . state List [ 0 ]. code Ġ+ Ġstate . state List [ 3 ]. code Ġ+ Ġstate . state List [ 6 ]. code ĊĠĠĠ Ġval Ġsecond Vertical Ġ= Ġstate . state List [ 1 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 7 ]. code ĊĠĠĠ Ġval Ġthird Vertical Ġ= Ġstate . state List [ 2 ]. code Ġ+ Ġstate . state List [ 5 ]. code Ġ+ Ġstate . state List [ 8 ]. code ĊĊĠĠĠ Ġval Ġleft Diag onal Ġ= Ġstate . state List [ 0 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 8 ]. code ĊĠĠĠ Ġval Ġright Diag onal Ġ= Ġstate . state List [ 2 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 6 ]. code ĊĊĠĠĠ Ġif ( first Horizontal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġfirst Horizontal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( second Horizontal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġsecond Horizontal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( third Horizontal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġthird Horizontal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( first Vertical Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġfirst Vertical Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( second Vertical Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġsecond Vertical Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( third Vertical Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġthird Vertical Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( left Diag onal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġleft Diag onal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġif ( right Diag onal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġright Diag onal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġtrue ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġstate . state List . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠP LAYER _ EMPTY Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġutility ( state : ĠState ) Ġ: ĠInt { ĊĠĠĠ Ġval Ġfirst Horizontal Ġ= Ġstate . state List [ 0 ]. code Ġ+ Ġstate . state List [ 1 ]. code Ġ+ Ġstate . state List [ 2 ]. code ĊĠĠĠ Ġval Ġsecond Horizontal Ġ= Ġstate . state List [ 3 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 5 ]. code ĊĠĠĠ Ġval Ġthird Horizontal Ġ= Ġstate . state List [ 6 ]. code Ġ+ Ġstate . state List [ 7 ]. code Ġ+ Ġstate . state List [ 8 ]. code ĊĊĠĠĠ Ġval Ġfirst Vertical Ġ= Ġstate . state List [ 0 ]. code Ġ+ Ġstate . state List [ 3 ]. code Ġ+ Ġstate . state List [ 6 ]. code ĊĠĠĠ Ġval Ġsecond Vertical Ġ= Ġstate . state List [ 1 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 7 ]. code ĊĠĠĠ Ġval Ġthird Vertical Ġ= Ġstate . state List [ 2 ]. code Ġ+ Ġstate . state List [ 5 ]. code Ġ+ Ġstate . state List [ 8 ]. code ĊĊĠĠĠ Ġval Ġleft Diag onal Ġ= Ġstate . state List [ 0 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 8 ]. code ĊĠĠĠ Ġval Ġright Diag onal Ġ= Ġstate . state List [ 2 ]. code Ġ+ Ġstate . state List [ 4 ]. code Ġ+ Ġstate . state List [ 6 ]. code ĊĊĠĠĠ Ġif ( first Horizontal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġfirst Horizontal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġfirst Horizontal ĊĠĠĠ Ġelse Ġif ( second Horizontal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġsecond Horizontal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġsecond Horizontal ĊĠĠĠ Ġelse Ġif ( third Horizontal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġthird Horizontal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġthird Horizontal ĊĠĠĠ Ġelse Ġif ( first Vertical Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġfirst Vertical Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġfirst Vertical ĊĠĠĠ Ġelse Ġif ( second Vertical Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġsecond Vertical Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġsecond Vertical ĊĠĠĠ Ġelse Ġif ( third Vertical Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġthird Vertical Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġthird Vertical ĊĠĠĠ Ġelse Ġif ( left Diag onal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġleft Diag onal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġleft Diag onal ĊĠĠĠ Ġelse Ġif ( right Diag onal Ġ== ĠP LAYER _ X _ WIN Ġ|| Ġright Diag onal Ġ== ĠP LAYER _ O _ WIN ) Ġreturn Ġright Diag onal ĊĠĠĠ Ġelse Ġreturn Ġ 0 ĊĠ Ġ} ĊĊĠ Ġfun ĠmaxValue ( state : ĠState ) Ġ: ĠInt { ĊĠĠĠ Ġif ( terminal ( state )) Ġreturn Ġutility ( ĊĠĠĠĠĠ Ġstate ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġavailable Action Ġ= Ġaction ( state ) ĊĠĠĠ Ġvar Ġmax Ġ= Ġ- 1 9 ĊĠĠĠ Ġavailable Action . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmini Value ( ĊĠĠĠĠĠĠĠ Ġresult ( ĊĠĠĠĠĠĠĠĠĠ Ġit . state , ĊĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġif ( value Ġ>= Ġmax ) Ġmax Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmax ĊĠ Ġ} ĊĊĠ Ġfun Ġmini Value ( state : ĠState ) Ġ: ĠInt { ĊĠĠĠ Ġif ( terminal ( state )) Ġreturn Ġutility ( ĊĠĠĠĠĠ Ġstate ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġavailable Action Ġ= Ġaction ( state ) ĊĠĠĠ Ġvar Ġmin Ġ= Ġ 1 9 ĊĠĠĠ Ġavailable Action . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= ĠmaxValue ( ĊĠĠĠĠĠĠĠ Ġresult ( ĊĠĠĠĠĠĠĠĠĠ Ġit . state , ĊĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġif ( value Ġ<= Ġmin ) Ġmin Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmin ĊĠ Ġ} ĊĊĠ Ġfun Ġcalculate For X ( state : ĠState ) Ġ: ĠState { ĊĠĠĠ Ġval Ġavailable Action Ġ= Ġaction ( state ) ĊĠĠĠ Ġvar Ġmax Ġ= Ġ- 1 9 ĊĠĠĠ Ġvar Ġreturn State Ġ= Ġavailable Action [ 0 ]. state ĊĊĠĠĠ Ġavailable Action . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmini Value ( ĊĠĠĠĠĠĠĠ Ġresult ( ĊĠĠĠĠĠĠĠĠĠ Ġit . state , ĊĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġif ( value Ġ>= Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmax Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġreturn State Ġ= Ġit . state ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġreturn State ĊĠ Ġ} Ċ }