a
    åIþfq  ã                   @   sè   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eed d	 ed d
   Z	dZ
dZdZdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zed kräeƒ  e ¡  dS )!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                   C   s   t  tt¡S ©N)ÚrandomÚrandintÚ	MINSTICKSÚ	MAXSTICKS© r   r   úlib/python3.9/turtledemo/nim.pyÚ	randomrow   s    r   c                 C   sb   | d | d A | d A }|dkr(t | ƒS tdƒD ],}| | |A }|| | kr0||f}|  S q0d S )Nr   é   r   é   )Ú
randommoveÚrange)ÚstateZxoredÚzÚsÚmover   r   r   Úcomputerzug!   s    r   c                 C   sH   t | ƒ}t dd¡}| | |dkkrq(qt |dk| | d ¡}||fS )Nr   r   r   )Úmaxr   r   )r   Úmr   Zrandr   r   r   r   +   s    r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚNimModelc                 C   s
   || _ d S r   )Úgame)Úselfr   r   r   r   Ú__init__6   s    zNimModel.__init__c                 C   sP   | j jtjtjfvrd S tƒ tƒ tƒ g| _d| _d | _| j j	 
¡  tj| j _d S )Nr   )r   r   ÚNimÚCREATEDÚOVERr   ÚsticksÚplayerÚwinnerÚviewÚsetupÚRUNNING©r    r   r   r   r)   9   s    zNimModel.setupc                 C   s†   | j | }|| j |< | jj |||| j¡ |  ¡ rRtj| j_| j| _	| jj 
¡  n0| jdkr‚d| _t| j ƒ\}}|  ||¡ d| _d S )Nr   r   )r%   r   r(   Únotify_mover&   Ú	game_overr"   r$   r   r'   Únotify_overr   r   )r    ÚrowÚcolÚ	maxspalter   r   r   r   B   s    



zNimModel.movec                 C   s   | j g d¢kS )N)r   r   r   )r%   r+   r   r   r   r-   P   s    zNimModel.game_overc                 C   s"   | j | |krd S |  ||¡ d S r   )r%   r   ©r    r/   r0   r   r   r   r,   S   s    zNimModel.notify_moveN)Ú__name__Ú
__module__Ú__qualname__r!   r)   r   r-   r,   r   r   r   r   r   5   s
   	r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStickc                 C   s„   t jj| dd || _|| _|| _|  ||¡\}}|  d¡ |  t	d t
d ¡ |  d¡ |  ¡  |  ||¡ |  d¡ |  ¡  d S )NF©ZvisibleZsquareg      $@g      4@r   Úwhite)ÚturtleÚTurtler!   r/   r0   r   ÚcoordsÚshapeZ	shapesizeÚHUNITÚWUNITÚspeedÚpuÚgotoÚcolorZ
showturtle)r    r/   r0   r   ÚxÚyr   r   r   r!   Z   s    


zStick.__init__c                 C   s^   t |dƒ\}}dd|  d|  t }dd|  t }|td  td  td | td  fS )Nr   r   r   r   )Údivmodr>   r=   ÚSCREENWIDTHÚSCREENHEIGHT)r    r/   r0   ZpacketZ	remainderrC   rD   r   r   r   r;   h   s    zStick.coordsc                 C   s*   | j jtjkrd S | j j | j| j¡ d S r   )r   r   r"   r*   Ú
controllerr,   r/   r0   )r    rC   rD   r   r   r   Úmakemoven   s    zStick.makemoveN)r3   r4   r5   r!   r;   rI   r   r   r   r   r6   Y   s   r6   c                   @   s>   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚNimViewc                 C   s°   || _ |j| _|j| _| j d¡ | j d¡ | j d¡ tjdd| _| j 	¡  | j 
d¡ i | _tdƒD ](}ttƒD ]}t|||ƒ| j||f< qxql|  d¡ | j d¡ d S )	Nr	   F)éð   rK   r	   r7   r   r   z... a moment please ...T)r   ÚscreenÚmodelZ	colormodeÚtracerZbgcolorr9   r:   Úwriterr@   r?   r%   r   r   r6   Údisplay)r    r   r/   r0   r   r   r   r!   u   s    

zNimView.__init__Nc                 C   sš   | j  d¡ | j ¡  |d urT| j dt d d ¡ | j d¡ | jj|ddd | j dt d d	 ¡ | j d
¡ | jj|ddd | j  d¡ d S )NFr   r   é0   ZredÚcenter)ÚCourieré   Úbold)ZalignZfonté   Zblack)rS   é   rU   T)rL   rN   rO   ÚclearrA   rG   ZpencolorÚwrite)r    Zmsg1Úmsg2r   r   r   rP   †   s    
zNimView.displayc                 C   s˜   | j  d¡ tdƒD ].}t| jj| ƒD ]}| j||f  t¡ q(qtdƒD ]0}t| jj| tƒD ]}| j||f  d¡ qbqL|  d¡ | j  d¡ d S )NFr   r8   ú*Your turn! Click leftmost stick to remove.T)	rL   rN   r   rM   r%   rB   ÚSCOLORr   rP   r2   r   r   r   r)   ’   s    
zNimView.setupc                 C   sš   |dkr2t }t||ƒD ]}| j||f  |¡ qnd|  d¡ t d¡ |  d¡ t}t|d |d dƒD ]"}t d¡ | j||f  |¡ qh|  d¡ d S )	Nr   z ... thinking ...         g      à?z ... thinking ... aaah ...r   éÿÿÿÿgš™™™™™É?r[   )ÚHCOLORr   r%   rB   rP   ÚtimeÚsleepÚCOLOR)r    r/   r0   r1   r&   Zfarber   r   r   r   r,      s    



zNimView.notify_movec                 C   s(   | j jjdkrd}nd}|  d|¡ d S )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   rM   r'   rP   )r    rZ   r   r   r   r.   ¬   s    zNimView.notify_overc                 C   s   | j jtjkr| j ¡  d S r   )r   r   r"   r$   rL   rX   r+   r   r   r   rX   ³   s    zNimView.clear)N)	r3   r4   r5   r!   rP   r)   r,   r.   rX   r   r   r   r   rJ   t   s   
rJ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚNimControllerc                 C   s|   || _ |jj| _d| _| j ¡ D ]}| |j¡ q | j j | j j	j
d¡ | j j | j jjd¡ | j j d¡ | j j ¡  d S )NFZspaceZEscapezPress space bar to start game)r   r(   r%   ÚBUSYÚvaluesZonclickrI   rL   ZonkeyrM   r)   rX   rP   Zlisten)r    r   Zstickr   r   r   r!   º   s    
zNimController.__init__c                 C   s*   | j r
d S d| _ | jj ||¡ d| _ d S )NTF)rc   r   rM   r,   r2   r   r   r   r,   Å   s
    zNimController.notify_moveN)r3   r4   r5   r!   r,   r   r   r   r   rb   ¸   s   rb   c                   @   s    e Zd ZdZdZdZdd„ ZdS )r"   r   r   r   c                 C   s0   t j| _|| _t| ƒ| _t| ƒ| _t| ƒ| _	d S r   )
r"   r#   r   rL   r   rM   rJ   r(   rb   rH   )r    rL   r   r   r   r!   Ñ   s
    

zNim.__init__N)r3   r4   r5   r#   r*   r$   r!   r   r   r   r   r"   Í   s   r"   c                  C   s*   t  ¡ } |  d¡ |  tt¡ t| ƒ}dS )NZstandardZ	EVENTLOOP)r9   ZScreenÚmoder)   rF   rG   r"   )Z
mainscreenZnimr   r   r   ÚmainÙ   s
    
rf   Ú__main__)Ú__doc__r9   r   r_   rF   rG   r   r   r=   r>   r\   r^   ra   r   r   r   Úobjectr   r:   r6   rJ   rb   r"   rf   r3   Zmainloopr   r   r   r   Ú<module>   s0   

$D