<commit_before>
package br.ufba.ia.copsandrobbers.search;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;

public class AStar {

	//Declare constants
	public static final int mapWidth = 80, mapHeight = 60, tileSize = 20, numberPeople = 3;
	public static final int notfinished = 0, notStarted = 0; // constantes relacionadas ao caminho
	public static final int found = 1, nonexistent = 2; 
	public static final int walkable = 0, unwalkable = 1;    // constantes referente a habilidade de andar.
	public int onClosedList = 10;

	//Create needed arrays
	public char[][] walkability = new char[mapWidth][mapHeight];
	public int[] openList = new int[mapWidth*mapHeight+2]; //array de 1 dimensão que segunda uma lista aberta de items
	public int[][] whichList = new int[mapWidth+1][mapHeight+1];  //array de 2 dimensões usado para gravar  
	// 		se uma célula está na lista aberta ou na lista fechada.
	public int[] openX = new int[mapWidth*mapHeight+2]; //array de 1 dimensão armazenando a posição x de um item na lista aberta.
	public int[] openY = new int[mapWidth*mapHeight+2]; //array de 1 dimensão armazenando a posição y de um item na lista aberta.
	public int[][] parentX = new int[mapWidth+1][mapHeight+1]; //array de 2 dimensões para armazenar o pai de cada célular x
	public int[][] parentY = new int[mapWidth+1][mapHeight+1]; //array de 2 dimensões para armazenar o pai de cada célula y
	public int[] Fcost = new int[mapWidth*mapHeight+2];	//array de 1 dimensão para armazenar o custo F de cada célula.
	public int[][] Gcost = new int[mapWidth+1][mapHeight+1]; 	//array de 2 dimensões para armazenar o custo G para cada célula
	public int[] Hcost = new int[mapWidth*mapHeight+2];	//array de 1 dimensão para armazenar o custo H de cada célula na lista aberta
	public int[] pathLength = new int[numberPeople+1];     //armazena o tamanho do caminho encontrado para a criatura
	public int[] pathLocation = new int[numberPeople+1];   //armazena a posição atual ao longo do caminho escolhido para a criatura		
	//int* pathBank [numberPeople+1];
	public List<Integer> pathBank[] = new List[numberPeople+1];
	public List<Integer[]> pathBank2 = new ArrayList<Integer[]>();

	//Path reading variables
	public int[] pathStatus = new int[numberPeople+1];
	public int[] xPath = new int[numberPeople+1];
	public int[] yPath = new int[numberPeople+1];

	public void InitializePathfinder ()
	{
		for (int x = 0; x < numberPeople+1; x++){
			pathBank[x] = new Vector<Integer>();
			pathBank2.add(new Integer[4]);
		}
	}

	public void  EndPathfinder ()
	{
		for (int x = 0; x < numberPeople+1; x++){
			pathBank[x].clear();
			pathBank2.set(x, null);
		}
	}

	public int FindPath (int pathfinderID, int startingX, int startingY,
			int targetX, int targetY)
	{
		int onOpenList=0, parentXval=0, parentYval=0, a=0, b=0, m=0, u=0, v=0, temp=0, corner=0, numberOfOpenListItems=0, addedGCost=0, tempGcost = 0, path = 0, tempx, pathX, pathY, cellPosition, newOpenListItemID=0;

		//1. Converta os dados da localização ( em pixels ) para as cordenadas do array de walkability.
		int startX = startingX/tileSize;
		int startY = startingY/tileSize;	
		targetX = targetX/tileSize;
		targetY = targetY/tileSize;

		//2. Caminhos rápidos: Sobre certas circunstâncias, nenhum caminho é necessário.

		// Se a posição inicial e o destino estão na mesmo lugar
		if (startX == targetX && startY == targetY && pathLocation[pathfinderID] > 0)
			return found;
		if (startX == targetX && startY == targetY && pathLocation[pathfinderID] == 0)
			return nonexistent;

		//Se o quadrado alvo é unwalkable(não andável), retorne que o caminho é inexistente.
		if (walkability[targetX][targetY] == unwalkable)
		{
			xPath[pathfinderID] = startingX;
			yPath[pathfinderID] = startingY;
			return nonexistent;
		}

		//3. Resetando algumas variáveis que precisam ser limpas
		if (onClosedList > 1000000) //Resetando whichList ocasionalmente
		{
			for (int x = 0; x < mapWidth; x++) {
				for (int y = 0; y < mapHeight; y++)
					whichList [x][y] = 0;
			}
			onClosedList = 10;	
		}
		onClosedList = onClosedList+2; //alterando os valores da openList(lista aberta) e onClosed list é mais rapida do que redimming whichList() array;
		onOpenList = onClosedList-1;
		pathLength [pathfinderID] = notStarted;//i.e, = 0
		pathLocation [pathfinderID] = notStarted;//i.e, = 0
		Gcost[startX][startY] = 0; //resetando o quadrado inicial com o valor de G para 0

		//4. Adicionando a posição inicial openList de quadrados para serem verificados.
		numberOfOpenListItems = 1;
		openList[1] = 1;		//colocando este como o item do topo(e atualmente somente) da openList, que é mantida como uma heap binaria.

		openX[1] = startX;
		openY[1] = startY;

		//5. Faça o seguinte até que um caminho é encontrador ou ele não exista.
		do
		{

			//6. Se a openList não é vazia, pegue a primeira célula da lista.
			//	Esta possui o menor custo da função F na openList.
			if (numberOfOpenListItems != 0)
			{

				//7. Remova o primeiro item da openList.
				parentXval = openX[openList[1]];
				parentYval = openY[openList[1]]; //Grave as coordenadas da celula do item
				whichList[parentXval][parentYval] = onClosedList;//adicione o item para a closedList

				//OpenList = Heap binária: Delete este item da openList, que é mantido como uma heap binária. Para mais informações veja:
				// http://www.policyalmanac.org/games/binaryHeaps.htm
				numberOfOpenListItems = numberOfOpenListItems - 1;//reduzindo o numero de items da openList em 1	

				// Delete o item do topo na heap binaria, e reordene a heap, com o item de menor custo da função F indo para o topo.
				openList[1] = openList[numberOfOpenListItems+1];//mova o ultimo item na heap a cima para o slot #1
				v = 1;

				//Repita o seguinte até que o novo item no slot1 caia para a sua própria posição na heap.
				do
				{
					u = v;		
					if (2*u+1 <= numberOfOpenListItems) //Se ambos os filhos existirem
					{
						//Verifique se o custo de F do pai é maior do que cada filho.
						//Selecione o menor dos dois filhos.
						if (Fcost[openList[u]] >= Fcost[openList[2*u]]) 
							v = 2*u;
						if (Fcost[openList[v]] >= Fcost[openList[2*u+1]]) 
							v = 2*u+1;		
					}
					else
					{
						if (2*u <= numberOfOpenListItems) //Se somente o filho 1 existe
						{
							//Verifique se o custo de F do pai é maior do que o filho 1.
							if (Fcost[openList[u]] >= Fcost[openList[2*u]]) 
								v = 2*u;
						}
					}

					if (u != v) //Se o custo de F do pai é > do um dos filhos troque eles.
					{
						temp = openList[u];
						openList[u] = openList[v];
						openList[v] = temp;			
					}
					else
						break; //de outro modo, saia do loop

				}
				while (!(Gdx.input.isKeyPressed(Keys.ESCAPE)));  //Tentei isso, mas n�o sei como criar a vari�vel actualkey.

				//7. Verifique os quadrados adjacentes. (Estes "filhos" -- aquele caminho dos filhos são similares,
				//conceitualmente, para a heap binaria mencionada a cima, mas não confuda eles. Eles são diferentes.
				//O caminho dos filhos são descritos no Demo 1 com pontos cinzas a frente dos pais.) Adicione aqueles 
				//quadrados dos filhos adjacens para a openList para posterior consideração se apropriado. (ver vários blocos abaixo).
				for (b = parentYval-1; b <= parentYval+1; b++){
					for (a = parentXval-1; a <= parentXval+1; a++){

						// Se não sair do mapa (faça isto primeiro para evitar erros de ArrayIndexOutOfBounds).
						if (a != -1 && b != -1 && a != mapWidth && b != mapHeight){

							//		If not already on the closed list (items on the closed list have
							//		already been considered and can now be ignored).
							//		Se não já está no closedList (items na closedList são items que já foram considerados e podem ser ignorados).
							if (whichList[a][b] != onClosedList) { <commit_msg>Traduzido todos os comentários do AStar.java para portugues<commit_after>
package br.ufba.ia.copsandrobbers.search;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;

public class AStar {

	//Declare constants
	public static final int mapWidth = 80, mapHeight = 60, tileSize = 20, numberPeople = 3;
	public static final int notfinished = 0, notStarted = 0; // constantes relacionadas ao caminho
	public static final int found = 1, nonexistent = 2; 
	public static final int walkable = 0, unwalkable = 1;    // constantes referente a habilidade de andar.
	public int onClosedList = 10;

	//Create needed arrays
	public char[][] walkability = new char[mapWidth][mapHeight];
	public int[] openList = new int[mapWidth*mapHeight+2]; //array de 1 dimensão que segunda uma lista aberta de items
	public int[][] whichList = new int[mapWidth+1][mapHeight+1];  //array de 2 dimensões usado para gravar  
	// 		se uma célula está na lista aberta ou na lista fechada.
	public int[] openX = new int[mapWidth*mapHeight+2]; //array de 1 dimensão armazenando a posição x de um item na lista aberta.
	public int[] openY = new int[mapWidth*mapHeight+2]; //array de 1 dimensão armazenando a posição y de um item na lista aberta.
	public int[][] parentX = new int[mapWidth+1][mapHeight+1]; //array de 2 dimensões para armazenar o pai de cada célular x
	public int[][] parentY = new int[mapWidth+1][mapHeight+1]; //array de 2 dimensões para armazenar o pai de cada célula y
	public int[] Fcost = new int[mapWidth*mapHeight+2];	//array de 1 dimensão para armazenar o custo F de cada célula.
	public int[][] Gcost = new int[mapWidth+1][mapHeight+1]; 	//array de 2 dimensões para armazenar o custo G para cada célula
	public int[] Hcost = new int[mapWidth*mapHeight+2];	//array de 1 dimensão para armazenar o custo H de cada célula na lista aberta
	public int[] pathLength = new int[numberPeople+1];     //armazena o tamanho do caminho encontrado para a criatura
	public int[] pathLocation = new int[numberPeople+1];   //armazena a posição atual ao longo do caminho escolhido para a criatura		
	//int* pathBank [numberPeople+1];
	public List<Integer> pathBank[] = new List[numberPeople+1];
	public List<Integer[]> pathBank2 = new ArrayList<Integer[]>();

	//Path reading variables
	public int[] pathStatus = new int[numberPeople+1];
	public int[] xPath = new int[numberPeople+1];
	public int[] yPath = new int[numberPeople+1];

	public void InitializePathfinder ()
	{
		for (int x = 0; x < numberPeople+1; x++){
			pathBank[x] = new Vector<Integer>();
			pathBank2.add(new Integer[4]);
		}
	}

	public void  EndPathfinder ()
	{
		for (int x = 0; x < numberPeople+1; x++){
			pathBank[x].clear();
			pathBank2.set(x, null);
		}
	}

	public int FindPath (int pathfinderID, int startingX, int startingY,
			int targetX, int targetY)
	{
		int onOpenList=0, parentXval=0, parentYval=0, a=0, b=0, m=0, u=0, v=0, temp=0, corner=0, numberOfOpenListItems=0, addedGCost=0, tempGcost = 0, path = 0, tempx, pathX, pathY, cellPosition, newOpenListItemID=0;

		//1. Converta os dados da localização ( em pixels ) para as cordenadas do array de walkability.
		int startX = startingX/tileSize;
		int startY = startingY/tileSize;	
		targetX = targetX/tileSize;
		targetY = targetY/tileSize;

		//2. Caminhos rápidos: Sobre certas circunstâncias, nenhum caminho é necessário.

		// Se a posição inicial e o destino estão na mesmo lugar
		if (startX == targetX && startY == targetY && pathLocation[pathfinderID] > 0)
			return found;
		if (startX == targetX && startY == targetY && pathLocation[pathfinderID] == 0)
			return nonexistent;

		//Se o quadrado alvo é unwalkable(não andável), retorne que o caminho é inexistente.
		if (walkability[targetX][targetY] == unwalkable)
		{
			xPath[pathfinderID] = startingX;
			yPath[pathfinderID] = startingY;
			return nonexistent;
		}

		//3. Resetando algumas variáveis que precisam ser limpas
		if (onClosedList > 1000000) //Resetando whichList ocasionalmente
		{
			for (int x = 0; x < mapWidth; x++) {
				for (int y = 0; y < mapHeight; y++)
					whichList [x][y] = 0;
			}
			onClosedList = 10;	
		}
		onClosedList = onClosedList+2; //alterando os valores da openList(lista aberta) e onClosed list é mais rapida do que redimming whichList() array;
		onOpenList = onClosedList-1;
		pathLength [pathfinderID] = notStarted;//i.e, = 0
		pathLocation [pathfinderID] = notStarted;//i.e, = 0
		Gcost[startX][startY] = 0; //resetando o quadrado inicial com o valor de G para 0

		//4. Adicionando a posição inicial openList de quadrados para serem verificados.
		numberOfOpenListItems = 1;
		openList[1] = 1;		//colocando este como o item do topo(e atualmente somente) da openList, que é mantida como uma heap binaria.

		openX[1] = startX;
		openY[1] = startY;

		//5. Faça o seguinte até que um caminho é encontrador ou ele não exista.
		do
		{

			//6. Se a openList não é vazia, pegue a primeira célula da lista.
			//	Esta possui o menor custo da função F na openList.
			if (numberOfOpenListItems != 0)
			{

				//7. Remova o primeiro item da openList.
				parentXval = openX[openList[1]];
				parentYval = openY[openList[1]]; //Grave as coordenadas da celula do item
				whichList[parentXval][parentYval] = onClosedList;//adicione o item para a closedList

				//OpenList = Heap binária: Delete este item da openList, que é mantido como uma heap binária. Para mais informações veja:
				// http://www.policyalmanac.org/games/binaryHeaps.htm
				numberOfOpenListItems = numberOfOpenListItems - 1;//reduzindo o numero de items da openList em 1	

				// Delete o item do topo na heap binaria, e reordene a heap, com o item de menor custo da função F indo para o topo.
				openList[1] = openList[numberOfOpenListItems+1];//mova o ultimo item na heap a cima para o slot #1
				v = 1;

				//Repita o seguinte até que o novo item no slot1 caia para a sua própria posição na heap.
				do
				{
					u = v;		
					if (2*u+1 <= numberOfOpenListItems) //Se ambos os filhos existirem
					{
						//Verifique se o custo de F do pai é maior do que cada filho.
						//Selecione o menor dos dois filhos.
						if (Fcost[openList[u]] >= Fcost[openList[2*u]]) 
							v = 2*u;
						if (Fcost[openList[v]] >= Fcost[openList[2*u+1]]) 
							v = 2*u+1;		
					}
					else
					{
						if (2*u <= numberOfOpenListItems) //Se somente o filho 1 existe
						{
							//Verifique se o custo de F do pai é maior do que o filho 1.
							if (Fcost[openList[u]] >= Fcost[openList[2*u]]) 
								v = 2*u;
						}
					}

					if (u != v) //Se o custo de F do pai é > do um dos filhos troque eles.
					{
						temp = openList[u];
						openList[u] = openList[v];
						openList[v] = temp;			
					}
					else
						break; //de outro modo, saia do loop

				}
				while (!(Gdx.input.isKeyPressed(Keys.ESCAPE)));  //Tentei isso, mas n�o sei como criar a vari�vel actualkey.

				//7. Verifique os quadrados adjacentes. (Estes "filhos" -- aquele caminho dos filhos são similares,
				//conceitualmente, para a heap binaria mencionada a cima, mas não confuda eles. Eles são diferentes.
				//O caminho dos filhos são descritos no Demo 1 com pontos cinzas a frente dos pais.) Adicione aqueles 
				//quadrados dos filhos adjacens para a openList para posterior consideração se apropriado. (ver vários blocos abaixo).
				for (b = parentYval-1; b <= parentYval+1; b++){
					for (a = parentXval-1; a <= parentXval+1; a++){

						// Se não sair do mapa (faça isto primeiro para evitar erros de ArrayIndexOutOfBounds).
						if (a != -1 && b != -1 && a != mapWidth && b != mapHeight){

							//		Se não já está no closedList (items na closedList são items que já foram considerados e podem ser ignorados).
							if (whichList[a][b] != onClosedList) { 
{'fraction_non_alphanumeric': 0.1056632459141011, 'fraction_numerical': 0.016470290130495377, 'mean_word_length': 3.343053645116919, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4440938', 'n_tokens_mistral': 6254, 'n_tokens_neox': 5474, 'n_words': 1934}