package Ġcom . castle f rog . ag l . domains . connect 4 Ċ Ċ import Ġcom . castle f rog . ag l . Simulator Ċ import Ġcom . castle f rog . ag l . domains . Ad vers arial Rewards Ċ import Ġcom . castle f rog . ag l . util . L ru Cache Ċ Ċ class ĠConnect 4 Simulator Ġ: ĠSimulator < Connect 4 State , ĠConnect 4 Action > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcolumn Height s Cache Ġ= ĠL ru Cache < Connect 4 State , ĠInt Array >( 1 ) ĊĠĠĠ Ġprivate Ġval Ġrewards Cache Ġ= ĠL ru Cache < Connect 4 State , ĠInt Array >( 1 ) ĊĠĠĠ Ġprivate Ġval Ġlegal Actions Cache Ġ= ĠL ru Cache < Connect 4 State , ĠList < Set < Connect 4 Action >> >( 1 ) ĊĊĠĠĠ Ġoverride Ġval ĠinitialState : ĠConnect 4 State ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠConnect 4 State () ĊĊĠĠĠ Ġoverride Ġfun Ġcalculate Rewards ( state : ĠConnect 4 State ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrewards Ġ= Ġrewards Cache [ state ] Ġ?: ĠComp anion . calculate Rewards ( state ) ĊĠĠĠĠĠĠĠ Ġrewards Cache [ state ] Ġ= Ġrewards ĊĠĠĠĠĠĠĠ Ġreturn Ġrewards ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcalculate Legal Actions ( state : ĠConnect 4 State ): ĠList < Set < Connect 4 Action >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlegal Actions Ġ= Ġlegal Actions Cache [ state ] Ġ?: Ġcalculate Legal Actions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Rewards ( state ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Column Height s ( state ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlegal Actions Cache [ state ] Ġ= Ġlegal Actions ĊĠĠĠĠĠĠĠ Ġreturn Ġlegal Actions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstate Transition ( state : ĠConnect 4 State , Ġactions : ĠMap < Int , ĠConnect 4 Action >): ĠConnect 4 State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Turn Ġ= Ġstate . agent Turn ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġactions [ agent Turn ] ĊĠĠĠĠĠĠĠ Ġval Ġlegal Actions Ġ= Ġcalculate Legal Actions ( state ) ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Height s Ġ= Ġcalculate Column Height s ( state ) ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ=== Ġnull Ġ|| Ġ! legal Actions [ agent Turn ]. contains ( action )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Illegal Ġaction , Ġ$ action , Ġfrom Ġstate , Ġ$ state ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstate . bit Board s [ agent Turn ] Ġ= Ġstate . bit Board s [ agent Turn ] Ġxor Ġ( 1 L Ġshl Ġcolumn Height s [ action . location ] ++) ĊĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Column Height s ( state : ĠConnect 4 State ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Height s Ġ= Ġcolumn Height s Cache [ state ] Ġ?: ĠComp anion . calculate Column Height s ( state ) ĊĠĠĠĠĠĠĠ Ġcolumn Height s Cache [ state ] Ġ= Ġcolumn Height s ĊĠĠĠĠĠĠĠ Ġreturn Ġcolumn Height s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠN _ PLAY ERS Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠALL _ LOCATION S Ġ= Ġ( 1 L Ġshl Ġ( Connect 4 State . HEIGHT Ġ+ Ġ 1 ) Ġ* ĠConnect 4 State . WIDTH ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIRST _ COLUMN Ġ= Ġ( 1 L Ġshl ĠConnect 4 State . HEIGHT Ġ+ Ġ 1 ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBOTTOM _ ROW Ġ= ĠALL _ LOCATION S Ġ/ ĠFIRST _ COLUMN ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠA BO VE _ TOP _ ROW Ġ= ĠBOTTOM _ ROW Ġshl ĠConnect 4 State . HEIGHT ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate Legal Actions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠConnect 4 State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrewards : ĠInt Array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Height s : ĠInt Array ĊĠĠĠĠĠĠĠ Ġ): ĠList < Set < Connect 4 Action >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlegal Actions : ĠList < Mutable Set < Connect 4 Action >> Ġ= ĠlistOf ( mutable Set Of (), Ġmutable Set Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rewards . content Equals ( Ad vers arial Rewards . NE UT R AL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil ĠConnect 4 State . WIDTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ 1 L Ġshl Ġcolumn Height s [ it ] Ġand ĠA BO VE _ TOP _ ROW Ġ== Ġ 0 L Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlegal Actions [ state . agent Turn ]. add ( Connect 4 Action . valueOf ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlegal Actions ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate Rewards ( state : ĠConnect 4 State ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= ĠConnect 4 State . HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠN _ PLAY ERS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit Board Ġ= Ġstate . bit Board s [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiagonal 1 Ġ= Ġbit Board Ġand Ġ( bit Board Ġshr Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhorizontal Ġ= Ġbit Board Ġand Ġ( bit Board Ġshr Ġheight Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiagonal 2 Ġ= Ġbit Board Ġand Ġ( bit Board Ġshr Ġheight Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertical Ġ= Ġbit Board Ġand Ġ( bit Board Ġshr Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( diagonal 1 Ġand Ġ( diagonal 1 Ġshr Ġ 2 Ġ* Ġheight ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( horizontal Ġand Ġ( horizontal Ġshr Ġ 2 Ġ* Ġ( height Ġ+ Ġ 1 ))) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( diagonal 2 Ġand Ġ( diagonal 2 Ġshr Ġ 2 Ġ* Ġ( height Ġ+ Ġ 2 ))) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( vertical Ġand Ġ( vertical Ġshr Ġ 2 )) Ġ!= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( i Ġ== Ġ 0 ) ĠAd vers arial Rewards . BLACK _ WIN S Ġelse ĠAd vers arial Rewards . WHITE _ WIN S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAd vers arial Rewards . NE UT R AL ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate Column Height s ( state : ĠConnect 4 State ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Height s Ġ= ĠInt Array ( Connect 4 State . WIDTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit Board Ġ= Ġstate . bit Board s [ 0 ] Ġor Ġstate . bit Board s [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠConnect 4 State . WIDTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Height s [ i ] Ġ= Ġ( Connect 4 State . HEIGHT Ġ+ Ġ 1 ) Ġ* Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( bit Board Ġand Ġ( 1 L Ġshl Ġcolumn Height s [ i ]) Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Height s [ i ] Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcolumn Height s ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ