o
    JAfq  ã                   @   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rteƒ  e ¡  dS 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.10/turtledemo/nim.pyÚ	randomrow   s   r   c                 C   sb   | d | d A | d A }|dkrt | ƒS tdƒD ]}| | |A }|| | kr.||f}|  S qd S )Nr   é   r   é   )Ú
randommoveÚrange)ÚstateZxoredÚzÚsÚmover   r   r   Úcomputerzug!   s   þþr   c                 C   sJ   t | ƒ}	 t dd¡}| | |dkkrnqt |dk| | d ¡}||fS )NTr   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¡ |  ¡ r*tj| j_| j| _	| jj 
¡  d S | jdkrDd| _t| j ƒ\}}|  ||¡ d| _d S 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< q<q6|  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r*| 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 ]}t| jj| tƒD ]}| j||f  d¡ q1q&|  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rt }t||ƒD ]}| j||f  |¡ qd S |  d¡ t d¡ |  d¡ t}t|d |d dƒD ]}t d¡ | j||f  |¡ q5|  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 d S r   )r   r   r"   r$   rM   rY   r+   r   r   r   rY   ³   s   ÿzNimView.clearr   )	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>   s4    

$Dþ