ID:50101
Title:Hunter 16
Author:Alan Chalker
Date:2008-11-07 01:33:34
Score:37654.3540
Result:37261.91 (cyc: 13, node: 834)
CPU Time:123.9775
Status:Passed
Comments:Lets see how this works
Based on:none
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