a
    åzeq  ã                   @   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   ú$/usr/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packetÚ	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;   rJ   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)éð   rL   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)rT   é   rV   T)rM   rO   rP   ÚclearrA   rG   ZpencolorÚwrite)r    Zmsg1Úmsg2r   r   r   rQ   †   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)	rM   rO   r   rN   r%   rB   ÚSCOLORr   rQ   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   rQ   Ú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   rN   r'   rQ   )r    r[   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$   rM   rY   r+   r   r   r   rY   ³   s    zNimView.clear)N)	r3   r4   r5   r!   rQ   r)   r,   r.   rY   r   r   r   r   rK   t   s   
rK   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 )NFÚspaceZEscapezPress space bar to start game)r   r(   r%   ÚBUSYÚvaluesZonclickrJ   rM   ZonkeyrN   r)   rY   rQ   Ú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)re   r   rN   r,   r2   r   r   r   r,   Å   s
    zNimController.notify_moveN)r3   r4   r5   r!   r,   r   r   r   r   rc   ¸   s   rc   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   rM   r   rN   rK   r(   rc   rI   )r    rM   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
    
ri   Ú__main__)Ú__doc__r9   r   r`   rF   rG   r   r   r=   r>   r]   r_   rb   r   r   r   Úobjectr   r:   r6   rK   rc   r"   ri   r3   Zmainloopr   r   r   r   Ú<module>   s0   

$D