/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 , ĠNull Non ame Ċ Ġ* ĠKotlin Ġconverted Ġand Ġmodified Ġby ĠV en om = N hel v Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* ĠĠĠĠĠĠ Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* ĠĠĠĠ Ġ* ĠNeither Ġthe Ġname Ġof ĠNull Non ame Ġnor Ġthe Ġnames Ġof Ġits Ċ Ġ* ĠĠĠĠĠĠ Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ Ġ* ĠĠĠĠĠĠ Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġedu . cu hk . c se . f yp . te tris ai . py ai Ċ Ċ import Ġj ep . J ep Config Ċ import Ġj ep . J ep Exception Ċ import Ġj ep . Sub Interpreter Ċ import Ġmu . nu . null po . game . component . Controller Ċ import Ġmu . nu . null po . game . play . Game Engine Ċ import Ġmu . nu . null po . game . subsystem . ai . A IP layer Ċ import Ġmu . nu . null po . game . subsystem . ai . Dummy AI Ċ import Ġorg . apache . log 4 j . Logger Ċ Ċ /** Ċ Ġ* ĠPy AI Ġ- ĠBase Ġclass Ġfor Ġpython ĠAI Ġplayers Ċ Ġ*/ Ċ abstract Ġclass ĠPy AI ( override Ġval Ġname : String Ġ= Ġ" Py AI ", Ġprivate Ġval Ġscript Path : String , ĠclassName : Class < *> ?): Ċ ĉ Dummy AI (), ĠA IP layer Ġ{ Ċ ĉ /** ĠLog Ġ Ġ*/ Ċ ĉ protected Ġvar Ġlog : Logger Ġ= ĠLogger . getLogger ( className ) Ċ ĉ /** Ġãĥ Ľ ãĥ¼ãĥ« ãĥī ä½¿çĶ¨ äºĪ å®ļ Ġ Ġ*/ Ċ ĉ override Ġvar Ġbest Hold Ġ= Ġfalse Ċ ĉ /** ĠPlan Ġto Ġput X - coordinate Ġ Ġ*/ Ċ ĉ override Ġvar Ġbest X Ġ= Ġ 0 Ċ ĉ /** ĠPlan Ġto Ġput Y - coordinate Ġ Ġ*/ Ċ ĉ override Ġvar Ġbest Y Ġ= Ġ 0 Ċ ĉ /** ĠPlan Ġto Ġput Direction Ġ Ġ*/ Ċ ĉ override Ġvar Ġbest Rt Ġ= Ġ 0 Ċ ĉ /** ĠCurrent Ġpiece Ġnumber Ġ Ġ*/ Ċ ĉ override Ġvar Ġthink Current Piece No Ġ= Ġ 0 Ċ ĉ /** ĠPe ace Ġof Ġthoughts Ġis Ġfinished Ġnumber Ġ Ġ*/ Ċ ĉ override Ġvar Ġthink Last Piece No Ġ= Ġ 0 Ċ ĉ /** ĠDid Ġthe Ġthinking Ġthread Ġfinish Ġsuccessfully ? Ġ Ġ*/ Ċ ĉ override Ġvar Ġthink Complete Ġ= Ġfalse Ċ ĉ /** ĠWhen Ġtrue , Running Ġthread Ġ Ġ*/ Ġ// public Ġvolatile Ġboolean Ġthread Running ; Ċ ĉ /** ĠThread Ġfor Ġexecuting Ġthe Ġthink Ġroutine Ġ Ġ*/ Ġ// public ĠThread Ġthread ; Ċ ĉ private Ġvar Ġj ep : Sub Interpreter ? Ġ= Ġnull ĊĊ ĉ init Ġ{ Ċĉ ĉ println ( j ep ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġinit J EP () Ġ{ Ċĉ ĉ if ( j ep == null ) Ġtry Ġ{ Ċĉĉ ĉ j ep Ġ= ĠSub Interpreter ( J ep Config (). add Shared Modules (" numpy ")). apply Ġ{ Ċĉĉĉ ĉ eval (" import Ġsys ") Ċĉĉĉ ĉ eval (" sys . path . append (' py ai - scripts ') ") Ċĉĉĉ ĉ run Script ( script Path ) Ċĉĉĉ ĉ set (" AIN ame ", Ġname ) Ċĉĉĉ ĉ eval (" ai Ġ= Ġexport AI ( AIN ame )") Ċĉĉĉ ĉ val Ġv : Any Ġ= Ġthis . getValue (" ai . name ") Ċĉĉĉ ĉ log . debug (" AI Ġname Ġis Ġ$ v ") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" J EP Ġcannot Ġbe Ġcreated !", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġinit ( engine : Game Engine , Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ init J EP () Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . init ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" J EP Ġcannot Ġbe Ġinit !", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġnew Piece ( engine : Game Engine , Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . new Piece ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġnew Piece , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġon First ( engine : Game Engine , Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . on First ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġon First , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġon Last ( engine : Game Engine , Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . on Last ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġon Last , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġrender State ( engine : Game Engine , Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . render State ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġrender State , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġset Control ( engine : Game Engine , Ġplayer ID : Int , Ġctrl : Controller ): Int Ġ= Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ set (" ctrl ", Ġctrl ) Ċĉĉĉ ĉ eval (" ctrl bit Ġ= Ġai . set Control ( engine , Ġplayer ID , Ġctrl )") Ċĉĉĉ ĉ ( this . getValue (" ctrl bit ") Ġas ĠInt ?) Ċĉĉ ĉ } Ġ?: Ġ 0 Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġset Control , Ġ", Ġj ) Ċĉĉĉ 0 Ċĉ ĉ } ĊĊ ĉ fun Ġshutdown ( engine : Game Engine ?, Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . shutdown ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġshutdown , Ġ", Ġj ) Ċĉ ĉ } Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. close () Ċĉĉ ĉ j ep Ġ= Ġnull Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġshutdown , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġrender Hint ( engine : Game Engine , Ġplayer ID : Int ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. run Ġ{ Ċĉĉĉ ĉ set (" engine ", Ġengine ) Ċĉĉĉ ĉ set (" player ID ", Ġplayer ID ) Ċĉĉĉ ĉ eval (" ai . render Hint ( engine , Ġplayer ID )") Ċĉĉ ĉ } Ċĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġrender Hint , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ operator Ġfun Ġinvoke ( command : String ?) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ j ep ?. eval ( command ) ĊĊĉ ĉ } Ġcatch ( j : J ep Exception ) Ġ{ Ċĉĉ ĉ log . error (" Error Ġin Ġinvoke , Ġ", Ġj ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ