Atividade 1
Foi realizado um programa para controlar a criatura desde o programa cliente. A criatura realiza as seguintes ações:
- Se tem uma parede na frente então vire à direita.
- Se tem algum objeto diferente a uma parede, comida ou uma criatura a menos de 40 unidades de distancia, então pegar o objeto.
- Se tem comida a menos do que 40 unidades de distancia mas a energia é superior do que 500 então vire à direita para esquivar a comida
- Se tem joia na frente então adicione ela a uma lista de joias
- Se tem comida na frende então adicione ela a uma lista de comida
- Se tem baixa energia (Fuel < 500) então procure na lista de comida qual é a que fica mais perto e vai por ela.
- Se tem elementos na lista de joias, então procura a joia que está mais perto e vai por ela.
- Se não tem joia nenhuma na frente então vire à direita.
Cada vez que a criatura pega um elemento ela verifica a lista de objetos que ela possui com a lista de objetivos (leaflet) se tem todas as joias que estão na leaflet o programa acaba e a criatura se detêm.
Neste programa inicial a criatura identifica a joia mais cercana e vai por ela sem verificar a cor e se ela é um objetivo ou não, assim ela vai pegar mais joias das que realmente precisa. Mas quando o número mínimo de joias é atingido o programa para e o jogo termina.
Inicialmente é gerado o mundo, é criada a criatura e é chamado o método StartWorld que gera as paredes externas do mundo, posiciona aleatoriamente 5 joias de cada tipo (se tem 6 tipos de joias então no total são geradas 30 joias) e finalmente são posicionadas aleatoriamente 3 comidas.
Depois é pedido para o servidos criar uma leaflet.
Neste ponto foram criadas classes para organizar os objetivos da criatura assim:
- A classe Goal, possui 4 atributos:
Color: Color da joia que deve ser procurada
NumRequest: número de joias que devem ser obtidas da cor dada por Color
NumStack: número de joias que já foram pegadas pela criatura
completed: Se o numero de joias solicitadas é igual ao que a criatura já pegou então o objetivo está completo e completed = True, senão, então completed = False
- A classe Leaflet é uma lista de objetivos (Golas), assim ela está composta por 3 atributos:
- NumGoals: número de objetivos na lista
- Points: número de pontos que a criatura ganha por cumprir a lista de objetivos
- GoalsList: lista de clases tipo Goal com os objetivos a serem cumpridos
Finalmente foram feitas duas modificações na classe Creature: foram incluídas duas listas. A primeira é uma lista de leaflets ou seja, uma lista de objetos tipo Leaflet, e uma lista de objetos tipo Thing que contem todas as joias que a criatura já pegou.
Foram utilizadas 4 ações:
private DimensionValuePair InputWallAhead;
private DimensionValuePair InputJewel;
private DimensionValuePair InputFoodAhead;
private DimensionValuePair InputSackIt;
As regras utilizadas foram as seguintes:
- Se tem uma parede na frente então vire à direita:
É criado um foreach para avaliar cada elemento dentro da sensorialInformation
List<Thing> JewelList = new List<Thing>();
List<Thing> FoodList = new List<Thing>();
foreach (Thing item in sensorialInformation)
{
2. Se tem algum objeto diferente a uma parede, comida ou uma criatura a menos de 40 unidades de distancia, então pegar o objeto.
3. Se tem comida a menos do que 40 unidades de distancia mas a energia é superior do que 500 então vire à direita para esquivar a comida
4. Se tem joia na frente então adicione ela a uma lista de joias
5. Se tem comida na frende então adicione ela a uma lista de comida
6. Se tem baixa energia (Fuel < 500) então procure na lista de comida qual é a que fica mais perto e vai por ela
7. Se tem elementos na lista de joias, então procura a joia que está mais perto e vai por ela.
8. Se não tem joia nenhuma na frente então vire à direita.
A informação total apresentada durante o jogo é apresentada na seguinte figura. Quando a criatura consegue pegar todas as joias que estão no leaflet é jogo termina e a criatura fica quieta na ultima posição.
Foi necessária a criação do código que realizara o Parse do leaftlet gerado no servidor. O código é apresentado a continuação:
A seguinte figura apresenta a criatura durante o jogo:
Quando a criatura acaba ela para e o programa termina
Melhoras a fazer
É possível melhorar o tempo que toma a criatura em cumprir as leaflet se, por exemplo, ela fizera uma filtragem das joias que estão no seu leflet, para não perder tempo pegando joias que não precisa.
Também pode-se usar a memoria, neste caso ela só procura o que ela esta vendo, mas é possível guardar na memoria assim ela sabe aonde estão as coisas que ela já viu mas no momento não tem na frente.
Video
Video Exemplo do Jogo: http://www.youtube.com/watch?v=LpfQSHVUGyo
Arquivos
- Arquivo com os executáveis do controlador: aqui
- Arquivo com código fonte: aqui
Modificações
Foram feitas algumas modificações para melhorar o desempenho da criatura.
Foram criadas duas listas, uma como memoria das joias que ele já viu mas que ainda não pegou, e uma das joias que ele esta vendo atualmente. As regras de decisão ficaram igual, só foi melhorado o argumento da função setgoto, para a criatura procurar pelas joias que estão no seu leaftlet. Agora se dentro das joias que a criatura consegui ver tem alguma que esta dentro do leaftlet então adiciona a uma lista, ao final ela vai ir pela joia que está mais perto. Se não tem nenhuma joia na frente dele, então procura na lista de memoria se ele alguma vez viu uma joia que está sendo procurada, se for assim vai por ela.
Os arquivos com a nova versão estão disponíveis a seguir:
- Arquivo com os executáveis do controlador: aqui
- Arquivo com código fonte: aqui