o
    ǋ|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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      /home/conda/feedstock_root/build_artifacts/python-split_1669104742391/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehol/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