package Ġcom . castle f rog . ag l . domains . back gam mon Ċ Ċ import Ġcom . castle f rog . ag l . State Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġback gam mon Ġstate Ġas Ġan Ġarray Ġof Ġbyte Ġlocations . Ċ Ġ* Ġ@ param Ġlocations Ġeach Ġlocation Ġis Ġ 0 Ġif Ġno Ġpieces Ġare Ġat Ġthat Ġlocation Ġand Ġpositive Ġfor Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġnumber Ġof Ġpieces Ġplayer Ġ 1 Ġhas Ġthere Ġand Ġnegative Ġfor Ġthe Ġnumber Ġof Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpieces Ġplayer Ġ 2 Ġhas Ġthere . Ċ Ġ* Ġ@ param Ġdice Ġtwo Ġvalues Ġin Ġrange Ġ 0 - 5 Ġthat Ġrepresent Ġdie Ġfaces Ġ 1 Ġto Ġ 6 Ġeach ; Ġorder Ġdoes Ġnot Ġmatter Ċ Ġ* Ġ@ param Ġagent Turn Ġcurrent Ġplayers Ġturn Ċ Ġ*/ Ċ class ĠBack gam mon State ( ĊĠĠĠ Ġval Ġlocations : ĠByteArray Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 2 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠ Ġ- 5 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠ Ġ- 3 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠĠĠ Ġ- 5 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 3 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠ Ġ- 2 , ĊĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ), ĊĠĠĠ Ġval Ġdice : ĠByteArray Ġ= ĠByteArray ( N _ D ICE ), ĊĠĠĠ Ġvar Ġagent Turn : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠState < Back gam mon State > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠBack gam mon State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocations Ġ= ĠByteArray ( N _ LOCATION S ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( this . locations , Ġ 0 , Ġlocations , Ġ 0 , ĠN _ LOCATION S ) ĊĠĠĠĠĠĠĠ Ġval Ġdice Ġ= ĠByteArray ( N _ D ICE ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( this . dice , Ġ 0 , Ġdice , Ġ 0 , ĠN _ D ICE ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBack gam mon State ( locations , Ġdice , Ġagent Turn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠBack gam mon State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlocations . content Equals ( other . locations ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( dice [ 0 ] Ġ== Ġother . dice [ 0 ] Ġ&& Ġdice [ 1 ] Ġ== Ġother . dice [ 1 ]) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( dice [ 0 ] Ġ== Ġother . dice [ 1 ] Ġ&& Ġdice [ 1 ] Ġ== Ġother . dice [ 0 ])) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent Turn Ġ== Ġother . agent Turn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdice Ġ= Ġif Ġ( dice [ 0 ] Ġ< Ġdice [ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( dice [ 1 ]. toInt (), Ġdice [ 0 ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( dice [ 0 ]. toInt (), Ġdice [ 1 ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( agent Turn Ġ* Ġ 1 1 Ġ+ Ġlocations . content HashCode ()) Ġ* Ġ 1 7 Ġ+ Ġdice . content HashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠStringBuilder (" Ġ"). append ( agent Turn ). append (" Ġ- Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġdice Ġ= Ġif Ġ( dice [ 0 ] Ġ< Ġdice [ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( dice [ 1 ]. toInt (), Ġdice [ 0 ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( dice [ 0 ]. toInt (), Ġdice [ 1 ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . append (" [" ). append ( dice [ 0 ] Ġ+ Ġ 1 ). append (" ][" ). append ( dice [ 1 ] Ġ+ Ġ 1 ). append (" ]\ n ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 2 Ġdown To Ġ 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locations [ i ] Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append ( locations [ i ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . append ("| ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 6 Ġdown To Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locations [ i ] Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append ( locations [ i ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . append (" Ġ[ "). append ( locations [ 0 ]. toInt ()). append (" ]\ n ") ĊĠĠĠĠĠĠĠ Ġoutput . append (" ------------ |------------ \ n ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 3 .. 1 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locations [ i ] Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append ( locations [ i ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . append ("| ") ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 9 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġ 2 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locations [ i ] Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . append ( locations [ i ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . append (" Ġ[ "). append ( locations [ 2 5 ]. toInt ()). append (" ]") ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠN _ PLAY ERS Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠN _ D ICE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠN _ DIE _ FAC ES Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠN _ LOCATION S Ġ= Ġ 2 6 ĊĠĠĠ Ġ} Ċ } Ċ