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

Podobne dokumenty