package Ġio . m stream . board game engine . ai Ċ Ċ import Ġio . m stream . board game engine .* Ċ import Ġio . m stream . board game engine . board .* Ċ import Ġio . m stream . board game engine . game .* Ċ import Ġio . m stream . board game engine . move .* Ċ import Ġorg . junit .* Ċ Ċ class ĠNeg Max Decision Engine Test Ġ{ ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġneg Max Ġ= ĠNeg Max Decision Engine ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġgame Ġ= ĠTest Game ( Board ( 2 ), ĠGameState . SIDE _ A _ IS _ MOV ING ) ĊĠĠĠĠĠĠĠ Ġvar Ġmoves Ġ= Ġempty List < Move >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( game . has Possible Moves ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Ġ= Ġneg Max . choose Best Move ( game ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmoves Ġ+= Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame . make Move ( move ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Moves Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelect . from C ords ( 1 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelect . from C ords ( 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelect . from C ords ( 1 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelect . from C ords ( 0 , Ġ 0 )) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( expected Moves , Ġmoves ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTest Game ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard : ĠBoard , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame State : ĠGameState ) Ġ: ĠGame ( Null Event Sender , Ġboard , Ġgame State ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġside AP iece Ġ= ĠPiece (" side AP iece ", ĠSide . A ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġside BP iece Ġ= ĠPiece (" side BP iece ", ĠSide . B ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmake Move ( move : ĠMove ): ĠMove Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . put Piece At ( piece Of Moving Side (), Ġmove . position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMove Result . CORRECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMove Result . UNSUPPORTED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpossible Moves (): ĠSet < Move > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmoves Ġ= Ġempty Set < Move >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game State . is O ngo ing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 .. ( board . size Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 .. board . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠPosition . from C ords ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( board . is Field Free ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoves Ġ= Ġmoves . union ( set Of ( Select . from Position ( position ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmoves ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġongoing Game Evaluation () Ġ= Ġbalance () ĊĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclone () Ġ= ĠTest Game ( board . clone (), Ġgame State ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġpiece Of Moving Side () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( moving Side () Ġ== ĠSide . A ) Ġside AP iece Ġelse Ġside BP iece ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate State () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! board . is Full ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Moving Side () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= Ġbalance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame State Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ== Ġ 0 Ġ-> ĠGameState . DRAW ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ> Ġ 0 Ġ Ġ-> ĠGameState . SIDE _ A _ W ON ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ< Ġ 0 Ġ Ġ-> ĠGameState . SIDE _ B _ W ON ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbalance (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġside AS core Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġside B Score Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 .. ( board . size Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 .. board . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠPosition . from C ords ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Score Ġ= Ġ 2 Ġ* Ġy Ġ+ Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpiece Ġ= Ġboard . piece At ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( piece ?. side ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide . A Ġ-> Ġside AS core Ġ+= Ġfield Score ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide . B Ġ-> Ġside B Score Ġ+= Ġfield Score ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġside AS core Ġ- Ġside B Score ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ