o
    C›]b•<  ã                   @   sŽ   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ZG d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 )é    )Úprint_function)Úsleep)Ústart)Úproperty_interning_dict)Ú	interfaceNc                   @   s6   e Zd ZdZdZdZdZd
dd„Zdd„ Zdd	„ Z	dS )ÚStatez4
    Helper class for representing states in A*
    Néÿÿÿÿc                 C   s"   || _ || _|d ur|| _d S d S ©N)ÚxÚzÚprevious)Úselfr
   r   r   © r   úz:\Documents\Temple_master\Spring_2022\ai\minecraft_proj\CIS-5603-Minecraft-Settlement-Generation-AI\temple_mc_ai\generation\pathGenerator.pyÚ__init__   s
   
ÿzState.__init__c                 C   s    dt | jƒ d t | jƒ d S )Nú(ú, ú))Ústrr
   r   )r   r   r   r   Ú	to_string   s    zState.to_stringc                 C   s   | j |j ko| j|jkS r	   )r
   r   )r   Ústater   r   r   Úequals   s   zState.equals)r   r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r   r   r   r   r   	   s    
r   c                 C   s   t | ƒtt||ƒ| ƒ S )z-
    Evaluation function for use with A*
    N)ÚcostÚhr   )Úcurrent_stateÚmÚnr   r   r   Úf   s   r!   c                 C   s*   d}| }|dur|j }|d7 }|dus|S )zr
    Helper function which calculates the cost to a certain state (i.e., how many steps it took to get there)
    r   Né   )r   )r   Zcost_valr   r   r   r   r   %   s   þr   c                 C   s    t | j|j ƒt | j|j ƒ S )z,
    Hueristic function for use with A*
    N©Úabsr
   r   )Ú
goal_stater   r   r   r   r   1   s    r   c                 C   s
   |   |¡S )zO
    Helper function to determine whether or not the goal has been reached
    N)r   )r   r%   r   r   r   Úhas_reached_goal8   s   
r&   c                 C   s4   t || j| | j| f ||j| |j| f  ƒS )zP
    Helper function which returns the height difference between two points
    Nr#   )Zstate1Zstate2ÚheightsÚheight_start_xÚheight_start_zr   r   r   Úget_height_difference?   s   4r*   c	           %      C   s	  t dƒ t d| d|dƒ t d|d|dƒ d}	t| |ƒ}
g }| t|
j|
jƒ¡ g }d}t|ƒdkr¹d}td	t|ƒƒD ];}t|| ||ƒt|| ||ƒk rP|}q;t|| ||ƒt|| ||ƒkrvtt||ƒ|| ƒtt||ƒ|| ƒkrv|}q;t|| j|| j|| j	ƒ}
| t|
j|
jƒ¡ d}|t|ƒk r¶t|
j|
jƒ 
|| ¡r¬| || ¡ n|d	7 }|t|ƒk s˜t|
t||ƒƒrÆt d
ƒ d}q¹|
jd	 |krd}tt|ƒƒD ]}t|
j|
jd	 ƒ 
|| ¡rêd} qëqÖd}t|
t|
j|
jd	 ƒ|||ƒ}|dkrd}|du r|du r| t|
j|
jd	 |
ƒ¡ |
jd	 |krqd}tt|ƒƒD ]}t|
j|
jd	 ƒ 
|| ¡r@d} qBq*d}t|
t|
j|
jd	 ƒ|||ƒ}|dkrZd}|du rq|du rq| t|
j|
jd	 |
ƒ¡ |
jd	 |krÈd}tt|ƒƒD ]}t|
jd	 |
jƒ 
|| ¡r—d} q™qd}t|
t|
jd	 |
jƒ|||ƒ}|dkr±d}|du rÈ|du rÈ| t|
jd	 |
j|
ƒ¡ |
jd	 |krd}tt|ƒƒD ]}t|
jd	 |
jƒ 
|| ¡rîd} qðqØd}t|
t|
jd	 |
jƒ|||ƒ}|dkrd}|du r|du r| t|
jd	 |
j|
ƒ¡ |
jd	 |kr„|
jd	 |kr„d}tt|ƒƒD ]}t|
jd	 |
jd	 ƒ 
|| ¡rOd} qQq7d}t|
t|
jd	 |
jd	 ƒ|||ƒ}|dkrkd}|du r„|du r„| t|
jd	 |
jd	 |
ƒ¡ |
jd	 |kré|
jd	 |kréd}tt|ƒƒD ]}t|
jd	 |
jd	 ƒ 
|| ¡r´d} q¶qœd}t|
t|
jd	 |
jd	 ƒ|||ƒ}|dkrÐd}|du ré|du ré| t|
jd	 |
jd	 |
ƒ¡ |
jd	 |krN|
jd	 |krNd}tt|ƒƒD ]}t|
jd	 |
jd	 ƒ 
|| ¡rd} qqd}t|
t|
jd	 |
jd	 ƒ|||ƒ}|dkr5d}|du rN|du rN| t|
jd	 |
jd	 |
ƒ¡ |
jd	 |kr³|
jd	 |kr³d} tt|ƒƒD ]}t|
jd	 |
jd	 ƒ 
|| ¡r~d}  q€qfd}!t|
t|
jd	 |
jd	 ƒ|||ƒ}|dkršd}!| du r³|!du r³| t|
jd	 |
jd	 |
ƒ¡ t|ƒdks2g }"|
}#|#durÏ|" |#¡ |#j	}#|#dusÂ|du rØt dƒ tt|"ƒƒD ]«}||"| j| |"| j| f d	 }$t |"| j|$|"| j|	¡ t |"| jd	 |$|"| j|	¡ t |"| jd	 |$|"| jd	 |	¡ t |"| jd	 |$|"| jd	 |	¡ t |"| j|$|"| jd	 |	¡ t |"| j|$|"| jd	 |	¡ t |"| jd	 |$|"| jd	 |	¡ t |"| jd	 |$|"| jd	 |	¡ t |"| jd	 |$|"| j|	¡ qÞt ƒ  dS )zH
    Builds a simple path between the two specified points using A*
    zBuilding path...zPath starting at coordinates: (r   r   zPath ending at coordinates: (Z
grass_pathFr   r"   z Reached the goal, terminating A*Té   NzTNO SOLUTION, path not possible given current settings, placing what was found so far)Úprintr   Úappendr
   r   ÚlenÚranger!   r   r   r   Úremover&   r*   ÚINTFÚ
placeBlock)%Ústart_xÚstart_zÚend_xÚend_zr'   r(   r)   Úheight_end_xÚheight_end_zZpath_material_idr   Zopen_setZ
closed_setZgoal_reachedZ	best_moveÚiÚkZleft_is_exploredZleft_is_obstacleZheight_diffZright_is_exploredZright_is_obstacleZup_is_exploredZup_is_obstacleZdown_is_exploredZdown_is_obstacleZup_left_is_exploredZup_left_is_obstacleZup_right_is_exploredZup_right_is_obstacleZdown_left_is_exploredZdown_left_is_obstacleZdown_right_is_exploredZdown_right_is_obstacleÚpathZcurrent_state_copyÚheightr   r   r   Ú
build_pathF   s:  
  (€üþ
þ
þ
þ
 "þ"
 "þ"
 "þ"
 "þ"
 ¬ X


þ
$ $$  $$$
r=   c                 C   sl   t t| ƒd ƒD ]+}| | \}}| |d  \}	}
t d¡ tt|ƒt|ƒt|	ƒt|
ƒd |||||ƒ	 qdS )z^
    Helper function to take in an array of coordinates and build paths between each pair
    r"   g      à?r+   N)r/   r.   Útimer   r=   Úint)Údoor_coordsr'   r(   r)   r7   r8   r9   ÚstartxÚstartzÚendxÚendzr   r   r   Úbuild_paths_between_housesO  s   
.úrE   )Ú
__future__r   r>   r   Útracemallocr   Zxml.sax.handlerr   Úgdpcr   r1   r   r!   r   r   r&   r*   r=   rE   r   r   r   r   Ú<module>   s       