
    soj#                         d dl Z d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ  G d d          Z G d	 d
e          Z G d de          ZdS )    N)IntEnum)	GameBoard)GameDifficulty)GameOutcome)Terminologyc                   ,    e Zd Zddedee         fdZdS )
PlayerInfoNlivesused_lettersc                 B    || _         || _        | j         	g | _         d S d S N)r   r
   )selfr
   r   s      ./app/src/model/game/guessorlife/GuessOrLife.py__init__zPlayerInfo.__init__   s0    (
$ "D %$    r   )__name__
__module____qualname__intliststrr    r   r   r	   r	      s?        # #c #c # # # # # #r   r	   c                       e Zd ZdZdZdS )
PlayerType      N)r   r   r   
CHALLENGEROPPONENTr   r   r   r   r      s        JHHHr   r   c            	       @    e Zd Z	 	 	 ddedededef fdZdefdZd	e	d
ede
fdZd
ede
fdZdd	e	dd de
fdZd	e	fdZd	e	defdZdefdZd Zd Zd	e	fdZd	e	fdZd d	e	de
fdZd	e	d
efdZd	e	fdZededepdfd            Zededepdfd            Z xZS )!GuessOrLifeNterminologychallenger_infoopponent_infoissued_livesc                 X   t                                                       || _        || _        || _        || _        | j        #t          j                                        | _        | j        t          | j                  | _        | j        t          | j                  | _        dS dS )z
        Constructor
        :param terminology: The terminology
        :param challenger_info: The challenger info
        :param opponent_info: The opponent info
        :param issued_lives: The issued lives
        N)
superr   r!   r"   r#   r$   EnvGUESS_OR_LIFE_STARTING_LIVESget_intr	   )r   r!   r"   r#   r$   	__class__s        r   r   zGuessOrLife.__init__   s     	&.*($ # @ H H J JD'#-d.?#@#@D %!+D,=!>!>D &%r   returnc                 B    t          j        dd| j        j                  S )zU
        Get the plain word, without special characters
        :return: str
        z\W )resubr!   namer   s    r   get_plain_wordzGuessOrLife.get_plain_word8   s     veR!1!6777r   player_typeletterc                     |t           j        k    r |                                | j        j        v S |                                | j        j        v S )z
        Check if the player has used a letter
        :param player_type: The player
        :param letter: The letter
        :return: bool
        )r   r   lowerr"   r   r#   r   r3   r4   s      r   has_used_letterzGuessOrLife.has_used_letter@   sD     *///<<>>T%9%FFF<<>>T%7%DDDr   c                 v    |                                 |                                                                  v S )zl
        Check if the letter is in the word
        :param letter: The letter
        :return: bool
        )r6   r2   )r   r4   s     r   is_letter_is_in_wordz GuessOrLife.is_letter_is_in_wordM   s/     ||~~!4!4!6!6!<!<!>!>>>r   other_boardc                 P    ||t           j        u rdS |                     |          S )a<  
        Check if the game is finished
        :param player_type: The player type, challenger by default because in case it's not passed (so global board),
        then it will always be the challenger in both boards
        :param other_board: The other board, in case of global game
        :return: bool
        NF)r   r   player_has_guessed)r   r3   r;   s      r   is_finishedzGuessOrLife.is_finishedV   s3     " j333u&&{333r   c                     |                      |          }|                                 D ] }|                                |j        vr dS !dS )zA
        :param player_type: The player
        :return:
        FT)get_player_infor2   r6   r   )r   r3   player_infor4   s       r   r=   zGuessOrLife.player_has_guessedg   s[     **;77))++ 	 	F||~~[%===uu > tr   c                     |                      |          st          d          |t          j        u rt          j        S t          j        S )z6
        Get the outcome
        :return: str
        zGame is not finished)r>   
ValueErrorr   r   r   CHALLENGER_WONOPPONENT_WONr   r3   s     r   get_outcomezGuessOrLife.get_outcomeu   sI     ,, 	53444*///--''r   c                 >    |t           j        k    r| j        S | j        S )z]
        Get the player info
        :param player_type: The player
        :return:
        )r   r   r"   r#   rF   s     r   r@   zGuessOrLife.get_player_info   s$     *///''!!r   c                     | j         dk     S )zE
        Check if a live can be issued
        :return: bool
           )r$   r1   s    r   can_issue_lifezGuessOrLife.can_issue_life   s      2%%r   c                     |                                  st          d          | j        xj        dz  c_        | j        xj        dz  c_        | xj        dz  c_        dS )z4
        Issue a live
        :return: None
        zCannot issue liver   N)rK   rC   r"   r
   r#   r$   r1   s    r   
issue_lifezGuessOrLife.issue_life   so     ""$$ 	20111""a'""  A%  Qr   c                     |t           j        u r| j        j        }n| j        j        }|                                 t          d                    |                                                    S )zl
        Get the used letters formatted
        :param player_type: The player
        :return: str
        , )	r   r   r"   r   r#   sortr   joinupper)r   r3   letterss      r   get_used_letters_formattedz&GuessOrLife.get_used_letters_formatted   s_     *///!%!5!BGG!%!3!@G 	499W%%&&,,...r   c           	          |                      |          d                    fdt          t          d          t          d          dz             D                       S )zg
        Get the remaining letters
        :param player_type: The player
        :return: str
        rO   c                 P    g | ]"}t          |          vt          |          #S r   )chr).0ir   s     r   
<listcomp>z5GuessOrLife.get_remaining_letters.<locals>.<listcomp>   s/    YYYc!ffL>X>XSVV>X>X>Xr   AZr   )rT   rQ   rangeord)r   r3   r   s     @r   get_remaining_lettersz!GuessOrLife.get_remaining_letters   s_     66{CCyyYYYYU3s88SXX\::YYY
 
 	
r   Tshow_guessed_lettersc                    d}g }d}t          | j        j                  D ]*\  }}|}|                                |                     |          j        v r0||r|                    |          n|                    d          z  }n|dk    r||                    |          z  }n|                                du r`t          |          dk    rM||dz
                                           r0||r|                    |          n|                    d          z  }n||                    d          z  }d}|	                    |           ,|
                                S )	z
        Get the word with blanks
        :param player_type: The player
        :param show_guessed_letters: Show guessed letters
        :return: str
        r-   z {} * Fr   r   _)	enumerater!   r0   r6   r@   r   formatisalphalenappendrR   )	r   r3   r`   word	word_listletter_templateindexr4   letter_to_appends	            r   get_word_with_blanksz GuessOrLife.get_word_with_blanks   s{    	 &t'7'<== 	/ 	/ME6%||~~!5!5k!B!B!OOO+5O**6222(//44 3..v666   E))c)nnq.@.@YuWXyEYEaEaEcEc.@+5O**6222(//44 ..s333#& -....zz||r   c                     |t           j        k    r3| j        j                            |                                           dS | j        j                            |                                           dS )z
        Add a used letter
        :param player_type: The player
        :param letter: The letter
        :return: None
        N)r   r   r"   r   ri   r6   r#   r7   s      r   add_used_letterzGuessOrLife.add_used_letter   sb     */// -44V\\^^DDDDD+226<<>>BBBBBr   c                 ~    |t           j        k    r| j        xj        dz  c_        dS | j        xj        dz  c_        dS )z\
        Remove a life
        :param player_type: The player
        :return: None
        r   N)r   r   r"   r
   r#   rF   s     r   remove_lifezGuessOrLife.remove_life   sL     */// &&!+&&&&$$)$$$$r   
difficultyc                    | xt           j        k    r t          j                                        S xt           j        k    r t          j                                        S t           j        k    rdS 	 t          d          )z|
        Get the max unique characters by difficulty
        :param difficulty: The difficulty
        :return: int
        NInvalid difficulty)	r   EASYr'   (GUESS_OR_LIFE_MAX_UNIQUE_CHARACTERS_EASYr)   MEDIUM*GUESS_OR_LIFE_MAX_UNIQUE_CHARACTERS_MEDIUMHARDrC   rt   s    r   'get_max_unique_characters_by_difficultyz3GuessOrLife.get_max_unique_characters_by_difficulty  sv     $$$$$CKKMMM&&&&&EMMOOO$$$t !5666r   c                    | xt           j        k    r dS xt           j        k    r" t          j                                        dz   S t           j        k    r!t          j                                        dz   S 	 t          d          )z|
        Get the min unique characters by difficulty
        :param difficulty: The difficulty
        :return: int
        Nr   rv   )	r   rw   ry   r'   rx   r)   r{   rz   rC   r|   s    r   'get_min_unique_characters_by_difficultyz3GuessOrLife.get_min_unique_characters_by_difficulty  s     $$$$$t&&&&&CKKMMPQQQ$$$EMMOORSSS !5666r   )NNNr   )T)r   r   r   r   r	   r   r   r   r2   r   boolr8   r:   r>   r=   r   rG   r@   rK   rM   rT   r_   ro   rq   rs   staticmethodr   r}   r   __classcell__)r*   s   @r   r    r       s        '+$( ? ? ? $? "	?
 ? ? ? ? ? ?<8 8 8 8 8E: Es Et E E E E?3 ?4 ? ? ? ?4 4z 4 4Y] 4 4 4 4"j    (z (k ( ( ( (
"j 
" 
" 
" 
"& & &  /j / / / /"

 

 

 

 

( (
 (RV ( ( ( (TC: Cs C C C C
*z 
* 
* 
* 
* 7N 7s{VZ 7 7 7 \7( 7N 7s{VZ 7 7 7 \7 7 7 7 7r   r    )r.   enumr   resources.EnvironmentEnvironmentr'   src.model.game.GameBoardr   src.model.game.GameDifficultyr   src.model.game.GameOutcomer   src.model.wiki.Terminologyr   r	   r   r    r   r   r   <module>r      s
   				       # # # # # # . . . . . . 8 8 8 8 8 8 2 2 2 2 2 2 2 2 2 2 2 2# # # # # # # #       
S7 S7 S7 S7 S7) S7 S7 S7 S7 S7r   