Ë
    #´˜jq  ã                   óD  — 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  Zeedz  d	z  edz  d
z  z   z  Z	dZ
dZdZd„ Zd„ Zd„ Z G d„ de«      Z G d„ dej$                  «      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zd„ Zedk(  r e«         ej2                  «        yy)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                  ó>   — t        j                  t        t        «      S ©N)ÚrandomÚrandintÚ	MINSTICKSÚ	MAXSTICKS© ó    ú lib/python3.12/turtledemo/nim.pyÚ	randomrowr      s   € Ü�>‰>œ)¤YÓ/Ð/r   c                 ó–   — | d   | d   z  | d   z  }|dk(  rt        | «      S t        d«      D ]  }| |   |z  }|| |   k  sŒ||f}|c S  y )Nr   é   r   é   )Ú
randommoveÚrange)ÚstateÚxoredÚzÚsÚmoves        r   Úcomputerzugr    !   sd   € Ø�!‰H�u˜Q‘xÑ %¨¡(Ñ*€EØ�‚zÜ˜%Ó Ð Ü�1ŽXˆØ�!‰H�uÑˆØ��a‘‹=Ø�q�6ˆDØŠKñ	 r   c                 ó¦   — t        | «      }	 t        j                  dd«      }| |   |dkD  kD  rnŒ#t        j                  |dkD  | |   dz
  «      }||fS )Nr   r   r   )Úmaxr   r   )r   Úmr   Úrands       r   r   r   +   s]   € ÜˆE‹
€AØ
Ü�N‰N˜1˜QÓˆØ�‰8�q˜1‘uÒØð ô �>‰>˜!˜a™%  q¡¨!¡Ó,€DØˆdˆ7€Nr   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚNimModelc                 ó   — || _         y r   )Úgame)Úselfr(   s     r   Ú__init__zNimModel.__init__6   s	   € Øˆ�	r   c                 óX  — | j                   j                  t        j                  t        j                  fvry t        «       t        «       t        «       g| _        d| _        d | _        | j                   j                  j                  «        t        j                  | j                   _        y )Nr   )r(   r   ÚNimÚCREATEDÚOVERr   ÚsticksÚplayerÚwinnerÚviewÚsetupÚRUNNING©r)   s    r   r3   zNimModel.setup9   sg   € Ø�9‰9�?‰?¤3§;¡;´·±Ð"9Ñ9ØÜ “{¤I£K´³Ð=ˆŒØˆŒØˆŒØ�	‰	�‰×ÑÔÜŸ+™+ˆ�	‰	�r   c                 óþ  — | j                   |   }|| j                   |<   | j                  j                  j                  |||| j                  «       | j                  «       rUt        j                  | j                  _        | j                  | _	        | j                  j                  j                  «        y | j                  dk(  r9d| _        t        | j                   «      \  }}| j                  ||«       d| _        y y )Nr   r   )r/   r(   r2   Únotify_mover0   Ú	game_overr,   r.   r   r1   Únotify_overr    r   )r)   ÚrowÚcolÚ	maxspaltes       r   r   zNimModel.moveB   sµ   € Ø—K‘K Ñ$ˆ	Øˆ�‰�CÑØ�	‰	�‰×"Ñ" 3¨¨Y¸¿¹ÔDØ�>‰>ÔÜ!Ÿh™hˆD�I‰IŒOØŸ+™+ˆDŒKØ�I‰I�N‰N×&Ñ&Õ(Ø�[‰[˜AÒØˆDŒKÜ" 4§;¡;Ó/‰HˆC�Ø�I‰I�c˜3ÔØˆD�Kð	 r   c                 ó$   — | j                   g d¢k(  S )N)r   r   r   )r/   r5   s    r   r8   zNimModel.game_overP   s   € Ø�{‰{šiÑ'Ð'r   c                 óN   — | j                   |   |k  ry | j                  ||«       y r   )r/   r   ©r)   r:   r;   s      r   r7   zNimModel.notify_moveS   s$   € Ø�;‰;�sÑ˜sÒ"ØØ�	‰	�#�sÕr   N)Ú__name__Ú
__module__Ú__qualname__r*   r3   r   r8   r7   r   r   r   r&   r&   5   s   „ òò&òò(ór   r&   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚStickc                 ó¤  — t         j                  j                  | d¬«       || _        || _        || _        | j                  ||«      \  }}| j                  d«       | j                  t        dz  t        dz  «       | j                  d«       | j                  «        | j                  ||«       | j                  d«       | j                  «        y )NF©ÚvisibleÚsquareg      $@g      4@r   Úwhite)ÚturtleÚTurtler*   r:   r;   r(   ÚcoordsÚshapeÚ	shapesizeÚHUNITÚWUNITÚspeedÚpuÚgotoÚcolorÚ
showturtle)r)   r:   r;   r(   ÚxÚys         r   r*   zStick.__init__Z   s›   € Ü�‰×Ñ˜t¨UÐÔ3ØˆŒØˆŒØˆŒ	Ø�{‰{˜3 Ó$‰ˆˆ1Ø�
‰
�8ÔØ�‰”u˜T‘z¤5¨¡:Ô.Ø�
‰
�1ŒØ�‰Œ	Ø�	‰	�!�AŒØ�
‰
�7ÔØ�‰Õr   c                 óÀ   — t        |d«      \  }}dd|z  z   d|z  z   t        z  }dd|z  z   t        z  }|t        dz  z
  t        dz  z   t        dz  |z
  t        dz  z
  fS )Nr   r   r   r   )ÚdivmodrP   rO   ÚSCREENWIDTHÚSCREENHEIGHT)r)   r:   r;   ÚpacketÚ	remainderrV   rW   s          r   rL   zStick.coordsh   sq   € Ü" 3¨›NÑˆ�	Ø��f‘‰_˜q 9™}Ñ,´Ñ5ˆØ��S‘‰[œEÑ!ˆØ”; !Ñ#Ñ#¤e¨q¡jÑ0´,À!Ñ2CÀaÑ2GÌ%ÐSTÉ*Ñ2TÐTÐTr   c                 óÈ   — | j                   j                  t        j                  k7  ry | j                   j                  j                  | j                  | j                  «       y r   )r(   r   r,   r4   Ú
controllerr7   r:   r;   )r)   rV   rW   s      r   ÚmakemovezStick.makemoven   s;   € Ø�9‰9�?‰?œcŸk™kÒ)ØØ�	‰	×Ñ×(Ñ(¨¯©°4·8±8Õ<r   N)r@   rA   rB   r*   rL   r`   r   r   r   rD   rD   Y   s   „ òòUó=r   rD   c                   ó2   — e Zd Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zy)	ÚNimViewc                 ó~  — || _         |j                  | _        |j                  | _        | j                  j                  d«       | j                  j	                  d«       | j                  j                  d«       t        j                  d¬«      | _        | j                  j                  «        | j                  j                  d«       i | _        t        d«      D ]2  }t        t        «      D ]  }t        |||«      | j                  ||f<   Œ  Œ4 | j                  d«       | j                  j	                  d«       y )	Nr
   F)éð   rd   r
   rF   r   r   z... a moment please ...T)r(   ÚscreenÚmodelÚ	colormodeÚtracerÚbgcolorrJ   rK   ÚwriterrR   rQ   r/   r   r   rD   Údisplay)r)   r(   r:   r;   s       r   r*   zNimView.__init__u   så   € ØˆŒ	Ø—k‘kˆŒØ—Z‘ZˆŒ
Ø�‰×Ñ˜cÔ"Ø�‰×Ñ˜5Ô!Ø�‰×Ñ˜OÔ,Ü—m‘m¨EÔ2ˆŒØ�‰�‰ÔØ�‰×Ñ˜!ÔØˆŒÜ˜–8ˆCÜœYÖ'�Ü*/°°S¸$Ó*?�—‘˜S #˜JÒ'ñ (ð ð 	�‰Ð.Ô/Ø�‰×Ñ˜4Õ r   Nc                 ó(  — | j                   j                  d«       | j                  j                  «        |�`| j                  j	                  dt
         dz  dz   «       | j                  j                  d«       | j                  j                  |dd¬«       | j                  j	                  dt
         dz  d	z   «       | j                  j                  d
«       | j                  j                  |dd¬«       | j                   j                  d«       y )NFr   r   é0   ÚredÚcenter)ÚCourieré   Úbold)ÚalignÚfonté   Úblack)rp   é   rr   T)re   rh   rj   ÚclearrS   r[   ÚpencolorÚwrite)r)   Úmsg1Úmsg2s      r   rk   zNimView.display†   sÔ   € Ø�‰×Ñ˜5Ô!Ø�‰×ÑÔØÐØ�K‰K×Ñ˜Q¤, °!Ñ 3°bÑ 8Ô9Ø�K‰K× Ñ  Ô'Ø�K‰K×Ñ˜d¨(Ð9NÐÔOØ�‰×Ñ˜œl˜N¨aÑ/°"Ñ4Ô5Ø�‰×Ñ˜WÔ%Ø�‰×Ñ˜$ hÐ5JÐÔKØ�‰×Ñ˜4Õ r   c                 ó   — | j                   j                  d«       t        d«      D ]M  }t        | j                  j                  |   «      D ]&  }| j                  ||f   j                  t        «       Œ( ŒO t        d«      D ]N  }t        | j                  j                  |   t        «      D ]"  }| j                  ||f   j                  d«       Œ$ ŒP | j                  d«       | j                   j                  d«       y )NFr   rI   ú*Your turn! Click leftmost stick to remove.T)	re   rh   r   rf   r/   rT   ÚSCOLORr   rk   r?   s      r   r3   zNimView.setup’   sÈ   € Ø�‰×Ñ˜5Ô!Ü˜–8ˆCÜ˜TŸZ™Z×.Ñ.¨sÑ3Ö4�Ø—‘˜S #˜JÑ'×-Ñ-¬fÕ5ñ 5ð ô ˜–8ˆCÜ˜TŸZ™Z×.Ñ.¨sÑ3´YÖ?�Ø—‘˜S #˜JÑ'×-Ñ-¨gÕ6ñ @ð ð 	�‰ÐAÔBØ�‰×Ñ˜4Õ r   c                 ó´  — |dk(  r8t         }t        ||«      D ]"  }| j                  ||f   j                  |«       Œ$ y | j	                  d«       t        j                  d«       | j	                  d«       t        }t        |dz
  |dz
  d«      D ]7  }t        j                  d«       | j                  ||f   j                  |«       Œ9 | j	                  d«       y )	Nr   z ... thinking ...         g      à?z ... thinking ... aaah ...r   éÿÿÿÿgš™™™™™É?r~   )ÚHCOLORr   r/   rT   rk   ÚtimeÚsleepÚCOLOR)r)   r:   r;   r<   r0   Úfarber   s          r   r7   zNimView.notify_move�   s¶   € Ø�QŠ;ÜˆEÜ˜3 	Ö*�Ø—‘˜S !˜HÑ%×+Ñ+¨EÕ2ñ +ð �L‰LÐ5Ô6Ü�J‰J�sŒOØ�L‰LÐ5Ô6ÜˆEÜ˜9 Q™;¨¨A©¨rÖ2�Ü—
‘
˜3”Ø—‘˜S !˜HÑ%×+Ñ+¨EÕ2ð 3ð �L‰LÐEÕFr   c                 óx   — | j                   j                  j                  dk(  rd}nd}| j                  d|«       y )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(   rf   r1   rk   )r)   r|   s     r   r9   zNimView.notify_over¬   s1   € Ø�9‰9�?‰?×!Ñ! QÒ&Ø3‰Dà7ˆDØ�‰ÐIÈ4ÕPr   c                 óˆ   — | j                   j                  t        j                  k(  r| j                  j                  «        y y r   )r(   r   r,   r.   re   rx   r5   s    r   rx   zNimView.clear³   s+   € Ø�9‰9�?‰?œcŸh™hÒ&Ø�K‰K×ÑÕð 'r   r   )	r@   rA   rB   r*   rk   r3   r7   r9   rx   r   r   r   rb   rb   t   s"   „ ò!ó"
!ò	!òGòQó r   rb   c                   ó   — e Zd Zd„ Zd„ Zy)ÚNimControllerc                 ól  — || _         |j                  j                  | _        d| _        | j                  j	                  «       D ]  }|j                  |j                  «       Œ | j                   j                  j                  | j                   j                  j                  d«       | j                   j                  j                  | j                   j                  j                  d«       | j                   j                  j                  d«       | j                   j                  j                  «        y )NFÚspaceÚEscapezPress space bar to start game)r(   r2   r/   ÚBUSYÚvaluesÚonclickr`   re   Úonkeyrf   r3   rx   rk   Úlisten)r)   r(   Ústicks      r   r*   zNimController.__init__º   sÅ   € ØˆŒ	Ø—i‘i×&Ñ&ˆŒØˆŒ	Ø—[‘[×'Ñ'Ö)ˆEØ�M‰M˜%Ÿ.™.Õ)ð *à�	‰	×Ñ×Ñ˜tŸy™yŸ™×4Ñ4°gÔ>Ø�	‰	×Ñ×Ñ˜tŸy™yŸ~™~×3Ñ3°XÔ>Ø�	‰	�‰×ÑÐ>Ô?Ø�	‰	×Ñ×ÑÕ!r   c                 ó†   — | j                   ry d| _         | j                  j                  j                  ||«       d| _         y )NTF)rŽ   r(   rf   r7   r?   s      r   r7   zNimController.notify_moveÅ   s2   € Ø�9Š9ØØˆŒ	Ø�	‰	�‰×#Ñ# C¨Ô-Øˆ�	r   N)r@   rA   rB   r*   r7   r   r   r   rŠ   rŠ   ¸   s   „ ò	"ór   rŠ   c                   ó   — e Zd ZdZdZdZd„ Zy)r,   r   r   r   c                 óœ   — t         j                  | _        || _        t	        | «      | _        t        | «      | _        t        | «      | _	        y r   )
r,   r-   r   re   r&   rf   rb   r2   rŠ   r_   )r)   re   s     r   r*   zNim.__init__Ñ   s6   € Ü—[‘[ˆŒ
ØˆŒÜ˜d“^ˆŒ
Ü˜D“MˆŒ	Ü'¨Ó-ˆ�r   N)r@   rA   rB   r-   r4   r.   r*   r   r   r   r,   r,   Í   s   „ Ø€GØ€GØ€Dó.r   r,   c                  ó˜   — t        j                  «       } | j                  d«       | j                  t        t
        «       t        | «      }y)NÚstandardÚ	EVENTLOOP)rJ   ÚScreenÚmoder3   rZ   r[   r,   )Ú
mainscreenÚnims     r   Úmainrž   Ù   s5   € Ü—‘“€JØ‡O�O�JÔØ×Ñ”[¤,Ô/Ü
ˆj‹/€CØr   Ú__main__)Ú__doc__rJ   r   rƒ   rZ   r[   r   r   rO   rP   r   r‚   r…   r   r    r   Úobjectr&   rK   rD   rb   rŠ   r,   rž   r@   Úmainloopr   r   r   Ú<module>r£      sÛ   ðñ	ó Û Û à€Ø€à€	Ø€	à˜Ñ€Ø˜ a™¨2Ñ-°¸Q±À!Ñ0CÑCÑD€à	€Ø	€Ø€ò0òòô!ˆvô !ôH=ˆF�M‰Mô =ô6A ˆfô A ôH�Fô ô*	.ˆ&ô 	.òð ˆzÒÙ„FØ€F‡O�OÕð r   