
    Ii                         S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	J
r
JrJrJr  S\
S	\S
\S\4S jrS\S\S\4S jrS\S\\   4S jrS\
S\
S	\S\4S jrS\
S\S\\   S\S\S-  4
S jrg)zBot policy helpers for Sorry.    )deepcopy   )	SorryMove)
apply_move)SorryRulesProfile)SAFETY_LENGTHSorryGameStateSorryPlayerStateTRACK_LENGTHclockwise_distancestate	player_idtarget_trackreturnc                 v   SnU R                   R                  5        H  u  pEXA:X  a  M  UR                   H|  nUR                  S:w  d  UR                  c  M"  [        UR                  U5      n[        X&R                  5      nSUs=::  a  S::  a
  O  OUS-  nMd  SUs=::  a  S::  d  Ms  O  Mw  US-  nM~     M     U$ )Nr   trackr         )player_statesitemspawnszonetrack_positionr   )	r   r   r   threatsopponent_idopponent_statepawnforwardbackwards	            5c:\Users\dbart\PlayPalace11\server\games\sorry\bot.py_track_threat_countr!      s    
 G',':':'@'@'B##"((DyyG#t':':'B()<)<lKG),8K8KLHG!r!1h#!##1 ) (C N    player_state
pawn_indexc                    US:  d  U[        U R                  5      :  a  gU R                  US-
     nUR                  S:X  a  gUR                  S:X  a1  UR                  c  gS[	        U R
                  UR                  5      -   $ UR                  S:X  a  [        [        SUR                  5      -   $ UR                  S:X  a  [        [        -   S-   $ g)Nr   r   startr   	home_pathhome)
lenr   r   r   r   start_trackr   max
home_stepsr   )r#   r$   r   s      r    _pawn_progressr-   &   s    A~c,*<*<&==j1n-DyyGyyG&%l&>&>@S@STTTyyKc!T__555yyFm+a//r"   movec                     / nU R                   b  UR                  U R                   5        U R                  b  UR                  U R                  5        U$ N)r$   appendsecondary_pawn_index)r.   indexess     r    _moved_pawn_indexesr4   7   sD    G"t'  ,t001Nr"   beforeafterc                 J   SnSnU R                   R                  5        H+  u  pVXR:X  a  M  U[        S UR                   5       5      -  nM-     UR                   R                  5        H+  u  pVXR:X  a  M  U[        S UR                   5       5      -  nM-     [	        SXC-
  5      $ )Nr   c              3   H   #    U  H  oR                   S :X  d  M  Sv   M     g7fr&   r   Nr   .0r   s     r    	<genexpr>!_capture_count.<locals>.<genexpr>F   s     W*>$))wBVAA*>   "	"c              3   H   #    U  H  oR                   S :X  d  M  Sv   M     g7fr9   r:   r;   s     r    r=   r>   J   s     V)=gAU11)=r?   )r   r   sumr   r+   )r5   r6   r   before_startafter_startr   r   s          r    _capture_countrD   @   s    LK'-';';'A'A'C##W.*>*>WWW (D (-':':'@'@'B##sV)=)=VVV (C q+,--r"   movesrulesNc                    ^^ U(       d  gSnSnU GH  n[        U 5      nUR                  R                  TR                  5      mTc  M9  [	        U5      n[        U4S jU 5       5      n	[        S TR                   5       5      n
 [        UTXc5        [        U4S jU 5       5      n[        S TR                   5       5      n[        [        S TR                   5       5      5      n[        [        XTR                  5      S:  5      n[        X:  5      nSnSnU H~  nUS:  d  U[        TR                  5      :  a  M$  TR                  US-
     nUR                  S	:X  a3  UR                  b&  U[        UTR                  UR                  5      -  nMy  US
-  nM     UU-
  nX-
  nUUUUU4nUb  UU:  a  UnUnGM  UU:X  d  GM  Uc  GM  UR                   UR                   :  d  GM  UnGM     Uc  US   $ U$ ! [         a     GM  f = f)zChoose a move using deterministic classic heuristics.

Priority:
1) winning move
2) capture move
3) leave start
4) safer advancement
5) max progress gain
Nc              3   <   >#    U  H  n[        TU5      v   M     g 7fr0   r-   )r<   idxr#   s     r    r=   choose_move.<locals>.<genexpr>j   s     Y=Cn\3??=   c              3   H   #    U  H  oR                   S :X  d  M  Sv   M     g7fr9   r:   r;   s     r    r=   rK   k   s     X-?T99PWCWqq-?r?   c              3   <   >#    U  H  n[        TU5      v   M     g 7fr0   rI   )r<   rJ   
sim_players     r    r=   rK   r   s     V^J<<rL   c              3   H   #    U  H  oR                   S :X  d  M  Sv   M     g7fr9   r:   r;   s     r    r=   rK   s   s     U,<D		W@Taa,<r?   c              3   >   #    U  H  oR                   S :H  v   M     g7f)r(   Nr:   r;   s     r    r=   rK   u   s     P?OtyyF2?Os   r   r   r      )r   r   getr   r4   rA   r   r   
ValueErrorintallrD   r)   r   r   r!   	action_id)r   r#   rE   rF   	best_move
best_scorer.   	sim_statemoved_indexesprogress_beforeown_start_beforeprogress_afterown_start_afterwinning_flagcapture_flagleave_start_flagthreat_countsafety_bonusrJ   r   
safe_scoreprogress_gainscorerO   s    `                     @r    choose_moverh   N   s%    "&I8<JUO	,,001G1GH
+D1Y=YYX\-?-?XX	y*d: VVVUJ,<,<UU3Pz?O?OPPQ>%L<R<RSVWWXAB CQw#J$4$4 55##C!G,DyyG#(;(;(G 3 **''!  ! ! "L0
&8 
 !3JIJ9#8~~	 3 33 	k n Qx[  		s   G>>
HH)__doc__copyr   rE   r   r   rF   r   r   r   r	   r
   r   r   strrU   r!   r-   listr4   rD   rh    r"   r    <module>rn      s    #    $   		*!1 s s "i DI .> .. .S .UX .NN"N 	?N 	N
 Nr"   