package Ġde . hav em ann . l uk as . nim . domain . ent ites Ċ Ċ import Ġde . hav em ann . l uk as . nim . domain . value type . Match Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠPlayer Ġthat Ġdraw s Ġautomatically Ġa Ġrandom Ġdetermined Ġcount Ġof Ġmatches Ċ Ġ*/ Ċ class ĠRandom Player ( override Ġval Ġname : ĠString Ġ= Ġ" random Ġcomputer Ġplayer ") Ġ: ĠNim Game . Player Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrequest To Draw ( turn : ĠNim Game . Turn ) Ġ{ ĊĠĠĠĠĠĠĠ Ġturn . draw ( determine Random Value ( turn )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine Random Value ( turn : ĠNim Game . Turn ): ĠMatch Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmaxValue Ġ= ĠMatch . min ( Match . TH REE , Ġturn . remaining Matches ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( max Value Ġ== ĠMatch . ONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMatch . ONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMatch ( Random . nextInt ( Match . ONE . value , ĠmaxValue . value )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Random Player ( name ='$ name ')" ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠPlayer Ġthat Ġre members Ġthe Ġcurrent Ġturn Ġand Ġwaits Ġfor Ġasync Ġinvocation Ġof Ġturn Ċ Ġ*/ Ċ class ĠStateful Player ( override Ġval Ġname : ĠString ) Ġ: ĠNim Game . Player Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Turn : ĠNim Game . Turn ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġdraw ( match : ĠMatch ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Turn ?. draw ( match ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest To Draw ( turn : ĠNim Game . Turn ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Turn Ġ= Ġturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" State ful Player ( name ='$ name ')" ĊĠĠĠ Ġ} Ċ } Ċ