o
    L`cF                     @   s  d Z ddlZddlmZmZ ddlZddlZddlZddlm	Z	 ddl
mZ dZdZeefZG dd	 d	ejZG d
d dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd deZG dd dejZe  Zedkrde_de_de_dS dS )zlGUI for the Seven Little Words PA, containing all necessary classes.

Author: Isaac Wang
Version: Fall 2022
    N)ttksimpledialog)GameInfo)WordClueZ	Helvetica   c                       sZ   e Zd ZdZdZddgZed ZeZed Z	d fdd		Z
d
d Zdd Zdd Z  ZS )
CluesFramez>Frame that displays clues with the number of letters/solution.blackz#CBB677z#F4EFE1Zbold)Z
overstrike   c                    s<  t  | || _| jddd | jddd tj| d| jtjdjddtj	d tj| d| jtj
djddtj	d g | _g | _t| jD ]U}tj| |d  d	| jtj| j| j|t| j  d
}|jd|d tj	d | j| tj| d| jtj
| j| j|t| j  d
}|jd|d tj	d | j| qFd S )Nr      weight   ZClues)textfontanchorcolumnrowstickyZ	Solutions.)r   r   r   fgbgZletters)super__init__Z
CLUE_COUNTcolumnconfiguretkLabel	HEAD_FONTWgridEWE_CluesFrame__clue_labels_CluesFrame__solution_labelsrange
LABEL_FONT
FONT_COLOR
ROW_COLORSlenappend)selfparentZ
clue_counticlueZsol	__class__ qC:\Users\wangid\OneDrive - James Madison University\2022_Fall\CS149\Homework\PA3\reference_solution\game_board.pyr      s    $$6,zCluesFrame.__init__c                 C   s4   |t | jk r| j| j|r| jn| jd d S d S )Nr   )r)   r#   configSTRIKE_FONTr&   )r+   indexZstriker1   r1   r2   set_clue_strikethrough9   s   "z!CluesFrame.set_clue_strikethroughc                 C   s6   |t | jk r| j| j|d  d| d d S d S )Nr   . r   )r)   r#   r4   r+   r6   r   r1   r1   r2   set_clue_text=   s   $zCluesFrame.set_clue_textc                 C   s*   |t | jk r| j| j| d d S d S Nr9   )r)   r$   r4   r:   r1   r1   r2   set_solution_textA   s   zCluesFrame.set_solution_text)r
   )__name__
__module____qualname____doc__r'   r(   DEFAULT_FONTr   r&   r5   r   r7   r;   r=   __classcell__r1   r1   r/   r2   r      s    r   c                       sd   e Zd ZdZdZdZdZdZed Z	eZ
 fddZdd	 Zd
d Zdd Zdd Zdd Z  ZS )
GuessFramezOFrame for displaying the current guess, with buttons to reset and submit guess.#450084white#B599CEr	   c                    s   t  | | jddd tj| d| j| j| j| jd| _	| j	j
ddtjd tj| | j| jddd| _| jj
ddtjd tj| d	| j| j| j| jd| _| jj
d
dtjd d S )Nr   r   ZResetr   r   r   r   Zactivebackgroundr   r   solid)r   r   borderwidthreliefZGuessr   )r   r   r   r   ButtonBUTTON_FONTBUTTON_FG_COLORBUTTON_COLORBUTTON_PRESSED_COLOR_GuessFrame__reset_buttonr    r   r   ANSWER_FONTANSWER_COLOR_GuessFrame__answer_fieldNSEW_GuessFrame__guess_buttonr"   r+   r,   r/   r1   r2   r   R   s     zGuessFrame.__init__c                 C   s   | j dS )Nr   )rT   cgetr+   r1   r1   r2   get_answer_text`      zGuessFrame.get_answer_textc                 C      | j j|d d S r<   )rT   	configurer+   r   r1   r1   r2   set_answer_textc      zGuessFrame.set_answer_textc                 C   r\   NZcommand)rQ   r]   r+   Zfcnr1   r1   r2   set_reset_button_callbackf   r`   z$GuessFrame.set_reset_button_callbackc                 C   r\   ra   )rV   r]   rc   r1   r1   r2   set_guess_button_callbacki   r`   z$GuessFrame.set_guess_button_callbackc                 C       | j jdd | jjdd d S Ndisabled)state)rQ   r]   rV   rY   r1   r1   r2   disable_buttonsl      zGuessFrame.disable_buttons)r>   r?   r@   rA   rO   rN   rP   rS   rB   rM   rR   r   rZ   r_   rd   re   rj   rC   r1   r1   r/   r2   rD   F   s    rD   c                       s   e Zd ZdZed ZdZdZdZdd Z	dd	 Z
d3 fdd	Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd4d1d2Z  ZS )5
TilesFramez1Frame displaying all the word segments in a grid.r	   r   rF   z#DACCE6c                 C   s   || j  || j  fS N	GRID_COLSr+   r6   r1   r1   r2   Z__calc_tile_coordsz   s   zTilesFrame.__calc_tile_coordsc                 C   s   || j  | S rm   rn   )r+   r   r   r1   r1   r2   Z__calc_button_index}      zTilesFrame.__calc_button_index      c                    s  t  | | _| _tt j j  _d  _ j	t
t jddd  jt
t jddd g  _i  _t jD ]@} |\}}tj | d|  j j jdddd}|j|f fd	d
	d |j||tjddd  j| d  j|< q@d S )Nr   r   )r   Zuniformr   ,rI   rs   )r   r   r   r   rJ   rK   padyc                    s
     | S rm   )_TilesFrame__on_tile_clicked)brY   r1   r2   <lambda>   s   
 z%TilesFrame.__init__.<locals>.<lambda>rb   )r   r   r   padxru   )r   r   
TILE_COUNTro   intmathZceilZ	GRID_ROWS"_TilesFrame__tile_clicked_callbackZgrid_rowconfiguretupler%   Zgrid_columnconfigure_TilesFrame__tile_buttons_TilesFrame__tile_data_TilesFrame__calc_tile_coordsr   rL   	TILE_FONTTILE_BG_COLORTILE_FG_COLORr]   r    rU   r*   )r+   r,   Z
tile_countcols_per_rowr-   rcbuttonr/   rY   r2   r      s"   *zTilesFrame.__init__c                 C   s   d|  kot | jk S   S )Nr   )r)   r   rp   r1   r1   r2   Z__valid_index   s   zTilesFrame.__valid_indexc                 C   s2   | j r|  || j| | j|| | d S d S rm   )r}   r   r   r6    _TilesFrame__get_button_selectedr+   r   r1   r1   r2   __on_tile_clicked   s   (zTilesFrame.__on_tile_clickedc                 C   s
   || _ d S rm   )r}   )r+   Zfunctionr1   r1   r2   set_tile_callback      
zTilesFrame.set_tile_callbackc                 C   s   |j |d d S r<   )r]   )r+   r   r   r1   r1   r2   Z__set_button_text      zTilesFrame.__set_button_textc                 C   s   || j |< d S rm   r   )r+   r   datar1   r1   r2   Z__set_button_data   rq   zTilesFrame.__set_button_datac                 C   s
   | j | S rm   r   r   r1   r1   r2   Z__get_button_data   r   zTilesFrame.__get_button_datac                 C   s   | ddkS )Nri   rh   )rX   r   r1   r1   r2   Z__get_button_selected   rq   z TilesFrame.__get_button_selectedc                 C   s0   |r|j d| jdd d S |j d| jdd d S )NrI   rh   )rK   r   ri   Znormal)r4   TILE_SELECTED_COLORr   )r+   r   selectedr1   r1   r2   Z__set_button_selected   s   z TilesFrame.__set_button_selectedc                 C   s   t | S rm   )boolZwinfo_ismappedr   r1   r1   r2   Z__get_button_visible   r[   zTilesFrame.__get_button_visiblec                 C   s   |r|   d S |  d S rm   )r    grid_remove)r+   r   visibler1   r1   r2   Z__set_button_visible      zTilesFrame.__set_button_visiblec                 C   $   |  |r| | j| | d S d S rm   )_TilesFrame__valid_index_TilesFrame__set_button_textr   r:   r1   r1   r2   set_tile_text      
zTilesFrame.set_tile_textc                 C   r   rm   )r   _TilesFrame__set_button_datar   )r+   r6   r   r1   r1   r2   set_tile_data   r   zTilesFrame.set_tile_datac                 C   s   |  |r| | j| S d S rm   )r   _TilesFrame__get_button_datar   rp   r1   r1   r2   get_tile_data      
zTilesFrame.get_tile_datac                 C      |  |r| | j| S dS NF)r   r   r   rp   r1   r1   r2   get_tile_selected   r   zTilesFrame.get_tile_selectedc                 C   r   rm   )r    _TilesFrame__set_button_selectedr   )r+   r6   r   r1   r1   r2   set_tile_selected   r   zTilesFrame.set_tile_selectedc                 C   r   r   )r   _TilesFrame__get_button_visibler   rp   r1   r1   r2   get_tile_visible   r   zTilesFrame.get_tile_visiblec                 C   r   rm   )r   _TilesFrame__set_button_visibler   )r+   r6   r   r1   r1   r2   set_tile_visible   r   zTilesFrame.set_tile_visibleTc                 C   sZ   t | j t| jD ]\}}| |\}}| |}|j||d |r*|s*|  qd S )N)r   r   )randomZshuffler   	enumerater   r   r    r   )r+   Z
keep_stater-   rw   r   r   r   r1   r1   r2   shuffle_tiles   s   
zTilesFrame.shuffle_tiles)rr   rs   )T)r>   r?   r@   rA   rB   r   r   r   r   r   Z_TilesFrame__calc_button_indexr   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   r1   r1   r/   r2   rl   q   s6    rl   c                       sT   e Zd ZdZdZdZdZed Z fddZ	dd	 Z
d
d Zdd Zdd Z  ZS )
HintsFramez,Frame for displaying hints and hint buttons.rE   rF   rG   r	   c                    s   t  | | jddd tj| td| _| jjddtjdd tj	| d| j
| j| j| jd| _| jjddtjdd tj	| d	| j
| j| j| jd| _| jjd
dtjd d S )Nr   r   r   r3   rs   )r   r   r   ry   HintsrH   ZShuffler   r   )r   r   r   r   r   rB   _HintsFrame__hint_labelr    rU   rL   rM   rN   rO   PRESSED_COLOR_HintsFrame__hint_buttonr"   _HintsFrame__shuffle_buttonrW   r/   r1   r2   r      s     zHintsFrame.__init__c                 C   r\   r<   )r   r]   r^   r1   r1   r2   set_hint_text  r`   zHintsFrame.set_hint_textc                 C   r\   ra   )r   r]   rc   r1   r1   r2   set_hint_button_callback  r`   z#HintsFrame.set_hint_button_callbackc                 C   r\   ra   )r   r]   rc   r1   r1   r2   set_shuffle_button_callback  r`   z&HintsFrame.set_shuffle_button_callbackc                 C   rf   rg   )r   r]   r   rY   r1   r1   r2   rj   
  rk   zHintsFrame.disable_buttons)r>   r?   r@   rA   rO   rN   r   rB   rM   r   r   r   r   rj   rC   r1   r1   r/   r2   r      s    r   c                       sr   e Zd ZdZd fdd	Zedd Zedd Zed	d
 Zedd Z	dd Z
dd Zdd Zdd Z  ZS )SevenWordsViewz*Main view for the Seven Little Words game.rs   c                    s   t  | t| || _| jjtjddd t| | _| jjtjddd t	| ||| _
| j
jtjdddd t| | _| jjtjddd d S )Nrs   )fillru   ry   Tr   )r   expandru   ry   )r   r   r   _SevenWordsView__clues_framepackr   XrD   _SevenWordsView__answer_framerl   _SevenWordsView__tiles_frameBOTHr   _SevenWordsView__hints_frame)r+   r,   num_of_cluesnum_of_slicesr   r/   r1   r2   r     s   

zSevenWordsView.__init__c                 C      | j S rm   )r   rY   r1   r1   r2   clues!     zSevenWordsView.cluesc                 C   r   rm   )r   rY   r1   r1   r2   answer%  r   zSevenWordsView.answerc                 C   r   rm   )r   rY   r1   r1   r2   tiles)  r   zSevenWordsView.tilesc                 C   r   rm   )r   rY   r1   r1   r2   hints-  r   zSevenWordsView.hintsc                 C   s@   | j |d | j || | jd | jd |   d S )NT )r   r7   r=   r   r_   r   r   hide_selected_tiles)r+   r6   Zsolutionr1   r1   r2   
solve_clue1  s
   zSevenWordsView.solve_cluec                 C   s0   t | jjD ]}| j|r| j|d qd S r   )r%   r   rz   r   r   )r+   r-   r1   r1   r2   r   9  s
   z"SevenWordsView.hide_selected_tilesc                 C   s$   | j d | jd |   d S )NzCongratulations! You win!r   )r   r_   r   r   disable_all_buttonsrY   r1   r1   r2   display_win_message>  s   z"SevenWordsView.display_win_messagec                 C   s   | j   | j  d S rm   )r   rj   r   rY   r1   r1   r2   r   C  s   
z"SevenWordsView.disable_all_buttons)rs   )r>   r?   r@   rA   r   propertyr   r   r   r   r   r   r   r   rC   r1   r1   r/   r2   r     s    



r   c                       s>   e Zd Zdddg f fdd	Zdd Zdd Zd	d
 Z  ZS )PickerDialogNr   c                    s$   d| _ || _|| _t || d S )N)_PickerDialog__selected_index_PickerDialog__message_PickerDialog__optionsr   r   )r+   r,   titlemessageZoptionsr/   r1   r2   r   I  s   zPickerDialog.__init__c              	   C   s   t j|| jdjdt jddd t }|jdddd tj|d	dt	t
| jt	d
d d| _| j| jd< | jd | jjdt jddd d S )Nr9   r   rs   )r   r   ry   ru   zCustom.TComboboxrF   r   )Z
backgroundZ
foregroundreadonly)keyr   )ri   stylewidthvaluesr      )r   r   r   r    r!   r   ZStyler]   ZComboboxr)   maxr   _PickerDialog__pickercurrent)r+   framer   r1   r1   r2   bodyP  s    &zPickerDialog.bodyc                 C   s   | j  | _d S rm   )r   r   r   rY   r1   r1   r2   applyZ  r   zPickerDialog.applyc                 C   r   rm   )r   rY   r1   r1   r2   
get_result]  s   zPickerDialog.get_result)r>   r?   r@   r   r   r   r   rC   r1   r1   r/   r2   r   H  s
    
r   c                   @   sb   e Zd ZdZdedefddZdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd ZdS )SevenWordsControllerz:Controller connecting the GameInfo and the SevenWordsView.	game_infoviewc                 C   s<   || _ || _g | _|   |   |   | jjd d S r   ) _SevenWordsController__game_info_SevenWordsController__view"_SevenWordsController__clue_solved!_SevenWordsController__init_clues!_SevenWordsController__init_tiles%_SevenWordsController__init_callbacksr   r   )r+   r   r   r1   r1   r2   r   d  s   zSevenWordsController.__init__c                 C   sZ   t | j D ]#\}}| jj||  | jj|t|	  d | j
d qd S )Nz lettersF)r   r   get_word_cluesr   r   r;   get_cluer=   r)   get_wordr   r*   )r+   r-   r.   r1   r1   r2   Z__init_clueso  s
   z!SevenWordsController.__init_cluesc                 C   s@   t | j D ]\}}| jj|t| | jj|| qd S rm   )r   r   
get_slicesr   r   r   strr   r+   r-   slicer1   r1   r2   Z__init_tilesu  s   z!SevenWordsController.__init_tilesc                 C   sT   | j j| j | j j| j | j j| j | j j	
| j | j j	| j d S rm   )r   r   r   &_SevenWordsController__on_tile_clickedr   rd   '_SevenWordsController__on_reset_clickedre   '_SevenWordsController__on_guess_clickedr   r   &_SevenWordsController__on_hint_clickedr   )_SevenWordsController__on_shuffle_clickedrY   r1   r1   r2   Z__init_callbacksz  s
   z%SevenWordsController.__init_callbacksc                 C   sV   |r)| j j| j j t|  |  | j j|t| | j j|d d S d S )NT)	r   r   r_   rZ   r   Zuser   r   r   )r+   r   r   r6   r   r1   r1   r2   r     s   z&SevenWordsController.__on_tile_clickedc                 C   st   | j jd td| j jjD ](}| j j|r7| j j|}|r7|  | j j	|t
| | j j|d qd S )Nr   r   F)r   r   r_   r%   r   rz   r   r   resetr   r   r   r   r1   r1   r2   Z__on_reset_clicked  s   z'SevenWordsController.__on_reset_clickedc                 C   sx   t | jj d}t| j D ]%\}}||kr5| j|| 	  d| j
|< t| j
r2| j   d S q|   d S )Nr   T)r   r   r   rZ   r   r   r   r   r   upperr   allr   r   )r+   Zguessr-   r.   r1   r1   r2   Z__on_guess_clicked  s   


z'SevenWordsController.__on_guess_clickedc                    s    fddt  j D }t jdddd |D  }|dkrx|| \}}t jd|d  d|  d	g d
 }|dkrz|d  d}|dkrU|d|  7 }n|dkrc|d| j	 7 }n|dkro|d|
  7 } jj| d S d S d S )Nc                    s"   g | ]\}} j | s||fqS r1   )r   .0r-   xrY   r1   r2   
<listcomp>  s   " z:SevenWordsController.__on_hint_clicked.<locals>.<listcomp>r   zShow a hint for:c                 S   s&   g | ]\}}|d   d|   qS )r   r8   )r   r   r1   r1   r2   r     s   & r   r   r8   :)zFirst Letterz
First TilezEntire SolutionzFirst Letter: zFirst Tile: r   z
Solution: )r   r   r   r   r   r   r   Zget_first_letter_hintZget_first_slice_hintr   Zget_whole_word_hintr   r   )r+   Z
clues_leftZ
clue_indexZnumr.   Z
hint_indexZ	hint_textr1   rY   r2   Z__on_hint_clicked  s    ,z&SevenWordsController.__on_hint_clickedc                 C   s   | j j  d S rm   )r   r   r   rY   r1   r1   r2   Z__on_shuffle_clicked  r   z)SevenWordsController.__on_shuffle_clickedN)r>   r?   r@   rA   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   r   a  s    r   c                       s0   e Zd Zdef fddZdefddZ  ZS )	GameBoardinfoc                    sv   t    t| }t| }t| ||| _t|| j| _| jj	t
jdd | d |   | d|   d S )NT)r   r   z00000111 Little Wordsi^  )r   r   r)   r   r   r   Z_GameBoard__viewr   Z_GameBoard__controllerr   r   r   r   updateZminsizeZwinfo_height)r+   r   r   r   r/   r1   r2   r     s   

zGameBoard.__init__r   c                 C   s   |r|    d S |   d S rm   )ZmainloopZdestroy)r+   r   r1   r1   r2   set_visible  r   zGameBoard.set_visible)r>   r?   r@   r   r   r   r  rC   r1   r1   r/   r2   r     s    r   darwinr   rG   ) rA   Ztkinterr   r   r   r|   r   platformr   r   Z	word_cluer   ZFONT_FAMILYZ	FONT_SIZErB   ZFramer   rD   rl   r   r   ZDialogr   objectr   ZTkr   systemlowerZplatrN   rS   r1   r1   r1   r2   <module>   s2    1+y%9W
