Programowanie Studia Licencjackie Pracownia 7. Koniec semestru
Transkrypt
Programowanie Studia Licencjackie Pracownia 7. Koniec semestru
Programowanie Studia Licencjackie Pracownia 7. Koniec semestru W tej liście są dwa zadania1 , oba dotyczą wyścigów samochodowych off-line. Liście tej towarzyszy konkurs: osoba, która zaprogramuje najszybciej jeżdżące auto zdobędzie premię w wysokości 6 punktów egzaminacyjnych i 6 punktów ćwiczeniowych (szczeguły konkursu poniżej). Połowa punktów za w pełni poprawne rozwiązanie drugiego zadania będzie doliczona do wyniku egzaminu. Zadanie 1. (8) Napisz program, który wykonuje symulację wyścigów. Program powinien działać interaktywnie, najlepiej w trybie graficznym. Argumentami programu są 1. Nazwa pliku z opisem mapy 2. Nazwy plików, z których każdy zawiera ciąg poleceń samochodowych. Każdy z tych plików odpowiada innemu graczowi startującemu w wyścigach. Program powinien poinformować o tym, jaki kolor przydzielił kolejnym graczom a następnie przeprowadzić symulację wyścigu, tj: narysować planszę, obliczać pozycję aut w kolejnych krokach i rysować kolorowe punkty dla poszczególnych aut w ten sposób, by powstawały kolorowe linie przedstawiające trasy poszczególnych aut. Po tym jak wszystkie auta dojadą do mety lub zakończą wyścig na bandzie, powinna pojawiać się informacja o tym, ile aut ukończyło wyścig i w jakiej kolejności. Zadanie 2. 16+4 Napisz program, który dla danej mapy wyznacza ciąg poleceń przemieszczających po tej mapie samochód od startu do mety. Najpóźniej tydziej przed terminem listy pojawi się mapa, po której trzeba będzie przejechać w zadanym czasie, aby zaliczyć zadanie (czas ten nie będzie wyśrubowany, zostanie otrzymany prze pomnożenie czasu prostego programu napisanego przez prowadzącego przez 1.5). Jak jeżdzą auta Stan auta opisany jest za pomocą czterech zmiennych: x,y -- współrzędne samochody (typu double) v -- prędkość samochodu (piksele/cykl symulacji) d -- kierunek samochodu (w radianach, 0 oznacza "w prawo") Symulacja przeprowadzana jest w „dyskretnych” krokach, w każdym kroku ustalany jest nowy stan samochodu na podstawie stanu poprzedniego i akcji kierowcy. W każdym kroku kierowca może wykonać następujące polecenia • jedź (nie zmieniając ustawień kierownicy i gazu) • przyspiesz • hamuj 1 Nie jestem autorem zadania drugiego. Pochodzi ono z pewnego międzynarodowego konkursu, niestety nie mogę podać jakiego, bowiem umożliwiłoby to łatwe znalezienie rozwiązania. • skręć w lewo • skręć w prawo Można łączyć przyspieszanie (hamowanie) ze skręcaniem. Symulacją sterują następujące opcje (uwaga: wszystkie te liczby należy podzielić przez 65536.0)2 : A = 24 B = 36 T = 64 L = 20000 F0,F1,F2 = 4, 12, 24 współczynnik przyspieszania współczynnik hamowania współczynnik skręcania ograniczenie skrętu współczynniki tarcia i oporu powietrza Kolejny stan obliczany jest za pomocą następującego programu: v -= (F0 + F1*v + F2*v*v) // zwalnianie pod wpływem tarcia i oporu pow if ("przyspieszamy") v += A if ("zwalniamy") v-= B if (v<0) v=0 if (v>1) v=1 // w 1 turze maks. o jedną kratkę if ("lewo") d -= T / (v*v+L) // dzielenie całkowite if ("prawo") d += T / (v*v+L) // dzielenie całkowite while (d < -pi) d += 2*pi while (d > pi) d -= 2*pi x += v*cos(d) y += v*sin(d) Mapa Mapa podana jest jako plik tekstowy, zawierający w pierwszych dwóch liniach szerokość i wysokość mapy, po których następuje zawartość kolejnych pól mapy 11 8 gggrwrwrggg ggw..!..wgg gr...!*..rg gw..bbb..wg gr..bbb..rg gw.......wg ggr.....rgg gggwrwrwggg Znaczenie znaków jest następujące: po kropkach (.) można jeździć, po literkach nie (wjechanie na takie pole to koniec zabawy). * to pozycja startowa auta (można na nią wrócić, jeśli wola). Wykrzykniki (!) oznaczają linię końcową. Literki oznaczają kolory i dają możliwość tworzenia ładniejszych map. Lewy górny kwadracik obejmuje punkty z przedziału [0,1) na [0,1). Nasza pozycja startowa to lewy górny punkt kwadracika oznaczanego przez *. Metę należy przekroczyć jadąc w prawo (jeżeli ! ma współrzędne (x,y), to przedostatnia współrzędna auta przekraczającego metę powinna wynosić x-1). 2 W oryginalnym zadaniu była zdefiniowana arytmetyka stałopunktowa, z częścią ułamkową równą 16 bitów) 2 Najechania na ! z prawej strony (czyli jadąc w lewo) jest równoważne z najechaniem na bandę. Symulacja jest przeprowadzana w dyskretnych krokach, jadąc szybko możemy „ścinać rogi” band. Na stronie wykładu pojawią się przykładowe mapy wraz z wymaganymi dla nich czasami. Format rozwiązania Rozwiązaniem dla danej mapy jest plik tekstowy zawierający polecenia wydawane przez kierowcę polecenia doprowadzające auto z pozycji startowej do mety. Mamy następujące polecenia: . r. l. a. b. al. ar. -------- tocz się toczymy się + toczymy się + przyspieszamy hamujemy przyspieszamy przyspieszamy skręt w prawo skręt w lewo + skręt w lewo + skręt w prawo Rozwiązanie powinno zawierać tylko te znaki, końcem rozwiązania powinien być koniec pliku. Arytmetyka Obliczenia należy przeprowadzać z maksymalną dokładnością (typ double w j. C lub analogicznie). Jeżeli w wyniku błędów zaokrągleń symulator prowadzącego stwierdzi kraksę, która nie była wychwycona przez symulator studenta, wówczas reklamację uwzględnia się, o ile symulator studenta jest poprawny3 , a obliczona przezeń odległość od bandy w feralnym momencie była większa niż 0.1. Zaleca się zatem, by nie zbliżać się do band bardziej niż na 0.14 3 Przy założeniu, że obliczenia prowadzone są z nieskończoną precyzją. dla tego przepisu jest zdefiniowanie zaakceptowanej przez wszystkich arytmetyki stałopunktowej. 4 Alternatywą 3