| Code: | function [dRow,dCol,action,mark] = solver(mainMap,foodMap,myAntMap,opAntMap, ...
myScentMap,opScentMap,myDeathMap,opDeathMap)
%disp(10);
myScentMap(mainMap == 1) = 1e10;
myScentMap(isnan(mainMap)) = 0;
% do only 3x3 navigation
mainMap = mainMap(2:4,2:4);
foodMap = foodMap(2:4,2:4);
myAntMap = myAntMap(2:4,2:4);
opAntMap = opAntMap(2:4,2:4);
myScentMap = myScentMap(2:4,2:4);
foodMap(mainMap == 1) = 0;
mainMap(5) = nan;
rowIdx = [-1 0 1 -1 0 1 -1 0 1];
colIdx = [-1 -1 -1 0 0 0 1 1 1];
[where,action,mark] = doSolver(mainMap,foodMap,myAntMap,opAntMap,myScentMap);
dRow = rowIdx(where);
dCol = colIdx(where);
end
function [where,action,mark] = doSolver(mainMap,foodMap,myAntMap,opAntMap,scentMap)
we = myAntMap(5);
% mark way back
[scMax,home] = wayHome(scentMap);
scHere = scentMap(5);
scDelta = scMax-scHere-20;
mark = floor(scDelta/we);
% fight
if opAntMap(5) > 0
action = -1;
where = 5;
return;
end
% where is home?
if scMax == 0
where = wander(mainMap <= 0);
action = 1;
return;
end
farMap = scentMap<scHere;
% set track
foodHere = foodMap(5);
if foodHere > we
action = 1;
where = home;
return;
end
% far food in sight
farFoodMap = foodMap .* farMap;
if any(farFoodMap(:))
[amount,where] = max(farFoodMap(:));
action = 0;
return;
end
% sit on less food
if foodHere > 0
action = 1;
where = home;
return;
end
% goto near food
if any(foodMap(:))
[amount,where] = max(foodMap(:));
action = 0;
return;
end
% wander around
sc = scentMap;
sc(~(mainMap <= 0)) = 1e20;
where = wander(sc < (scHere-200));
if where < 0
where = wander(mainMap <= 0);
end
action = 0;
end
function where = wander(map)
moves = find(map);
if numel(moves) > 0
where = moves(floor (rand*length(moves))+1);
else
where = -1;
end
end
function [scent,home] = wayHome(scentMap)
sc = scentMap + rand(3)*0.0001;
%sc = scentMap;
[scent,home] = max(sc(:));
scent = floor(scent);
end
|