
    Ii+                       S r SSKJr  SSKJr  SSKJr  SSKJr  \(       a  SSK	J
r
Jr              SS	 jrS
S.         SS jjrS
S.         SS jjrSS jr          SS jrSS jrSS jrSS jrg)zBot strategy for Yahtzee.    )annotations)Callable)TYPE_CHECKING   )
count_dice   )YahtzeeGameYahtzeePlayerc                  U R                   U:w  a  gUR                  R                  (       d  gUR                  5       nU(       d  gUR                  R                  S5      S:H  nUR                  S:  GaP  [        UR                  R                  UUR                  US9n[        UR                  R                  5      n[        UR                  5       S S9u  pU(       aA  U
S	:  a;  [        UR                  R                  5       VVs1 s H  u  pX:X  d  M  UiM     nnnO [        UR                  R                  U5      n[        S
5       Vs1 s H&  oR                  R                  U5      (       d  M$  UiM(     nnX:w  a#  [        S
5       H  nX;   X;   :w  d  M  SU 3s  $    UR                  S:  a  [!        U5      S
:  a  g[#        UUUUS9$ s  snnf s  snf )zReturn the bot's next action.Nrollyahtzee2   r   yahtzee_bonus_eligiblec                    U S   U S   4$ Nr   r    items    7c:\Users\dbart\PlayPalace11\server\games\yahtzee\bot.py<lambda>bot_think.<locals>.<lambda>/       47DQRGBT    key      toggle_die_)calculate_scoreall_categoriesupper_categories)current_playerdice
has_rolledget_open_categoriesscoresget
rolls_left_pick_target_categoryvaluesr   maxitems	enumerate_desired_keep_indicesrangeis_keptlen_pick_best_category_action)gameplayerr    r!   r"   open_categoriesr   targetcountsbest_valbest_cntivdesired_keepscurrent_keepss                  r   	bot_thinkr?      s    f$;;!!002O $]]..y9R?1&KK#9	
 FKK../ 5TU!h!m+4V[[5G5G+HZ+H41AMQ+HMZM1&++2D2DfMM$)!HGHq0C0CA0FHG)1X&A,>?(,,  q S%7!%;%'%)	  [ Hs   GG#G5GFr   c               P    US   nSnU H  n[        XX#S9nXu:  d  M  UnUnM     U$ )z(Choose category to pursue while rolling.r         r   )_category_potential)r+   r6   r)   r   best_cat
best_valuecatvalues           r   r*   r*   G   sE     q!HJ#
 JH  Or   c               p   [        U 5      n[        UR                  5       S S9u  pV[        [	        U 5      5      n[        U5      n[        U 5      n	US;   a"  [        U5      n
XJ   nX-  SU-
  U
-  S-  U-  -   $ US:X  a=  US:  a  SU-
  n[        U	5      US-  U-  -   $ [        S	SU-
  5      nXe-  X-  S
-  U-  -   $ US:X  a=  US:  a  SU-
  n[        U	5      US-  U-  -   $ [        S	SU-
  5      nXe-  X-  S-  U-  -   $ US:X  a>  U(       a  SOSnUS:X  a  SU-   $ US:  a  US-  SU-
  S-  U-  -   US-  -   $ US-  US-  -   $ US:X  a  [        S UR                  5        5       SS9n[        U5      S:  a  US	   S:  a
  US   S:  a  g[        U5      S:  a  US	   S:  a  SUS-  -   $ [        U5      S:  a  US	   S:  a  US   S:  a  SUS-  -   $ S US-  -   $ US!:X  a  US:  a  g"US#-  US$-  -   $ US%:X  a  US:  a  g&US'-  US-  -   $ US(:X  a&  [        S) U  5       5      n[        U	5      US
-  U-  -   $ g)*z=Heuristic value for pursuing a category with remaining rolls.c                    U S   U S   4$ r   r   r   s    r   r   %_category_potential.<locals>.<lambda>d   r   r   r   onestwosthreesfoursfivessixesr   gffffff?
three_kindr   g      ?r   g      ?	four_kindr   g333333?r         Y@g        g      I@g       @g      @g?g      @g       @
full_housec              3  4   #    U  H  oS :  d  M
  Uv   M     g7fr   Nr   ).0cs     r   	<genexpr>&_category_potential.<locals>.<genexpr>   s     <?a!e?   		T)reverse   r   g     F@g      4@g      8@g      $@small_straight     A@g      @g      @large_straightg      H@g      @chancec              3  4   #    U  H  oS :  d  M
  Sv   M     g7f)r   r   Nr   )rW   r<   s     r   rY   rZ      s     2&QEqq&r[   )r   r,   r-   sortedset_longest_consecutive_runsum_upper_target_valuefloatr+   r2   )r+   categoryr)   r   r8   rD   
best_countunique_valuesrun_lendice_sumr7   matchedreroll_countneedbonusshapelow_dices                    r   rB   rB   [   s    F 5TUJ3v;'M&}5G6{HHH$X..1w;&"84"?*"LLL<?z>L?\C%7*%DDD1a*n%'D,=,Cj,PQQ;?z>L?\C%7*%DDD1a*n%'D,=,Cj,PQQ9/S?%<?#q:~&<z&IIETWKWWC*s"222<<6==?<dKu:?uQx1}qQu:?uQx1}*s***u:?uQx1}qQ*s***j3&&&##a<}zC///##a<}zC///82&22XC*!<<<r   c                  ^ ^ [        T 5      mUS;   aR  [        U5      n[        T 5       VVs1 s H  u  p4XB:X  d  M  UiM     nnnU(       a  U$ [        [	        S5      U 4S jS91$ US;   ab  [        TR                  5       S S9u  pg[        T 5       VVs1 s H  u  p4XF:X  d  M  UiM     nnnU(       a  U$ [        [	        S5      U 4S jS91$ US:X  an  [        S	 TR                  5        5       U4S
 jSS9SS n[        T 5       VVs1 s H  u  p4XH;   d  M  UiM     nnnU(       a  U$ [        [	        S5      U 4S jS91$ US;   a  [        [        [        T 5      5      5      n	[        5       n[        5       n
[        T 5       H5  u  p4XI;   d  M  XJ;  d  M  UR                  U5        U
R                  U5        M7     U(       a  U$ [        [	        S5      U 4S jS91$ US:X  aH  [        T 5       VVs1 s H  u  p4US:  d  M  UiM     nnnU(       a  U$ [        [	        S5      U 4S jS91$ [        [	        S5      U 4S jS91$ s  snnf s  snnf s  snnf s  snnf )z4Select which dice to keep while pursuing a category.rJ   r   c                   > TU    $ Nr   r;   r+   s    r   r   '_desired_keep_indices.<locals>.<lambda>   	    fQir   r   )rQ   rR   r   c                    U S   U S   4$ r   r   r   s    r   r   rx      s    d1gtAw=Or   c                   > TU    $ rv   r   rw   s    r   r   rx      ry   r   rT   c              3  :   #    U  H  u  pUS :  d  M  Uv   M     g7frV   r   )rW   rF   counts      r   rY   (_desired_keep_indices.<locals>.<genexpr>   s     C~|uUU~s   	c                   > TU    U 4$ rv   r   )rF   r8   s    r   r   rx      s    ve}e4r   T)r   r\   Nr]   c                   > TU    $ rv   r   rw   s    r   r   rx      ry   r   )r^   r`   c                   > TU    $ rv   r   rw   s    r   r   rx      ry   r   ra   r   c                   > TU    $ rv   r   rw   s    r   r   rx      ry   r   c                   > TU    $ rv   r   rw   s    r   r   rx      s	    q	r   )
r   rg   r.   r,   r0   r-   rc   _best_straight_runrd   add)r+   ri   r7   r;   rF   keeprD   _
top_valuesrunused_valuesr8   s   `          @r   r/   r/      s   FHH$X."+F"3G"3hau"3GtI#eAh4G"H!II99FLLN0OP
"+F"3K"3hau7J"3KtI#eAh4G"H!II<Cv||~C4
 1	

 #,F"3K"3hau7J"3KtI#eAh4G"H!II77 F!45 #!&)HA| 8& * tI#eAh4G"H!II8"+F"3B"3hauz"3BtI#eAh4G"H!IIa1233? H
 L L Cs.   III
$I
	II2IIc               <   SSK Jn  U R                  5       nU Vs0 s H   ofU" U R                  R                  U5      _M"     nn[        U R                  R                  5      nU" US5      n	U	=(       a    U R                  R                  S5      S:H  n
SnSnU R                  5       nU Hp  nXv   n[        U5      nU
(       a  US-  nXc;   aB  [        S	S
U-
  5      n[        S	S
X-   -
  5      nUS	:  a  UUU-
  S-  -  nUS	:  a  US	:X  a  US-  nX:  d  Ml  UnUnMr     Ub  X{   S	:  a  SU 3$ U R                  (       + =(       a    US
:  n/ SQnU(       a  UR                  / SQ5        OUR                  / SQ5        U H  nXe;   d  M
  SU 3s  $    SUS	    3$ s  snf )z&Choose the best category to score now.r   )has_n_of_a_kindr   r   r   NrA   rS   r   ?   g?r_   score_)r   r`   r^   rT   rR   rQ   )rK   rL   rM   ra   rN   rO   rP   )ra   rK   rL   rM   rN   rO   rP   )game_utils.dicer   r&   r$   r+   r   r'   r(   get_upper_totalrh   r,   upper_bonus_awardedextend)r5   r    r!   r"   r   r6   rE   r'   r8   is_five_kindyahtzee_bonus_activerC   best_utilityupper_total_beforescoreutility
before_gap	after_gapupper_bonus_lostwaste_orders                       r   r3   r3      s    3002OGVW?6;;#5#5s;;FW
 **+F"61-L'NFMM,=,=i,HB,NHL//1,  uG"Q%7 78JAr%7%?@AIA~J2c99A~)q.4!"LH% (  01 4z"" "555Q:Lr:QK Z[Z[!C5>!  N1%&''w Xs   'Fc                    SSSSSSS.U    $ )Nr   r]   r   r   r      rJ   r   )ri   s    r   rg   rg     s(      r   c                    U (       d  gSnSn[        S[        U 5      5       H'  nX   XS-
     S-   :X  a  US-  n[        X5      nM%  SnM)     U$ )z&Return longest consecutive run length.r   r   )r0   r2   r,   )r+   bestcurrentr;   s       r   re   re     s[    DG1c&k"91u))qLGt%DG # Kr   c                   U (       d
  [        5       $ U S   nSnU S   nSn[        S[        U 5      5       H)  nX   XS-
     S-   :X  a  US-  nM  XB:  a  UnUnX   nSnM+     XB:  a  UnUn[        [        XU-   5      5      $ )z*Return the longest consecutive run values.r   r   )rd   r0   r2   )rk   
best_startbest_lenstartlengthr;   s         r   r   r   .  s    uq!JH!EF1c-()}U3a77aKF !"
!$EF * 
uZh!6788r   N)r4   z'YahtzeeGame'r5   'YahtzeePlayer'r    Callable[[list[int], str], int]r!   	list[str]r"   r   returnz
str | None)
r+   	list[int]r6   r   r)   intr   boolr   str)
r+   r   ri   r   r)   r   r   r   r   rh   )r+   r   ri   r   r   set[int])
r5   r   r    r   r!   r   r"   r   r   r   )ri   r   r   r   )r+   r   r   r   )rk   r   r   r   )__doc__
__future__r   collections.abcr   typingr   r   r   r4   r	   r
   r?   r*   rB   r/   r3   rg   re   r   r   r   r   <module>r      s     " $   )06
66 5	6
 6  6 6| $) 
 ! 	2 $)EEE E
 !E EP%4PF(F( 5F( 	F(
  F( 	F(R9r   