
    #eq                     D   d Z ddlZddlZddlZdZdZdZdZedz  Zeedz  d	z  edz  d
z  z   z  Z	dZ
dZdZd Zd Zd Z G d de      Z G d dej$                        Z G d de      Z G d de      Z G d de      Zd Zedk(  r e         ej2                          yy)z      turtle-example-suite:

            tdemo_nim.py

Play nim against the computer. The player
who takes the last stick is the winner.

Implements the model-view-controller
design pattern.
    Ni  i                    )?   r	   r   )      r   )r   r   r
   c                  >    t        j                  t        t              S N)randomrandint	MINSTICKS	MAXSTICKS      lib/python3.12/turtledemo/nim.py	randomrowr      s    >>)Y//r   c                     | d   | d   z  | d   z  }|dk(  rt        |       S t        d      D ]  }| |   |z  }|| |   k  s||f}|c S  y )Nr      r      )
randommoverange)statexoredzsmoves        r   computerzugr    !   si    !HuQx%(*Ez%  1X !Hua=q6DK	r   c                     t        |       }	 t        j                  dd      }| |   |dkD  kD  rn#t        j                  |dkD  | |   dz
        }||fS )Nr   r   r   )maxr   r   )r   mr   rands       r   r   r   +   s]    E
A
NN1Q8q1u  >>!a%q!,Dd7Nr   c                   *    e Zd Zd Zd Zd Zd Zd Zy)NimModelc                     || _         y r   )game)selfr(   s     r   __init__zNimModel.__init__6   s	    	r   c                 X   | j                   j                  t        j                  t        j                  fvry t               t               t               g| _        d| _        d | _        | j                   j                  j                          t        j                  | j                   _        y )Nr   )r(   r   NimCREATEDOVERr   sticksplayerwinnerviewsetupRUNNINGr)   s    r   r3   zNimModel.setup9   sg    99??3;;"99 {IK=		++		r   c                    | j                   |   }|| j                   |<   | j                  j                  j                  |||| j                         | j                         rUt        j                  | j                  _        | j                  | _	        | j                  j                  j                          y | j                  dk(  r9d| _        t        | j                         \  }}| j                  ||       d| _        y y )Nr   r   )r/   r(   r2   notify_mover0   	game_overr,   r.   r   r1   notify_overr    r   )r)   rowcol	maxspaltes       r   r   zNimModel.moveB   s    KK$	C		""3YD>>!hhDIIO++DKIINN&&([[ADK"4;;/HCIIc3DK	 r   c                 $    | j                   g dk(  S )N)r   r   r   )r/   r5   s    r   r8   zNimModel.game_overP   s    {{i''r   c                 N    | j                   |   |k  ry | j                  ||       y r   )r/   r   r)   r:   r;   s      r   r7   zNimModel.notify_moveS   s$    ;;ss"		#sr   N)__name__
__module____qualname__r*   r3   r   r8   r7   r   r   r   r&   r&   5   s    &(r   r&   c                       e Zd Zd Zd Zd Zy)Stickc                    t         j                  j                  | d       || _        || _        || _        | j                  ||      \  }}| j                  d       | j                  t        dz  t        dz         | j                  d       | j                          | j                  ||       | j                  d       | j                          y )NFvisiblesquareg      $@g      4@r   white)turtleTurtler*   r:   r;   r(   coordsshape	shapesizeHUNITWUNITspeedpugotocolor
showturtle)r)   r:   r;   r(   xys         r   r*   zStick.__init__Z   s    tU3	{{3$1

8uTz5:.

1			!A

7r   c                     t        |d      \  }}dd|z  z   d|z  z   t        z  }dd|z  z   t        z  }|t        dz  z
  t        dz  z   t        dz  |z
  t        dz  z
  fS )Nr   r   r   r   )divmodrP   rO   SCREENWIDTHSCREENHEIGHT)r)   r:   r;   packet	remainderrV   rW   s          r   rL   zStick.coordsh   sq    "3N	f_q9},5S[E!;!##eqj0,!2Ca2G%ST*2TTTr   c                     | j                   j                  t        j                  k7  ry | j                   j                  j                  | j                  | j                         y r   )r(   r   r,   r4   
controllerr7   r:   r;   )r)   rV   rW   s      r   makemovezStick.makemoven   s;    99??ckk)		((488<r   N)r@   rA   rB   r*   rL   r`   r   r   r   rD   rD   Y   s    U=r   rD   c                   2    e Zd Zd ZddZd Zd Zd Zd Zy)	NimViewc                 ~   || _         |j                  | _        |j                  | _        | j                  j                  d       | j                  j	                  d       | j                  j                  d       t        j                  d      | _        | j                  j                          | j                  j                  d       i | _        t        d      D ]2  }t        t              D ]  }t        |||      | j                  ||f<     4 | j                  d       | j                  j	                  d       y )	Nr
   F)   rd   r
   rF   r   r   z... a moment please ...T)r(   screenmodel	colormodetracerbgcolorrJ   rK   writerrR   rQ   r/   r   r   rD   display)r)   r(   r:   r;   s       r   r*   zNimView.__init__u   s    	kkZZ
c"5!O,mmE2!8 	@CY' @*/S$*?S#J'@	@ 	./4 r   Nc                 (   | j                   j                  d       | j                  j                          |`| j                  j	                  dt
         dz  dz          | j                  j                  d       | j                  j                  |dd       | j                  j	                  dt
         dz  d	z          | j                  j                  d
       | j                  j                  |dd       | j                   j                  d       y )NFr   r   0   redcenter)Courier   bold)alignfont   black)rp      rr   T)re   rh   rj   clearrS   r[   pencolorwrite)r)   msg1msg2s      r   rk   zNimView.display   s    5!KKQ,! 3b 89KK  'KKd(9NOlNa/"45W%$h5JK4 r   c                     | j                   j                  d       t        d      D ]M  }t        | j                  j                  |         D ]&  }| j                  ||f   j                  t               ( O t        d      D ]N  }t        | j                  j                  |   t              D ]"  }| j                  ||f   j                  d       $ P | j                  d       | j                   j                  d       y )NFr   rI   *Your turn! Click leftmost stick to remove.T)	re   rh   r   rf   r/   rT   SCOLORr   rk   r?   s      r   r3   zNimView.setup   s    5!8 	6CTZZ..s34 6S#J'--f56	6 8 	7CTZZ..s3Y? 7S#J'--g67	7 	AB4 r   c                    |dk(  r8t         }t        ||      D ]"  }| j                  ||f   j                  |       $ y | j	                  d       t        j                  d       | j	                  d       t        }t        |dz
  |dz
  d      D ]7  }t        j                  d       | j                  ||f   j                  |       9 | j	                  d       y )	Nr   z ... thinking ...         g      ?z ... thinking ... aaah ...r   g?r~   )HCOLORr   r/   rT   rk   timesleepCOLOR)r)   r:   r;   r<   r0   farber   s          r   r7   zNimView.notify_move   s    Q;E3	* 3S!H%++E23 LL56JJsOLL56E9Q;Ar2 3

3S!H%++E23 LLEFr   c                 x    | j                   j                  j                  dk(  rd}nd}| j                  d|       y )Nr   zCongrats. You're the winner!!!z"Sorry, the computer is the winner.z2To play again press space bar. To leave press ESC.)r(   rf   r1   rk   )r)   r|   s     r   r9   zNimView.notify_over   s1    99??!!Q&3D7DI4Pr   c                     | j                   j                  t        j                  k(  r| j                  j                          y y r   )r(   r   r,   r.   re   rx   r5   s    r   rx   zNimView.clear   s+    99??chh&KK 'r   r   )	r@   rA   rB   r*   rk   r3   r7   r9   rx   r   r   r   rb   rb   t   s"    !"
!	!GQ r   rb   c                       e Zd Zd Zd Zy)NimControllerc                 l   || _         |j                  j                  | _        d| _        | j                  j	                         D ]  }|j                  |j                          | j                   j                  j                  | j                   j                  j                  d       | j                   j                  j                  | j                   j                  j                  d       | j                   j                  j                  d       | j                   j                  j                          y )NFspaceEscapezPress space bar to start game)r(   r2   r/   BUSYvaluesonclickr`   re   onkeyrf   r3   rx   rk   listen)r)   r(   sticks      r   r*   zNimController.__init__   s    	ii&&	[['') 	*EMM%..)	*		tyy44g>		tyy~~33X>		>?		!r   c                     | j                   ry d| _         | j                  j                  j                  ||       d| _         y )NTF)r   r(   rf   r7   r?   s      r   r7   zNimController.notify_move   s2    99			##C-	r   N)r@   rA   rB   r*   r7   r   r   r   r   r      s    	"r   r   c                       e Zd ZdZdZdZd Zy)r,   r   r   r   c                     t         j                  | _        || _        t	        |       | _        t        |       | _        t        |       | _	        y r   )
r,   r-   r   re   r&   rf   rb   r2   r   r_   )r)   re   s     r   r*   zNim.__init__   s6    [[
d^
DM	'-r   N)r@   rA   rB   r-   r4   r.   r*   r   r   r   r,   r,      s    GGD.r   r,   c                      t        j                         } | j                  d       | j                  t        t
               t        |       }y)Nstandard	EVENTLOOP)rJ   Screenmoder3   rZ   r[   r,   )
mainscreennims     r   mainr      s5    JOOJ[,/
j/Cr   __main__)__doc__rJ   r   r   rZ   r[   r   r   rO   rP   r   r   r   r   r    r   objectr&   rK   rD   rb   r   r,   r   r@   mainloopr   r   r   <module>r      s   	   		a2-Q!0CCD		0!v !H=FMM =6A f A HF *	.& 	. zFFOO r   