public Move ActionSelector(Coordinates pacmanCoordinates, List <Coordinates> ghostCoordinates) { System.Random random = new System.Random(); bool set = false; List <Move> moveList = Movement.GetValidMoves(pacmanCoordinates); Move selectedMove = moveList[0]; float rand = (float)random.Next(0, 100) / 100.0f; if (_epsilon > rand) { Debug.Log("Random action"); set = true; int randomIndex = random.Next(0, moveList.Count); selectedMove = moveList[randomIndex]; } else { Coordinates nearestFood = FindNearestFood(pacmanCoordinates); QState tempQState = new QState(pacmanCoordinates, ghostCoordinates, nearestFood); float qValue = CalcQValue(tempQState); Coordinates pacmanCoordCopy = new Coordinates(pacmanCoordinates.X, pacmanCoordinates.Y); foreach (Move move in moveList) { pacmanCoordCopy.Move(move); nearestFood = FindNearestFood(pacmanCoordinates); if (nearestFood - pacmanCoordinates == 0) { Debug.LogError("pacman"); } tempQState.SetState(pacmanCoordCopy, ghostCoordinates, nearestFood); float tempQValue = CalcQValue(tempQState); if (qValue <= tempQValue) { qValue = tempQValue; selectedMove = move; set = true; Debug.Log("Max Action"); } pacmanCoordCopy.X = pacmanCoordinates.X; pacmanCoordCopy.Y = pacmanCoordinates.Y; } } if (set) { Debug.Log($"set {selectedMove}"); } else { Debug.LogWarning("never Set an action BITCH!"); } return(selectedMove); }