| Code: | function [dRow,dCol,action,mark] = solver(mainMap,foodMap,myAntMap,opAntMap, ...
myScentMap,opScentMap,myDeathMap,opDeathMap)
% Army ant solver
% Created by Alan Chalker
% 11/6/08
%
% Please leave comments in if you reuse this!!!!!
%Default outputs
mark=0;
action=1;
%Check for enemy ant in square, attack if present
if opAntMap(3,3) && rand <.8
dRow = 0;
dCol = 0;
action = -1;
return;
end
%Create an obstacle mask
obsmask=~isnan(mainMap);
nearbyopen=[obsmask(2,2:4) obsmask(3,2) obsmask(3,4) obsmask(4,2:4)];
nearbymask=[1:8];
posmoves=nearbymask(nearbyopen);
%Check for nearby enemies and move towards them
if nnz(opAntMap)
nearbyopants=[sum(sum(opAntMap(1:2,1:2))) ...
sum(opAntMap(1:2,3)) ...
sum(sum(opAntMap(1:2,4:5))) ...
sum(opAntMap(3,1:2)) ...
sum(opAntMap(3,4:5)) ...
sum(sum(opAntMap(4:5,1:2))) ...
sum(opAntMap(4:5,3)) ...
sum(sum(opAntMap(4:5,4:5)))];
nearbyopants=nearbyopants.*nearbyopen;
if nnz(nearbyopants)
[val, move]=max(nearbyopants);
action=0;
[dRow,dCol]=selectmove(mainMap,move,posmoves);
return;
end
end
%create nearby base mask
baseMap=mainMap==1;
if nnz(baseMap)
nearbybase=[sum(sum(baseMap(1:2,1:2))) ...
sum(baseMap(1:2,3)) ...
sum(sum(baseMap(1:2,4:5))) ...
sum(baseMap(3,1:2)) ...
sum(baseMap(3,4:5)) ...
sum(sum(baseMap(4:5,1:2))) ...
sum(baseMap(4:5,3)) ...
sum(sum(baseMap(4:5,4:5)))];
nearbybase=nearbybase.*nearbyopen;
else
nearbybase=zeros(1,8);
end
if nnz(nearbybase)
mark=100;
end
%if not carrying or at base, check for sugar in view and go towards it
if foodMap(3,3)==0 || mainMap(3,3)==1
action=0;
if nnz(foodMap)
nearbyfood=[sum(sum(foodMap(1:2,1:2))) ...
sum(foodMap(1:2,3)) ...
sum(sum(foodMap(1:2,4:5))) ...
sum(foodMap(3,1:2)) ...
sum(foodMap(3,4:5)) ...
sum(sum(foodMap(4:5,1:2))) ...
sum(foodMap(4:5,3)) ...
sum(sum(foodMap(4:5,4:5)))];
nearbyfood=nearbyfood.*~nearbybase.*nearbyopen;
[val, move]=max(nearbyfood);
elseif ~myScentMap % try to go away from scent
nearbyscent=[sum(sum(myScentMap(1:2,1:2))) ...
sum(myScentMap(1:2,3)) ...
sum(sum(myScentMap(1:2,4:5))) ...
sum(myScentMap(3,1:2)) ...
sum(myScentMap(3,4:5)) ...
sum(sum(myScentMap(4:5,1:2))) ...
sum(myScentMap(4:5,3)) ...
sum(sum(myScentMap(4:5,4:5)))];
nearbyscent=nearbyscent+(~nearbyopen)*99999;
[val, move]=min(nearbyscent);
[dRow,dCol]=selectmove(mainMap,move,posmoves);
mark=10;
else
move=0;
end
[dRow,dCol]=selectmove(mainMap,move,posmoves);
return;
end
%Must be carrying, so search for base and go towards it
if any(any(nearbybase))
[val, move]=max(nearbybase);
[dRow,dCol]=selectmove(mainMap,move,posmoves);
return;
end
%Search for scent if no base
if any(any(myScentMap))
nearbyscent=[sum(sum(myScentMap(1:2,1:2))) ...
sum(myScentMap(1:2,3)) ...
sum(sum(myScentMap(1:2,4:5))) ...
sum(myScentMap(3,1:2)) ...
sum(myScentMap(3,4:5)) ...
sum(sum(myScentMap(4:5,1:2))) ...
sum(myScentMap(4:5,3)) ...
sum(sum(myScentMap(4:5,4:5)))];
nearbyscent=nearbyscent.*nearbyopen;
[val, move]=max(nearbyscent);
[dRow,dCol]=selectmove(mainMap,move,posmoves);
mark=0;
return;
end
% Else make a random move
[dRow,dCol]=selectmove(mainMap,0,posmoves);
function [dRow,dCol]=selectmove(mainMap,move,posmoves)
%check for obstacles and randomly pick direction
if ~(move==posmoves)
move=posmoves(round(rand*(length(posmoves)-1))+1);
end
dRow=0;
dCol=0;
switch move
case {1 2 3}
dRow=-1;
case {6 7 8}
dRow=1;
end
switch move
case {1 4 6}
dCol=-1;
case {3 5 8}
dCol=1;
end |