|
Forum - Polski Portal COLOBOTa |
|
|
jak zrobić goto |
Autor |
Wiadomość |
sajmon313
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 24-12-2009, 22:00 jak zrobić goto
|
|
|
Problem jest następujący:
jak zrobić funkcje działającą identycznie jak goto(), z użyciem move() i turn(), lub motor().
Po co?
Żeby dodać fajne rzeczy do goto, np. omijanie obcych, nie lądowanie w wodzie, nie wpadanie do dziur o stromych scianach i inne tego typu przydatne rzeczy. |
_________________ Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10 |
|
|
|
|
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: 24-12-2009, 22:22
|
|
|
Moim zdaniem przy uzyciu CBot to jest niemozliwe. Dlaczego? goto() (przynajmniej z domyslnymi parametrami) wybierajac droge uwzglednia pochylenie terenu, objetosc obiektow i pare takich innych bzdur, ktore sa niemozliwe do sprawdzenia przy uzyciu CBota (pochylenia terenu nie sprawdzi sie nie wjezdzajac samemu, nie mozna sprawdzic czy sie zahaczy o budynek bo pozycja budynku zwraca tylko srodek). Jesli wierzysz, ze ci sie uda, to proponuje zaczac rozgryzanie goto() od zagadki: dlaczego jesli robotowi kaze sie podjechac na pozycje identyczna z pozycja robota to robot musi z niej zjechac, obrocic sie i wrocic? |
_________________
|
|
|
|
|
sajmon313
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 24-12-2009, 22:41
|
|
|
Berserker napisał/a: | Moim zdaniem przy uzyciu CBot to jest niemozliwe. |
Planuję dokładnie to zbadać
Berserker napisał/a: | pochylenia terenu nie sprawdzi sie nie wjezdzajac samemu |
Da się!
Kod: | point pos1,pos2;
pos1=position;
pos2=pos1;
pos2.x=pos1.x+0.5;
pos1.x=pos1.x-0.5; |
teraz można porównac topo(pos1) i topo(pos2) i mamy pochylenie w x
oczywiście musiałoby to być bardziej rozbudowane.
Berserker napisał/a: | nie mozna sprawdzic czy sie zahaczy o budynek bo pozycja budynku zwraca tylko srodek |
ale znamy też kategorię - a więc mozna sporządzić tablice z wymiarami wszystkich możliwych obiektów
Berserker napisał/a: | Jesli wierzysz, ze ci sie uda, to proponuje zaczac rozgryzanie goto() od zagadki: dlaczego jesli robotowi kaze sie podjechac na pozycje identyczna z pozycja robota to robot musi z niej zjechac, obrocic sie i wrocic? |
moje nowe lepsze goto nie będzie się zachowywało w ten sposób. ;P |
_________________ Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10 |
|
|
|
|
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: 25-12-2009, 02:30
|
|
|
Hm, najtrudniejsze moim zdaniem jest znalezienie drogi do podazania. No i jeszcze jest piekna Matka Natura, ktora sadzi rozne grzyby nie wykrywalne przez radar. O tym sie pomysli.
Proponuje za pomoca tablic ustalic szereg punktow, ktore trzeba osiagnac by dojsc do celu. Jak znajde w sobie checi to sprobuje cos takiego napisac. Podejrzewam, ze takie cos bedzie wcale dlugo liczylo te punkty (dla pozycji odleglej o 50m zakladajac, ze takie punkty liczymy co metr bedzie ich ponad 50). Trzeba bedzie rowniez napisac cos, aby robot potrafil sam wjechac np. do odgromnika (jadac na wprost ma 50% szansy, ze zahaczy o ten smieszny slupek), ale to da sie zalatwic. Fajnie by tez bylo, by robot omijal slepe uliczki. I to chyba wszystko. |
_________________
|
|
|
|
|
sajmon313
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 25-12-2009, 09:58
|
|
|
możnaby zacząć od czegoś takieggo:
Kod: | p1=position;
move(x);
p2=position;
if(p1==p2) turn(d); |
przy czym d byłoby ustalane przez robota po dokładnym zbadaniu najbliższej okolicy: pochyłość terenu, inne obiekty. |
_________________ Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10 |
|
|
|
|
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: 25-12-2009, 12:43
|
|
|
Ja myslalem, zeby najpierw ustalic cala sciezke, a dopiero pozniej nia isc, a nie chodzic tak po kawalku. Fajnie by bylo gdyby rowniez ktos oswoil instrukcje search(), bo ona mnie sie nie slucha
Prosba:
Ma ktos spis obiektow w taki sposob:
Kod: |
list[UraniumOre] = UraniumOre;
|
Albo ktos ma duzo czasu i moglby zrobic? |
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 25-12-2009, 13:28
|
|
|
Twoje pytanie jest bez sensu, gdyż funkcja goto(); omija wszystkie przeszkody, omija wodę, budynki, ląduje robotem latającym, gdy silnik się przegrzeje. Gdy wpiszesz daną kategorię, podchodzi pod odpowiednie miejsce. Gdy wpiszesz Converter, podejdzie tak, aby postawić coś na środku. Nie stanie na środku. Gdy wpiszesz WheeledGrabber, stanie za robotem, by zmieni baterię. Nie będzie starał się na niego wjechać. A mimo to, pozycja robota, do którego podchodzisz to środek.
A omijanie obcych? Nie wpadanie do wody?
Nie lepiej najpierw obcych zabić? Można również wykorzystać program z Wyzwania -> Przetrwanie we wrogim środowisku
A co do wpadania do wody, to Berserker miał dobry pomysł w temacie AlienKiller2. |
|
|
|
|
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: 25-12-2009, 14:02
|
|
|
@up
Moze nie jest to mozliwe, ale jestem bardzo ciekaw, ile uda nam sie zrobic.
@topic
Jeszcze jedna prosba: jak wyliczyc orientacje wymagana w danej pozycji by zwrocic sie w kierunku pozycji docelowej? |
_________________
|
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
Wysłany: 25-12-2009, 18:51
|
|
|
Berserker napisał/a: | jak wyliczyc orientacje wymagana w danej pozycji by zwrocic sie w kierunku pozycji docelowej? |
Kod: | direction(siedziba_microsoftu.position); |
|
_________________ 1Tbps Project && Telecomix Network
|
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 25-12-2009, 20:42
|
|
|
Berserker napisał/a: | Jeszcze jedna prosba: jak wyliczyc orientacje wymagana w danej pozycji by zwrocic sie w kierunku pozycji docelowej? |
Też się zastanawiam, o co chodzi z tą zmienną 'orientation'. Dwa roboty ustawione koło siebie i skierowane w tym samym kierunku. Jeden ma orientation 43, a drugi 400 coś... myślałem, że max to jakieś 180 albo 360... |
|
|
|
|
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: 25-12-2009, 21:27
|
|
|
Cytat: | direction(siedziba_microsoftu.position); |
Naprawde uwazasz mnie za tak glupiego, ze bym na to nie wpadl? Raz, to pokazuje kierunek a nie orientacje, a dwa, ja chce znac orientacje bez podjezdzania robotem w dane miejsce, sprawdzania kierunku i wracania...
Cytat: | Też się zastanawiam, o co chodzi z tą zmienną 'orientation'. Dwa roboty ustawione koło siebie i skierowane w tym samym kierunku. Jeden ma orientation 43, a drugi 400 coś... myślałem, że max to jakieś 180 albo 360... |
Orientacja to jest "kierunek bezwzgledny", pokazuje o ile stopni jest odchylony kierunek patrzenia robota od osi x (czyli od kierunku wschodniego). Dodanie/odjecie od tej wartosci 360° w praktyce nie zmienia jej, wiec 3600° = 0°, tylko prawdopodobnie pierwszy robot zrobil 10 obrotow w lewo. |
_________________
|
|
|
|
|
sajmon313
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 26-12-2009, 00:11
|
|
|
Berserker napisał/a: | Cytat: | direction(siedziba_microsoftu.position); |
Naprawde uwazasz mnie za tak glupiego, ze bym na to nie wpadl? Raz, to pokazuje kierunek a nie orientacje, a dwa, ja chce znac orientacje bez podjezdzania robotem w dane miejsce, sprawdzania kierunku i wracania...
Cytat: | Też się zastanawiam, o co chodzi z tą zmienną 'orientation'. Dwa roboty ustawione koło siebie i skierowane w tym samym kierunku. Jeden ma orientation 43, a drugi 400 coś... myślałem, że max to jakieś 180 albo 360... |
Orientacja to jest "kierunek bezwzgledny", pokazuje o ile stopni jest odchylony kierunek patrzenia robota od osi x (czyli od kierunku wschodniego). Dodanie/odjecie od tej wartosci 360° w praktyce nie zmienia jej, wiec 3600° = 0°, tylko prawdopodobnie pierwszy robot zrobil 10 obrotow w lewo. |
możnaby podjechac 1m do przodu, i zobaczyć jak się zmieniły x i y
Kod: |
point p1,p2;
dloat dir;
p1=position;
move(1);
p2=position;
dir=atatn((p1.x-p2.x)/(p1.y-p2.y));
|
i kontynuując możemy dojść do wartości takiej jak w CreateObject. |
_________________ Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10 |
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 26-12-2009, 00:53
|
|
|
Berserker napisał/a: | Orientacja to jest "kierunek bezwzgledny", pokazuje o ile stopni jest odchylony kierunek patrzenia robota od osi x (czyli od kierunku wschodniego). Dodanie/odjecie od tej wartosci 360° w praktyce nie zmienia jej, wiec 3600° = 0°, tylko prawdopodobnie pierwszy robot zrobil 10 obrotow w lewo. |
Doszedłem do tego, że 0 / 360 stopni to kierunek wschodni, ale dwa roboty prosto z fabryki skierowane w tym samym kierunku? Robiłem testy na PracticeBot, to orientation się resetowało po przekroczeniu zera / 360 stopni.
A co do sposobu sajmona, to chyba jest jakiś sposób, aby sprawdzać ten kąt bez użycia move();, np. mierzyć go na bieżąco, prawda? Jest trochę późno, więc nie mogę nic konkretnego napisać. |
|
|
|
|
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: 26-12-2009, 02:35
|
|
|
Cytat: | Doszedłem do tego, że 0 / 360 stopni to kierunek wschodni, ale dwa roboty prosto z fabryki skierowane w tym samym kierunku? Robiłem testy na PracticeBot, to orientation się resetowało po przekroczeniu zera / 360 stopni. |
Mi sie wydaje, ze w pewnych momentach po prostu gra nie zauwaza, ze przekroczono magiczna granice pelnego kata i liczy dalej. Jesli chodzi o orientacje, to po wystarczajaco dlugim dodawaniu/odejmowaniu 360 w koncu sie wyrownaja.
Cytat: | kontynuując możemy dojść do wartości takiej jak w CreateObject. |
Moze to przez godzine o ktorej pisze, ale za cholere nie rozumiem co ty napisales .
Chodzi mi o to, ze napisalem funkcje (ktora nie dziala, ale nvm). Wyglada ona tak:
Kod: | int object::Goto(point pos)
{
point center, dest[], F, R, L, adest;
int list[], i;
float dist, len;
float dir, orient, angle, pMax;
orient = orientation;
center = position;
pMax = 30;
len = 0.5;
pos.z = topo(pos);
do
{
F.x = center.x + cos(orient) * len;
F.y = center.y + sin(orient) * len;
F.z = topo(F);
if(atan((topo(F)-topo(center))/len) < pMax)
{
adest = F;
}
else
{
i = 0;
do
{
i++;
L.x = center.x + cos(orient+i*5) * len;
L.y = center.y + sin(orient+i*5) * len;
L.z = topo(L);
R.x = center.x + cos(orient-i*5) * len;
R.y = center.y + sin(orient-i*5) * len;
R.z = topo(R);
}
while(atan((topo(L)-topo(center))/len) > pMax and atan((topo(R)-topo(center))/len) > pMax);
if(topo(L) < topo(R)) adest = L;
else adest = R;
}
center = adest;
dest[sizeof(dest)] = adest;
if(sizeof(dest) > 1000) return 1;
dir = acos((pos.x-center.x)/distance2d(center, pos));
orient = dir+orient;
}
while(distance2d(center, pos) > 1);
i = 0;
while(distance2d(pos, position) > 1)
{
adest = dest[i++];
while(distance2d(position, adest) > 1)
{
dir = direction(adest);
motor(1-dir/90, 1+dir/90);
}
}
return 0;
} |
Dziala ona tak: sprawdza ona punkt na pol metra w kierunku punktu docelowego. Jesli jest on zdatny do uzytku (wjechanie na niego jest mozliwe i nie powoduje katastrofy) to robot zapisuje go w tablicy dest. Jesli nie, sprawdza punkty na lewo i prawo, dopoki ktorys bedzie zdatny do uzytku. Teraz jednak pojawia sie problem. Od zatwierdzonego jako 'adest' punktu liczymy kolejny punkt. I w tym momencie potrzebna jest mi ta orientacja, bo nie wiem w ktorym kierunku mam zaczac liczyc kolejny punkt. Sprawdzilem za pomoca message() dystans kazdego punktu od pozycji docelowej. Zwieksza sie O_O z kazdym nowym punktem. |
_________________
|
|
|
|
|
sajmon313
Jedi Master
Wiek: 28 Dołączył: 16 Gru 2009 Posty: 42 Skąd: /dev/uarndom
|
Wysłany: 26-12-2009, 10:16
|
|
|
Berserker napisał/a: | Moze to przez godzine o ktorej pisze, ale za cholere nie rozumiem co ty napisales |
Chodzi o to że można prosto dojść do wartości np. 1.5, 1.2
A jeszcze lepiej zamiast się ruszac robotem policzyć pozycje baterii względem robota.
Znamy oriantacje bezwzględną robota (taka same jak w punkcie startowym). W pkt startowym oriantacje obliczamy porównując position robota i jego baterii
(Pożniej w kolejnym punkcie orientacja będzie taka jak obliczona w poprzednim)
I znamy pozycję do której chcemy dotrzeć, więc mozemy obliczyć orientację bezwzględną w jakiej musi znajdować się robot żeby patrzył w tę stronę.
W tej chwili nie mam czasu, ale jeszcze potestuje ten sposób w grze. |
_________________ Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10 |
|
|
|
|
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|