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 - 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 :mrgreen:
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:
Kod:
point c;
c=null;

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


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