| Code: | function [dRow,dCol,action,mark] = solver(mainMap,foodMap,myAntMap,opAntMap, ...
myScentMap,opScentMap,myDeathMap,opDeathMap)
% Defino las zonas de mi tablero
O = [13];
I = [7;8;9;12;14;17;18;19];
A = [1;2;3;6;11];
B = [11;16;21;22;23];
C = [3;4;5;10;15];
D = [15;20;25;23;24];
dR = [];
iter = 0;
iterMAX = 4;
% Inicializo el movimiento al alguno válido
while isempty(dR) && iter < iterMAX
pos = I(round(rand*7) + 1);
if ~isnan(mainMap(pos))
[R, C] = ind2sub([5,5],pos);
dR = R - 3;
dC = C - 3;
end
iter = iter + 1;
end
if isempty(dR)
dRow = round(rand*2) - 1;
dCol = round(rand*2) - 1;
else
dRow = dR;
dCol = dC;
end
mark = 0;
% Creo el mapa de comida util
foodMap = foodMap.*(~(mainMap==1)); % Quito las comidas que estén en casa
% Extraer información de mi situacion
EstoyEnCasa = mainMap(13)==1;
BuscandoComida = foodMap(O)==0;
CargadaDeComida = foodMap(O)~=0;
% Información de la comida
foodMap = foodMap - (myAntMap>=1); % Si ya hay una hormiga ahí no considero que haya comida
ComidaCerca = sum(foodMap(I));
ComidaEnA = sum(foodMap(A));
ComidaEnB = sum(foodMap(B));
ComidaEnC = sum(foodMap(C));
ComidaEnD = sum(foodMap(D));
VeoComida = (ComidaCerca + ComidaEnA + ComidaEnB + ComidaEnC + ComidaEnD)>0;
% Información del hormiguero
CasaCerca = sum(mainMap(I)==1);
CasaEnA = sum(mainMap(A)==1);
CasaEnB = sum(mainMap(B)==1);
CasaEnC = sum(mainMap(C)==1);
CasaEnD = sum(mainMap(D)==1);
VeoCasa = (CasaCerca + CasaEnA + CasaEnB + CasaEnC + CasaEnD)>0;
% Información del rastro
RastroCerca = sum(myScentMap(I));
RastroEnA = sum(myScentMap(A));
RastroEnB = sum(myScentMap(B));
RastroEnC = sum(myScentMap(C));
RastroEnD = sum(myScentMap(D));
VeoRastro = (RastroCerca + RastroEnA + RastroEnB + RastroEnC + RastroEnD)>0;
% Información de los enemigos
EnemigoCerca = sum(opAntMap(I));
EnemigoEnA = sum(opAntMap(A));
EnemigoEnB = sum(opAntMap(B));
EnemigoEnC = sum(opAntMap(C));
EnemigoEnD = sum(opAntMap(D));
VeoEnemigo = (EnemigoCerca + EnemigoEnA + EnemigoEnB + EnemigoEnC + EnemigoEnD)>0;
% Decido si soy una obrera o soy una asesina
ModoAsesino = 1*(round(rand*8)<4);
if VeoEnemigo*ModoAsesino
% SOY UNA ASESINA
action = -1;
% disp('Veo Enemigo');
% Si hay un enemigo cerca me muevo a su posicion
if EnemigoCerca
% disp(' Puedo alcanzar al Enemigo');
[maximaEnemigo, posicion] = max(opAntMap(I));
[R, C] = ind2sub([5,5],I(posicion));
dR = 0;
dC = 0;
else
% disp(' Me muevo hacia el enemigo');
% Si la veo Lejos: Me muevo hacia el enemigo
dR = [];
VectorEnemigo = [EnemigoEnA;EnemigoEnB;EnemigoEnC;EnemigoEnD];
while isempty(dR) && sum(VectorEnemigo)>0
[maximaEnemigo, direccion] = max(VectorEnemigo);
if direccion == 1
[dR, dC] = moveToA(mainMap);
elseif direccion == 2
[dR, dC] = moveToB(mainMap);
elseif direccion == 3
[dR, dC] = moveToC(mainMap);
elseif direccion == 4
[dR, dC] = moveToD(mainMap);
end
VectorEnemigo(direccion) = 0;
end
end
if isempty(dR)
else
dRow = dR;
dCol = dC;
end
else
% SOY UNA OBRERA
action = 0;
% Si estoy buscando comida y la veo
if BuscandoComida && VeoComida
% Si hay comida cerca me muevo a su posicion
if ComidaCerca
% disp(' Puedo alcanzar la Comida');
[maximaComida, posicion] = max(foodMap(I));
[R, C] = ind2sub([5,5],I(posicion));
dR = R - 3;
dC = C - 3;
else
% disp(' Me muevo hacia la comida');
% Si la veo Lejos: Me muevo hacia la comida
dR = [];
VectorComida = [ComidaEnA;ComidaEnB;ComidaEnC;ComidaEnD];
while isempty(dR) && sum(VectorComida)>0
[maximaComida, direccion] = max(VectorComida);
if direccion == 1
[dR, dC] = moveToA(mainMap);
elseif direccion == 2
[dR, dC] = moveToB(mainMap);
elseif direccion == 3
[dR, dC] = moveToC(mainMap);
elseif direccion == 4
[dR, dC] = moveToD(mainMap);
end
VectorComida(direccion) = 0;
end
end
if isempty(dR)
else
dRow = dR;
dCol = dC;
end
else
% voy dejando rastro
VectorRastro = [RastroEnA;RastroEnB;RastroEnC;RastroEnD];
if sum(VectorRastro)>0
mark = 25*0;
end
end
% Si estoy encima de la comida
if CargadaDeComida
% Cargo con la comida
action = 1;
if VeoCasa
% disp('Veo el Hormiguero');
% Si esta el hormiguero cerca me muevo a su posicion
if CasaCerca
% disp(' Puedo alcanzar el Hormiguero');
[maximaCasa, posicion] = max(mainMap(I)==1);
[R, C] = ind2sub([5,5],I(posicion));
dR = R - 3;
dC = C - 3;
mark = 70;
else
% disp(' Me muevo hacia el Hormiguero');
% Si la veo Lejos: Me muevo hacia la comida
dR = [];
VectorCasa = [CasaEnA;CasaEnB;CasaEnC;CasaEnD];
while isempty(dR) && sum(VectorCasa)>0
[maximaCasa, direccion] = max(VectorCasa);
if direccion == 1
[dR, dC] = moveToA(mainMap);
elseif direccion == 2
[dR, dC] = moveToB(mainMap);
elseif direccion == 3
[dR, dC] = moveToC(mainMap);
elseif direccion == 4
[dR, dC] = moveToD(mainMap);
end
VectorCasa(direccion) = 0;
end
VectorRastro = [RastroEnA;RastroEnB;RastroEnC;RastroEnD];
if sum(VectorRastro)>0
mark = 90;
end
end
if isempty(dR)
else
dRow = dR;
dCol = dC;
end
else
% Sigo el rastro
% Si hay rastro cerca me muevo a su posicion
if RastroCerca
% disp(' Puedo alcanzar la Comida');
[maximaRastro, posicion] = max(myScentMap(I));
[R, C] = ind2sub([5,5],I(posicion));
dR = R - 3;
dC = C - 3;
mark = 10;
else
% disp(' Me muevo hacia la comida');
% Si la veo Lejos: Me muevo hacia la comida
dR = [];
VectorRastro = [RastroEnA;RastroEnB;RastroEnC;RastroEnD];
while isempty(dR) && sum(VectorRastro)>0
[maximaRastro, direccion] = max(VectorRastro);
if direccion == 1
[dR, dC] = moveToA(mainMap);
elseif direccion == 2
[dR, dC] = moveToB(mainMap);
elseif direccion == 3
[dR, dC] = moveToC(mainMap);
elseif direccion == 4
[dR, dC] = moveToD(mainMap);
end
VectorRastro(direccion) = 0;
if maximaRastro > 100
mark = 10;
end
end
end
end
end
end
end
function [dR,dC] = moveToA(mainMap)
if ~isnan(mainMap(7))
dR = -1;
dC = -1;
elseif sum(isnan(mainMap([7;8;12])))>1
dR = [];
dC = [];
elseif ~isnan(mainMap(8))
dR = 0;
dC = -1;
elseif ~isnan(mainMap(12))
dR = -1;
dC = 0;
else
dR = [];
dC = [];
end
end
function [dR,dC] = moveToB(mainMap)
if ~isnan(mainMap(17))
dR = -1;
dC = 1;
elseif sum(isnan(mainMap([17;18;12])))>1
dR = [];
dC = [];
elseif ~isnan(mainMap(18))
dR = 0;
dC = 1;
elseif ~isnan(mainMap(12))
dR = -1;
dC = 0;
else
dR = [];
dC = [];
end
end
function [dR,dC] = moveToC(mainMap)
rnd = round(rand);
if ~isnan(mainMap(9))
dR = 1;
dC = -1;
elseif sum(isnan(mainMap([9;8;14])))>1
dR = [];
dC = [];
elseif ~isnan(mainMap(8))
dR = 0;
dC = -1;
elseif ~isnan(mainMap(14))
dR = 1;
dC = 0;
else
dR = [];
dC = [];
end
end
function [dR,dC] = moveToD(mainMap)
rnd = round(rand);
if ~isnan(mainMap(19))
dR = 1;
dC = 1;
elseif sum(isnan(mainMap([19;18;14])))>1
dR = [];
dC = [];
elseif ~isnan(mainMap(18))
dR = 0;
dC = 1;
elseif ~isnan(mainMap(14))
dR = 1;
dC = 0;
else
dR = [];
dC = [];
end
end |