Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 
Polski Portal COLOBOTa
COLOBOT Polish Portal

Zasoby - Kolejny program do zbierania smieci.

Berserker - 08-02-2011, 00:57
Temat postu: Kolejny program do zbierania smieci.
Program pozwala wybrac, czy chcemy tworzyc ogniwa elektryczne, atomowe, czy kostki tytanu. Ma wlasny niesamowicie prymitywny sposob liczenia potrzebnej energii, jest bledoodporny (jak go testowalem to na kazda niebezpieczna sytuacje ktora udalo mi sie znalezc staralem sie zrobic dzialanie dzieki ktorym robot moze kontynuowac program normalnie). Robot zostawia uran w wyznaczonym miejscu (za pomoca odpowiedniej flagi). Ma tez pare innych fajnych rzeczy.

Kod:
extern void object::Zlomiarz()
{
    object p, pc, c, obj, flag;
    point s, start = position;
    int i, count, datasize, station[];
    int plant, target, ore, fcat;
    int r, e = 0;
    float elvl;
    string type;
    bool on;
    //Parametry
    target = Titanium;
    count = 10;
    datasize = 3;
    //--------------
    i = 0;
    float elvl_data[datasize];
    station[i++] = PowerStation;
    station[i++] = PowerCaptor;
    for(i = 0; i < datasize; i++) elvl_data[i] = 0.3;
    on = false;
    if(target == NuclearCell)
    {
        fcat = YellowFlag;
        plant = NuclearPlant;
        ore = UraniumOre;
        type = "load";
        on = true;
    }
    if(target == PowerCell)
    {
        fcat = GreenFlag;
        plant = PowerPlant;
        ore = Titanium;
        type = "load";
        on = true;
    }
    if(target == Titanium)
    {
        fcat = RedFlag;
        plant = Converter;
        ore = TitaniumOre;
        type = "search";
        on = true;
    }
    if(on != true) return;
    errmode(0);
    while(radar(fcat) == null)
    {
        if(on)
        {
            message("Waiting until target site is assigned ("+strlower(fcat+"")+" requiered)");
            on = false;
        }
        wait(1);
    }
    on = true;
    flag = radar(fcat);
    pc = radar(station);
    elvl = 0.7;
    while(true)
    {
        i = 0;
        while(Count(target) < count)
        {
            wait(2);
            p = radar(ore);
            if(p == null)
            {
                don(flag.position);
            }
            else
            {
                if(load != null && load.category != ore && load.category != target) drop();
                elvl = elvl_data[e%datasize];
                elvl_data[e%datasize] = energyCell.energyLevel;
                stage1(ore, flag.position);
                Recharge(pc, elvl*2);
                stage2(ore, plant, target, type, flag.position, elvl*2, pc);
                stage3(target, flag.position);
                elvl_data[e%datasize] -= energyCell.energyLevel;
                if(elvl_data[e%datasize] > elvl) elvl_data[e%datasize] = elvl;
                e++;
            }
            for(elvl = 0, i = 0; i < datasize; i++)
            {
                elvl += 0.2*elvl_data[i];
            }
            Recharge(pc, elvl*2);
        }
        Recharge(pc, 0.9);
        don(flag.position);
       
    }
   
}
int object::Count(int cat)
{
    object item;
    int total = 0;
    int i = 0;
   
    while ( true )
    {
        item = retobject(i++);
        if ( item == null )  return total;
       
        if ( item.category == cat and item.position.z != nan)
        {
            total ++;
        }
    }
}
void object::stage1(int ore, point c)
{
    if(load == null)
    {
        object p = radar(ore);
        if(p == null) don(c);
        else
        {
            go(p.position);
            grab();
        }
    }
}
void object::stage2(int ore, int plant, int target, string type, point c, float elvl, object pc)
{
    bool on = true;
    point s;
    while(radar(plant) == null)
    {
        if(on) message(plant+" not found. Standing by...");
        on = false;
        don(c);
       
    }
    object p = radar(plant);
    if(load != null && load.category == ore)
    {
        go(p.position);
        drop();
        move(-4);
        s = position;
        Recharge(pc, elvl);
        don(s);
        try
        {
            WFP(target, p, type);
        }
        catch(1)
        {
            return;
        }
        go(p.position);
        grab();
    }
}
void object::stage3(int target, point c)
{
    if(load != null && load.category == target)
    {
        go(space(c));
        drop();
    }
}
void object::WFP(int cat, object plant, string type)
{
    float time = lifeTime;
    if(plant == null) return;
    if(strfind(type, "load") != nan)
    {
        while(true)
        {
            if(plant.load != null)
            {
                if(plant.load.category == cat) break;
            }
            if(plant.energyCell != null)
            {
                if(plant.energyCell.category == cat) break;
            }
            wait(1);
            if(lifeTime-time > 40)
            {
                throw(1);
                break;
            }
        }
        return;
    }
    if(strfind(type, "search") != nan)
    {
        object p;
        do
        {
            p = search(cat, plant.position);
            wait(1);
            if(lifeTime-time > 40)
            {
                throw(1);
                break;
            }
        }
        while(p == null or distance2d(p.position, plant.position) > 1);
    }
}
int object::Recharge(object s, float lvl)
{
    if(energyCell.energyLevel > lvl) return 0;
    errmode(0);
    if(s == null || energyCell.category == NuclearCell)
    {
        s = SFC(energyCell.category);
        if(s == null)
        {
            return 1;
        }
        go(s.position);
        grab();
        drop(Behind);
        grab(EnergyCell);
        drop();
        grab(Behind);
        drop(EnergyCell);
    }
    else
    {
        while(go(s.position) != 0) wait(1);
        while(energyCell.energyLevel < 1) don(s.position);
    }
    return 0;
}
object object::SFC(int cat)
{
    float d = 0;
    object p = null;
    do
    {
        if(p != null) d = distance2d(p.position, position);
        p = radar(cat, 0, 360, d+0.2);
    }
    while(p != null && p.energyLevel < 0.5);
    return p;
}
int object::go(point c)
{
    errmode(0);
    point dest = c;
    int err;
    err = goto(c);
    if(err == 0) return 0;;
    if(err == 212)
    {
        if(distance2d(position, dest) > 20)
        {
            dest = space(dest);
            don(dest);
        }
        return 1;
    }
    else
    {
        dest.x = dest.x*0.5+position.x*0.5;
        dest.y = dest.y*0.5+position.y*0.5;
        go(dest);
    }
    return 0;
}
void object::don(point c)
{
    errmode(0);
    if(distance2d(c, position) > 2) goto(c);
    wait(1);
}

Sebastian12345 - 08-02-2011, 15:05

:shock:

Kod:

       if(on)
        {
            message("Waiting until target site is assigned ("+strlower(fcat+"")+" requiered)");
            on = false;
        }
        wait(1);


PO ANGIELSKU! kto by pisał program dla polaków a text który by wyświetlał mial byc po angielsku ?

adiblol - 08-02-2011, 16:06

Jak patrzę na tak ambitne programy to aż chce się CWorld robić żeby zaimplementować...
Berserker - 08-02-2011, 16:30

Cytat:
PO ANGIELSKU! kto by pisał program dla polaków a text który by wyświetlał mial byc po angielsku ?


W ten sposob skutecznie eliminuje wiekszosc kretynow ktorzy by nie umieli uruchomic takiego programu :D

@up
Widzisz, zawsze to dobra motywacja :)

-----------------
Ok, a teraz konkrety. Kto uruchomil, komu nie dzialalo, kto ma jakies zastrzezenia? Przydalyby mi sie jakies uwagi.


Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group