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
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
program SI
Autor Wiadomość
Laguna
Gość


Wysłany: 17-08-2009, 10:46   program SI

Wrzucę tutaj kilka moich programów. (napisanych wczoraj więc cudów nima).

dorzucę kolejne jeśli ktoś się zainteresuje.

SYSTEM CHCECK

Kod:
/******************************************
*************** SYSTEM CHCECK *************/

public void object::systemCheck()
{
    if(energyCell != null)
    {
        if(energyCell.energyLevel > 0)
        {
            if(this.temperature > 0.75)
            {
                turn(direction(space()));
                move(distance2d(this.position,space()));
                jet(-1);
                while(this.temperature > 0.2) wait(0.5);
            }
            if(energyCell.energyLevel < 0.51)
            {
                object elektrownia = radar(PowerStation,0,360,0);
                if(elektrownia != null)
                {
                    goto(elektrownia.position);
                    while(energyCell.energyLevel < 1) wait(0.5);
                }
                else message("Nie widzę elektrowni.");
                if(energyCell.energyLevel < 0.25)
                {
                    message("Ogniwo jest puste!", DisplayError);
                    sendSMS(0);
                    while(energyCell.energyLevel < 0.25) wait(1);
                }
               
            }
            else
            {
                if(this.shieldLevel < 0.55)
                {
                    object warsztat = radar(RepairCenter);
                    if(warsztat != null)
                    {
                        goto(warsztat.position);
                        while(shieldLevel < 1) wait (0.5);
                    }
                    else message("Nie widzę warsztatu.");
                }
            }
        }
        else
        {
            message("Ogniwo jest puste!", DisplayError);
            sendSMS(0);
            while(energyCell.energyLevel == 0) wait(1);
        }
    }
    else
    {
        message("Brak ogniwa!", DisplayError);
        sendSMS(1);
        while(energyCell == null)
        {
            wait(1);
        }
    }
    //message("Stan maszyny: OK", DisplayInfo);


OPIS DZIAŁANIA

1. Program sprawdza czy w ogóle w robocie znajduje się ogniwo. Jeśli nie ma wysyła SMSa do tego centrum informacji, z którego od razu odbiera go robot z programem zaopatrzeniowym i robi swoje, o tym później. Jeśli natomiast ogniwo jest przechodzimy dalej.

2. Sprawdza czy bateria jest wyczerpana, jeśli tak, program wysyła SMS do zaopatrzeniowca żeby ją zmienił. Jeśli w baterii jest co nieco energii przechodzimy dalej.

3. teraz sprawdza jak robot stoi z temperaturą silnika... tylko to złe rozwiązanie bo nie wiem jak sprawdzić czy pod dupą czasem nie ma wody. Na pewno nie space().

4. Jeśli ma mniej niż 0.51 poziomu baterii, idzie.leci się naładować. Gdy nie widzi stacji, pracuje dalej aż osiągnie 25% baterii i wysyła SMS z prośbą o wymianę.
(tutaj muszę pętlę while zamienić na do{} while(); i przeczekać czas kiedy baterii w ogóle nie ma, bo gdy zaopatrzeniowiec wyciąga baterię to warunek mi szlag trafia.

5. Sprawdzony zostaje poziom osłon, i albo idzie się naprawić albo... no pracuje do śmierci bo dlaczego nie...

PODSUMOWANIE

No i wracamy do pracy...
Używam programu do ciągłego monitorowania stanu robotów każdego typu.
Ma on kilka dziur.

Dzisiaj muszę rozwiązać pewien śmieszny problem... :D

Program publiczny (właściwie baza programów) znajduje się na całkiem innym robocie.
Gdy wysyłam SMS bezpośrednio przez funkcję sendSMS(); z innego robota, w którym wyczerpała się bateria, wszystko działa cacy, gdy program systemCheck(); wysyła SMS, zaopatrzeniowiec zmienia baterię w robocie na którym znajduje się baza programów, a nie na tym który wysłał sms xP




ZAOPATRZENIE

program wspomniany wyżej

Kod:
/******************************************
************** ZAOPATRZENIE ***************/

public void object::resupply()
{
    int zegar = 300;
    point klijent;
    int problem;
    object bateria;
   
    while(true)
    {
        if(testinfo("problem",1000) == true)
        {
            problem   = receive("problem",1000);
            klijent.x = receive("pozycjaX",1000);
            klijent.y = receive("pozycjaY",1000);
            klijent.z = receive("pozycjaZ",1000);
            bateria   = radar(PowerCell,0,360,5);
           
            deleteinfo("problem",1000);
            deleteinfo("pozycjaX",1000);
            deleteinfo("pozycjaY",1000);
            deleteinfo("pozycjaZ",1000);
           
            goto(bateria.position);
            grab();
            goto(klijent);
            if(problem == 0)
            {
                drop(Behind);
                grab();
                turn(90);
                drop();
                turn(-90);
                grab(Behind);
                drop();
            }
            else drop();
        }
        else
        {
            while(testinfo("problem",1000) == false)
            {
                wait(1);
                zegar = zegar - 1;
                if(zegar == 0) break;
            }
            if(zegar==0)
            {
                message("Brak rozkazow. Przechodzę OFFLINE.");
                break;
            }
            else zegar = 300;
        }
    }
}


OPIS DZIAŁANIA

1. Ustawia zegar na 5 minut

2. Jeśli w stacji przekaźnikowej znajdują się szukane dane, pobiera je, zapisuje sobie i od razu usuwa je ze stacji.

3. W zależności od problemu albo wymienia albo po prostu zakłada w robocie ogniwo (na razie brałem pod uwagę tylko zwykłe baterie)

4. Po wymianie baterii program uruchamia zegar, jeśli nie otrzyma nowych danych, kończy program. Jeśli zaś dostanie nowe informacje, resetuje zegar i idzie do pracy.

PODSUMOWANIE

Podstawowa komunikacja między robotami, no i działa :) użyłbym klas żeby zapobiec jednoczesnej obsłudze robota przez dwa zaopatrzeniowce... ale nawet nie wiem co to jest klasa.. xD

W miarę potrzeb rozbuduję program o m.in. sprawdzanie typu baterii, ładowanie wymienionych ogniw i ew. zbieranie rozrzuconych, odkładanie ich w miejscu docelowym i powrót do bezpiecznej bazy.

DLA CIEKAWSKICH

program do wysyłania SMS
Kod:
/******************************************
**************** SMS POMOC ****************/

public void object::sendSMS(int problem)
{
    send("problem",problem,1000);
    send("pozycjaX",this.position.x,1000);
    send("pozycjaY",this.position.y,1000);
    send("pozycjaZ",this.position.z,1000);


Na razie tyle wystarczy...
 
     
Berserker 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 18-11-2009, 20:23   

Kod:
 point klijent;
-- OWNED Q_Q
I program mogles podzielic na funkcje, malo czytelny (estetyka przydaje sie przy szukaniu bledow, gdzie tu szukac powodu dla ktorym program wybiera zla instancje? :P )
Nie martw sie, tez nie umiem sie polapac o co chodzi z tymi klasami :)
Cytat:
tylko to złe rozwiązanie bo nie wiem jak sprawdzić czy pod dupą czasem nie ma wody. Na pewno nie space().

Kod:
if(position.z - altitude) < 0
- pierwsze rozwiazanie ktore przyszlo mi do glowy.
Jesli chodzi o problem z wysylaniem smsow (doladuj konto!), to mi sie wydaje, ze wina lezy w samej funkcji sendSMS(), po prostu za duzo funkcji w jednej funkcji:P

// "Jesli chodzi o problem z wysylaniem smsow (doladuj konto!)" - ownage xD -adiblol
Ostatnio zmieniony przez adiblol 18-11-2009, 21:38, w całości zmieniany 1 raz  
 
 
     
krzychukoko


Dołączył: 11 Gru 2010
Posty: 15
Wysłany: 12-12-2010, 20:28   buuuuu

te programy nie dzialaja co prawda nie ma erora ale klikam start i nic sie nie dzieje
 
     
Apus 


Twoja ulubiona misja: 2 pierwsze na Wulkanii
Pomógł: 3 razy
Wiek: 19
Dołączył: 09 Kwi 2010
Posty: 246
Skąd: ze wsi
Wysłany: 12-12-2010, 20:39   

/o/!
To nie są programy, tylko funkcje (uruchamiane z programu).
 
     
krzychukoko


Dołączył: 11 Gru 2010
Posty: 15
Wysłany: 13-12-2010, 18:55   e tam

Ja zrobiłem program który potrzebuje 2 robotów co se wysylaja SMSy stacji przekaznikowej i robota do centrali(robot dzialo koniecznie),i dzieki temu jest kąto na którym jest kaska i jesli jest to ten z centrali pozwala przeslac wiadomosc i odejmuje 1 zł od kąta ,a jak nie ma to nie pozwala przeslac i daje wiadomosc "brak kasy na kącie".
A żeby doladowac kąto to kładziemy oprzed centralowym ogniwo elektryczne on je rozwala i daje nam do kąta +2zł(przed wlączeniem programu ustawiamy lufe tek ,że celuje w miejscie które jest około 3m przed centralowym)
// KĄTY mogą być rozwarte, ostre, wklęsłe, wypukły, może być również kąt prosty, pełny i inne. Niepełna interpunkcja. -adiblol

PROGRAM CĘTRALOWEGO
// Ciekawe, wyzej poprawnie napisales "centralowy" -adiblol
bool B;
float A,C,D,F;
object E;
while(true)
{
B=testinfo ( "1", 100000000000000 );
if(B==true)
{
A=receive( "1", 100000000000000 );
deleteinfo( "1", 100000000000000 );
C=receive("B",10000000000000000000000);
deleteinfo("B",100000000000000000000000);
D=receive("konto",10000000000);
if(D>0)
{

send("konto",D-1,1000000);
send("2",A,10000000);









}
if(D<1)
{
message("brak kasy na koncie");

}




}
E=radar(PowerCell,1,45,0,5);
if(E!=null)
{

message("rozpoczynam doładowywanie");
wait(3);
fire(1);
F=receive("konto",10000000);
send("konto",F+2,1000000);
message("doładowanie zostało dodanie");
message("stan konta=");
F=receive("konto",10000000);
message(F);



}


















}


}



A TU DO ODBIERANIE TAKIEJ WIADOMOCI I ROBIENIA COS JESLI TA WIADOMOSC MA WARTOSC 2:

extern void object::Program()
{
bool A;
float B;
while(true)
{
A=testinfo ( "2", 100000000000000 );
if(A==true)
{
B=receive("2",1000000);
if(B>1.1)
{
deleteinfo("2",10000000);
turn(1440);
}





}


}
}


(zamiast turn dajemy co robot ma zrobic jesli dostanie SMSa)

NO I NA POCZĄTKU ZANIM ZROBIMY WSZYSTKO INNE TRZEBA URZYC PROSTEGO PROGRAMU:


extern void object::Program()
{

send("konto",0,100000000);

}

// Wszystkie programy dajemy w tagu [ code ], z wcięciami, poprzez kopiowanie z katalogu program lub savegame. -adiblol
Ostatnio zmieniony przez adiblol 13-12-2010, 22:22, w całości zmieniany 1 raz  
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012