U
    ßúeq  ã                   @   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.8/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k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 dddgkS 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    r0   r1   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!   r0   r1   r   ÚcoordsÚshapeZ	shapesizeÚHUNITÚWUNITÚspeedÚpuÚgotoÚcolorZ
showturtle)r    r0   r1   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    r0   r1   ZpacketZ	remainderrD   rE   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-   r0   r1   )r    rD   rE   r   r   r   Úmakemoven   s    zStick.makemoveN)r4   r5   r6   r!   r<   rJ   r   r   r   r   r7   Y   s   r7   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	   r8   r   r   z... a moment please ...T)r   ÚscreenÚmodelZ	colormodeÚtracerZbgcolorr:   r;   ÚwriterrA   r@   r&   r   r   r7   Údisplay)r    r   r0   r1   r   r   r   r!   u   s    

zNimView.__init__Nc                 C   sš   | j  d¡ | j ¡  |d k	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   ÚclearrB   rH   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   r9   ú*Your turn! Click leftmost stick to remove.T)	rM   rO   r   rN   r&   rC   ÚSCOLORr   rQ   r3   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&   rC   rQ   ÚtimeÚsleepÚCOLOR)r    r0   r1   r2   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)	r4   r5   r6   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 )NFZspaceZEscapezPress space bar to start game)r   r)   r&   ÚBUSYÚvaluesZonclickrJ   rM   ZonkeyrN   r*   rY   rQ   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)rd   r   rN   r-   r3   r   r   r   r-   Å   s
    zNimController.notify_moveN)r4   r5   r6   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)r4   r5   r6   r$   r+   r%   r!   r   r   r   r   r#   Í   s   r#   c                  C   s*   t  ¡ } |  d¡ |  tt¡ t| ƒ}dS )NZstandardZ	EVENTLOOP)r:   ZScreenÚmoder*   rG   rH   r#   )Z
mainscreenZnimr   r   r   ÚmainÙ   s
    
rg   Ú__main__)Ú__doc__r:   r   r`   rG   rH   r   r   r>   r?   r]   r_   rb   r   r   r   Úobjectr   r;   r7   rK   rc   r#   rg   r4   Zmainloopr   r   r   r   Ú<module>   s0   

$D