|
Forum - Polski Portal COLOBOTa |
|
|
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...
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
|
|
|
-- 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? )
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 |
|
|
|
|
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|