B
    ^ Çcq  ã               @   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.7/turtledemo/nim.pyÚ	randomrow   s    r   c             C   sb   | d | d A | d A }|dkr(t | ƒS x4tdƒD ](}| | |A }|| | kr2||f}|S q2W d S )Nr   é   r   é   )Ú
randommoveÚrange)ÚstateZxoredÚzÚsÚmover   r   r   Úcomputerzug!   s    r   c             C   sL   t | ƒ}x"t dd¡}| | |dkkr
P q
W 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 )N)Úgame)Úselfr   r   r   r   Ú__init__6   s    zNimModel.__init__c             C   sP   | j jtjtjg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 )Nr   )r$   )r   r   r   r   r+   P   s    zNimModel.game_overc             C   s"   | j | |krd S |  ||¡ d S )N)r$   r   )r   r-   r.   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)ÚvisibleZsquareg      $@g      4@r   Úwhite)ÚturtleÚTurtler    r-   r.   r   ÚcoordsÚshapeZ	shapesizeÚHUNITÚWUNITÚspeedÚpuÚgotoÚcolorZ
showturtle)r   r-   r.   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-   r.   ZpacketZ	remainderr@   rA   r   r   r   r8   h   s    zStick.coordsc             C   s*   | j jtjkrd S | j j | j| j¡ d S )N)r   r   r!   r)   Ú
controllerr*   r-   r.   )r   r@   rA   r   r   r   Úmakemoven   s    zStick.makemoveN)r0   r1   r2   r    r8   rF   r   r   r   r   r3   Y   s   r3   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 | _x8tdƒD ],}x&ttƒD ]}t|||ƒ| j||f< q|W qnW |  d¡ | j d¡ d S )	Nr	   F)éð   rH   r	   )r4   r   r   z... a moment please ...T)r   ÚscreenÚmodelZ	colormodeÚtracerZbgcolorr6   r7   Úwriterr=   r<   r$   r   r   r3   Údisplay)r   r   r-   r.   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)rP   é   rR   T)rI   rK   rL   Úclearr>   rD   ZpencolorÚwrite)r   Zmsg1Úmsg2r   r   r   rM   †   s    
zNimView.displayc             C   s¨   | j  d¡ x>tdƒD ]2}x,t| jj| ƒD ]}| j||f  t¡ q,W qW x@tdƒD ]4}x.t| jj| tƒD ]}| j||f  d¡ qnW qVW |  d¡ | j  d¡ d S )NFr   r5   z*Your turn! Click leftmost stick to remove.T)	rI   rK   r   rJ   r$   r?   ÚSCOLORr   rM   )r   r-   r.   r   r   r   r(   ’   s    
zNimView.setupc             C   s¢   |dkr6t }xt||ƒD ]}| j||f  |¡ qW nh|  d¡ t d¡ |  d¡ t}x:t|d |d dƒD ]"}t d¡ | j||f  |¡ qnW |  d¡ d S )	Nr   z ... thinking ...         g      à?z ... thinking ... aaah ...r   éÿÿÿÿgš™™™™™É?z*Your turn! Click leftmost stick to remove.)ÚHCOLORr   r$   r?   rM   ÚtimeZsleepÚCOLOR)r   r-   r.   r/   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   rJ   r&   rM   )r   rW   r   r   r   r,   ¬   s    zNimView.notify_overc             C   s   | j jtjkr| j ¡  d S )N)r   r   r!   r#   rI   rU   )r   r   r   r   rU   ³   s    zNimView.clear)N)	r0   r1   r2   r    rM   r(   r*   r,   rU   r   r   r   r   rG   t   s   
rG   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚNimControllerc             C   s€   || _ |jj| _d| _x| j ¡ D ]}| |j¡ q"W | 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onclickrF   rI   ZonkeyrJ   r(   rU   rM   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)r^   r   rJ   r*   )r   r-   r.   r   r   r   r*   Å   s
    zNimController.notify_moveN)r0   r1   r2   r    r*   r   r   r   r   r]   ¸   s   r]   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 )N)
r!   r"   r   rI   r   rJ   rG   r'   r]   rE   )r   rI   r   r   r   r    Ñ   s
    

zNim.__init__N)r0   r1   r2   r"   r)   r#   r    r   r   r   r   r!   Í   s   r!   c              C   s*   t  ¡ } |  d¡ |  tt¡ t| ƒ}dS )NZstandardZ	EVENTLOOP)r6   ZScreenÚmoder(   rC   rD   r!   )Z
mainscreenZnimr   r   r   ÚmainÙ   s
    
ra   Ú__main__)Ú__doc__r6   r   r[   rC   rD   r   r   r:   r;   rX   rZ   r\   r   r   r   Úobjectr   r7   r3   rG   r]   r!   ra   r0   Zmainloopr   r   r   r   Ú<module>
   s0   

$D