|
Polski Portal COLOBOTa COLOBOT Polish Portal |
|
Zasoby - Do uranu
C ruels! - 23-01-2011, 14:51 Temat postu: Do uranu Ten program działa tak:
1.Robot wyszukuje najbliższy kawałek uranu.
2.Leci do niego i zabiera go obok NIEBIESKIEJ flagi(gdy to zrobi przesuńcie ten kawałek bo inaczej może wywalić błąd).
3.Wraca do miejsca zbierania,które musi być oznaczone CZERWONĄ flagą
4.Powtarza punkty 1-3 w nieskończoność dopóki robot nie zostanie zniszczony/nie skończy mu się bateria/uran.
Kod: |
extern void object::Uran()
{
while (true)
{
object item;
item = radar(UraniumOre);
goto(item.position);
grab();
object flaga;
flaga = radar(BlueFlag);
goto(flaga.position);
drop();
object flaga2;
flaga2 = radar(RedFlag);
goto(flaga2.position);
}
}
|
Wszelkie poprawki i uwagi mile widziane.Program zrobiony dzisiaj ale nie był robiony na szybko.Sprawdzałem go na nurku (dla niego pierwotnie był ten program) i transporterze latającym na user mapie od Thorin12(ta co wygląda jak pustynna wyspa z dużą górą pośrodku z mrówkami pod grawiroślinami).
Simbax - 23-01-2011, 15:10
Strasznie prosty ten program... Po co ma być oznaczone jakieś "miejsce zbierania"? Jak robot ma zbierać uran to mam gdzieś czy poleci do miejsca 2 metry obok czy na drugi koniec mapy - ma po prostu mi przynieść uran. Chyba, że nie rozumiem jaki cel ma ten program
C ruels! napisał/a: | gdy to zrobi przesuńcie ten kawałek bo inaczej może wywalić błąd |
Jak to Berserker gdzieś napisał: masz móc w tym czasie zjeść obiad.
Program zbyt prosty... Coś takiego może napisać "na szybko" nawet zaczynający naukę CBot.
Apus - 23-01-2011, 17:54
C ruels! napisał/a: | Kod: |
extern void object::Uran()
{
while (true)
{
object item;
item = radar(UraniumOre);
goto(item.position);
grab();
object flaga;
flaga = radar(BlueFlag);
goto(flaga.position);
drop();
object flaga2;
flaga2 = radar(RedFlag);
goto(flaga2.position);
}
}
|
|
1. po co pisać object item ... object flaga ... object flaga2 jak można napisać np. object item, flaga, flaga2.
2. Jeszcze lepiej użyć tylko 1 zmiennej i w niej zapisywać po kolei pozycję rudy i flag.
3. Jedynie osa jest w stanie umieścić rudę dokładnie na pozycji flagi. Proponuję żeby robot zbierał rudę z okolic flagi (polecenie search).
4.
C ruels! napisał/a: | 2.Leci do niego i zabiera go obok NIEBIESKIEJ flagi(gdy to zrobi przesuńcie ten kawałek bo inaczej może wywalić błąd). |
Tu też można użyć search. Niech robot wyszuka wolne miejsce w okolicy flagi i tam zostawi rudę.
5. Mam wrażenie że znasz tylko polecenia while, grab, drop, radar i goto.
.
Edit: kto zaznaczył 5 bardzo dobry? C ruels! ?
Zaraz dodam poprawiony program.
Edit2:
Kod: |
extern void object::Uran()
{
while (true)
{
object a, b;
a = radar(BlueFlag);
b = search(UraniumOre,a);
goto(b.position);
grab();
a = radar(RedFlag);
b = search(space,a); //nie wiem czy dobrze, ale to ma znaleźć wolna pozycję koło flagi
goto(b.position);
drop();
}
message ("error 704, wyszedłem z pętli while(true)",DisplayError);
} |
Emxx52 - 23-01-2011, 20:15
Apus napisał/a: | nie wiem czy dobrze |
Bo nie dobrze: search znajduje obiekt niedaleko pozycji a nie niedaleko obiektu (search(UraniumOre,a.position);), a jak chcesz wyznaczyć pustą pozycję niedaleko flagi piszesz: space(a.position,2,5,10);
[ Dodano: 23-01-2011, 20:19 ]
No to taka mała poprawka tego głupiego programu
Kod: | extern void object::Uran()
{
while (true)
{
object a, b;
a = radar(RedFlag);
b = search(UraniumOre,a.position);
goto(b.position);
grab();
a = radar(BlueFlag);
goto(space(a.position,2,5,10));
drop();
}
message ("error 704, wyszedłem z pętli while(true)",DisplayError);
} |
Simbax - 23-01-2011, 20:32
@offtop: Wiecie co myślę? Wrzucajmy programy z błędami i bezcelowością! Takie, żeby nikt się nie mógł powstrzymać od skomentowania. Po co? Ano, żeby zwiększyć aktywność na forum
adiblol - 23-01-2011, 21:01
Apus - 24-01-2011, 11:19
Emxx52 napisał/a: | Apus napisał/a: | nie wiem czy dobrze |
Bo nie dobrze: search znajduje obiekt niedaleko pozycji a nie niedaleko obiektu (search(UraniumOre,a.position);), a jak chcesz wyznaczyć pustą pozycję niedaleko flagi piszesz: space(a.position,2,5,10); |
Dawno nie pisałem programu. Zresztą każdy wie o co chodzi. Często zapominam gdzieś dopisać '.position'. Nie pamiętałem tez parametrów space(); więc po prostu napisałem 'space'. Możesz mi wyjaśnić co oznacza to 2,5,10? Domyślam się że chodzi o promień wolnej przestrzeni, jej max odległość od punktu.
To teraz znowu ja poprawię program:
Kod: | extern void object::Uran()
{
while (true)
{
object a, b;
a = radar(RedFlag);
b = search(UraniumOre,a.position);
if (b == null);
{
message("skończyła się ruda",DisplayWarning); //na niebiesko
break;
}
goto(b.position);
grab();
a = radar(BlueFlag);
b = space(a.position,2,5,10);
if (b == null);
{
message("skończyło się wolne miejsce",DisplayWarning); //na niebiesko
drop();
break;
}
goto(b.position);
drop();
}
if (a.position =! b.position)
{
motor(1,-1);
shield(25, 1);
wait(3600);
}
else
{
message("program zakończony",DisplayInfo); //na zielono
}
} |
Emxx52 - 24-01-2011, 12:44
2 to dystans od innego obiektu, 5 to minimum metrów od flagi, a 10 to max odległość od flagi
C ruels! - 24-01-2011, 17:16
No i co że prosty?Ważne,ze działa!
Raptor - 24-01-2011, 23:08
Nie C ruels. Podstawą programowania jest obmyślanie nowych metod optymalizacji kodu, przy zachowaniu jego funkcjonalności i na odwrót.
Apus - 25-01-2011, 11:14
Emxx52 napisał/a: | 2 to dystans od innego obiektu, 5 to minimum metrów od flagi, a 10 to max odległość od flagi |
Aha.
To jeszcze jedna poprawka.
Kod: | extern void object::Uran()
{
while (true)
{
object a, b;
a = radar(RedFlag);
b = search(UraniumOre,a.position);
if (b == null);
{
message("skończyła się ruda",DisplayWarning); //na niebiesko
break;
}
goto(b.position);
grab();
a = radar(BlueFlag);
b = space(a.position,2,0,15); //poprawka
if (b == null);
{
message("skończyło się wolne miejsce",DisplayWarning); //na niebiesko
drop();
break;
}
goto(b.position);
drop();
}
message("program zakończony",DisplayInfo); //na zielono
} |
Emxx52 - 25-01-2011, 11:50
Ale popełniasz bardzo duży błąd:
Apus napisał/a: | b = space(a.position,2,0,15); | Pusta pozycja nie jest obiektem
Powinno być tak
Kod: | extern void object::Uran()
{
while (true)
{
object a, b;
a = radar(RedFlag);
b = search(UraniumOre,a.position);
if (b == null);
{
message("skończyła się ruda",DisplayWarning); //na niebiesko
break;
}
goto(b.position);
grab();
a = radar(BlueFlag);
goto(space(a.position,2,0,15);
drop();
}
message("Program zakończony",DisplayInfo); //na zielono
} |
krzys_h - 26-01-2011, 13:56
Nie, bo zmienna typu point nie może przyjąć wartości null
Apus - 26-01-2011, 14:02
krzys_h napisał/a: | Nie, bo zmienna typu point nie może przyjąć wartości null |
Jak to nie może? Napisałem w programie 'c = space(a.position,2,0,15);' czyli jeśli nie będzie wolnego miejsca o podanych parametrach to zmienna c przyjmie wartość null.
krzys_h - 26-01-2011, 14:54
Apus napisał/a: | krzys_h napisał/a: | Nie, bo zmienna typu point nie może przyjąć wartości null |
Jak to nie może? Napisałem w programie 'c = space(a.position,2,0,15);' czyli jeśli nie będzie wolnego miejsca o podanych parametrach to zmienna c przyjmie wartość null. |
A właśnie, że nie przyjmie. Powód? Wpisz w programie:
A jak ci sie nie chce to powiem co dostaniesz: błąd Zły typ dla przypisania. To oznacza, że zmienna typu point nie może mieć wartości null
Apus - 26-01-2011, 15:08
W takim razie jak sprawdzić czy jest wolne miejsce o podanych parametrach?
krzys_h - 26-01-2011, 15:16
Mnie nie pytaj Popatrz jakie wartości x, y i z zwraca wtedy funkcja, może to cie naprowadzi.
bbiidduull - 26-01-2011, 15:52
Cytat: | W takim razie jak sprawdzić czy jest wolne miejsce o podanych parametrach? |
Chociażby tak:
Kod: |
point srodek;
srodek.x=0+2;// +2 to dlatego ze robot jest duży i akurat zakrywa ten punkt
srodek.y=0+2;// a sprawdzany punkt to srodek(0,0);
errmode(0);
if(goto(srodek)!=0)
{
message("Zajęte");
}
|
Do sprawdzenia czy jest wolne i nie ma np. Uranu czy Ogniwa, wystarczy skasowac "+2" z obu x i y.
Apus - 26-01-2011, 15:56
bbiidduull napisał/a: | Cytat: | W takim razie jak sprawdzić czy jest wolne miejsce o podanych parametrach? |
Chociażby tak:
Kod: |
point srodek;
srodek.x=0+2;// +2 to dlatego ze robot jest duży i akurat zakrywa ten punkt
srodek.y=0+2;// a sprawdzany punkt to srodek(0,0);
errmode(0);
if(goto(srodek)!=0)
{
message("Zajęte");
}
|
|
A jak to umieścić w tamtym programie? Bo ja tego co napisałeś kompletnie nie rozumiem.
adiblol - 26-01-2011, 16:03
Lepiej funkcją radar, radar(0) zwraca dowolny obiekt.
bbiidduull - 26-01-2011, 16:04
Powiedzmy ze wyprodukowany Tytan chcesz przenieść w określone miejsce. Tym określonym miejscem w tym przypadku jest punkt "srodek(0,0);" (środek mapy), jeśli ten punkt "srodek" będzie zajęty, goto się wykrzaczy. I tu jest warunek ze jak się wykrzaczy to znaczy ze jest zajęte miejsce.
krzys_h - 26-01-2011, 16:08
Ale on nie chce sprawdzić "czy dany punkt jest wolnym miejscem" tylko "czy istnieje wolne miejsce o podanych parametrach"
bbiidduull - 26-01-2011, 16:12
A jak wolne miejsce o podanych parametrach nie istnieje.. to znaczy ze jest zajęte, czy nie istnieje?
Apus - 26-01-2011, 16:36
Może sformułuję pytanie dokładniej.
Jak sprawdzić czy istnieje wolne miejsce o średnicy min 2 m i odległości od niebieskiej flagi max 15 m.
bbiidduull - 26-01-2011, 16:57
Spróbuj w praktyce to:
Kod: |
object flaga;
flaga=radar(BlueFlag);
point flag=flaga.position;
errmode(0);
if(goto(space(flag,0,15,2))!=0)
{
message("Zajęte");
}
|
Apus - 26-01-2011, 20:34
Ale nadal nie rozumiem tego:
bbiidduull napisał/a: | if(goto(space(flag,0,15,2))!=0)
|
bbiidduull - 26-01-2011, 20:44
Jeżeli funkcja goto zwróci wartość rożną od zera to wykonaj ble ble... Ma iść czyli goto w miejsce space(flag,0,15,2) co oznacza ze ma iść w wolne znalezione miejsce max 15 metrów od flagi z minimalnym odstępem 2 metry.
Może to ci pomoże:
Kod: |
object flaga;
point flag,wolnemiejsce;
flaga=radar(BlueFlag);
flag=flaga.position;
wolnemiejsce=space(flag,0,1,2);
errmode(0);
if(goto(wolnemiejsce)!=0)
{
message("Zajęte");
}
|
Apus - 27-01-2011, 11:52
Nadal nie rozumiem dlaczego w warunku if'a jest goto.
krzys_h - 27-01-2011, 12:19
To goto oznacza, że jeśli nie można podejść do tej pozycji to wyświetli komunikat
PS. Po tym if powinno być jeszcze errmode(1);
Berserker - 27-01-2011, 12:19
Moge poszatkowac ten temat na jeszcze 3 kolejne, ale sie powstrzymam
Apus, funkcja goto() jest typu int. Jest wiele takich funkcji w colobocie, wiekszosc (chyba wszystkie oprocz fire()) ma za zadanie doprowadzic robota do jakiegos stanu, np. funkcja aim() ma doprowadzic do tego, ze lufa bedzie w jakiejs pozycji, funkcja goto() ma doprowadzic do tego, ze robot znajdzie sie w jakims punkcie etc... Takie funkcje moga zwracac wartosci jesli wczesniej wrzucisz errmode(0). Wynik jaki zwracaja zalezy od tego, jak przebiegnie cala operacja i po tym wlasnie wyniku mozna napisac w programie dzialania adekwatne. Jesli goto() zwroci 0, to znaczy, ze robot doszedl do punktu i ogolnie funkcja zakonczyla sie sukcesem. Jesli goto() z kolei zwroci 212 to znaczy, ze punkt jest zajety i wtedy np mozesz szukac pozycji 5m obok.
Mam nadzieje, ze teraz rozumiesz dlaczego goto() wyladowalo w ifie
|
|