ID:49957
Title:TheLastMonkey - 30%
Author:Fel
Date:2008-11-06 11:06:32
Score:26587.4484
Result:22197.05 (cyc: 44, node: 1508)
CPU Time:160.2246
Status:Passed
Comments:
Based on:none
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