Główna zawartość
Podstawy informatyki - program rozszerzony
Kurs: Podstawy informatyki - program rozszerzony > Rozdział 6
Lekcja 3: Tworzenie symulacjiProgram, wykonujący prostą symulację
Słyszałeś kiedyś bajkę o żółwiu i zającu?
Zając drwi sobie z żółwia, że porusza się tak wolno i wyzywa go do wyścigu. W wyścigu zając pędzi naprzód, ale widząc, że jest tak daleko do przodu, ucina sobie drzemkę. Zając budzi się, aby odkryć, że żółw powoli, ale z pewnością go pokonał. 🐢> 🐇 !
Bajka zainspirowała ludzi do organizowania prawdziwych wyścigów pomiędzy żółwiami i zającami. Nie mam takich zwierząt pod ręką, ale jestem ciekaw, czy to naprawdę możliwe: czy żółw może pokonać sennego zająca? Jak szybki musi być żółw i jak senny musi być zając?
Zbadamy pytania poprzez zaprogramowanie symulacji.
Zaczynając od prostego
Zaczniemy od symulacji wyścigu między żółwiem a zającem, który nie drzemie. Myślę, że oboje znamy wyniki tego wyścigu, ale kiedy programujemy, łatwiej jest zacząć od prostszego problemu, a potem dodać do niego złożoność.
Najpierw musimy ustalić pewne warunki początkowe:
- Czas trwania wyścigu
- Średnia prędkość żółwia
- Średnia prędkość zająca
Musimy również śledzić niektóre wartości, które będą się zmieniać w trakcie wyścigu:
- Aktualna pozycja żółwia
- Aktualna pozycja zająca
Możemy przechowywać zarówno warunki początkowe jak i zmienne wartości w zmiennych.
Oto kod JavaScript, który inicjalizuje te zmienne:
var tortoiseSpeed = 1;
var hareSpeed = 2;
var raceDistance = 350;
var tortoisePos = 0;
var harePos = 0;
Następnie możemy użyć pętli, która aktualizuje pozycję żółwia i zająca i zatrzymuje się tylko wtedy, gdy jeden z nich dotrze do mety.
while (tortoisePos < raceDistance && harePos < raceDistance) {
tortoisePos += tortoiseSpeed;
harePos += hareSpeed;
}
Oto symulacja z użyciem tego kodu:
Dopóki zając jest szybszy od żółwia, będzie wygrywał ten wyścig. Teraz gdy to działa, nadszedł czas, by uczynić to bardziej interesującym.
Dodanie złożoności
Nasza symulacja musi modelować zachowanie leniwego zająca. Możemy zacząć od ustalenia pewnych początkowych cech jego lenistwa:
- Jak długo zazwyczaj nie śpi między drzemkami?
- Kiedy drzemie, jak długo to trwa?
Oto kod JavaScript, który przechowuje te właściwości jako zmienne:
var minsBetweenNaps = 30;
var napLength = 20;
Aby dowiedzieć się, kiedy zatrzymać zająca na czas drzemki, musimy również śledzić niektóre wartości:
- Ile czasu minęło od ostatniej drzemki?
- Skoro w tej chwili drzemie, to ile czasu minęło od rozpoczęcia drzemki?
Ten kod przechowuje wartości początkowe tych zmiennych:
var minsSinceLastNap = 0;
var minsSinceNapStart = 0;
Zając na początku nie drzemie i biegnie, więc obie zmienne zaczynają się od 0.
Na koniec, musimy dodać logikę w pętli, aby zając uciął sobie drzemkę.
Jeśli zając nie musi jeszcze drzemać, kod aktualizuje pozycję zająca (jak poprzednio) i zwiększa
minsSinceLastNap
:if (minsSinceLastNap <= minsBetweenNaps) {
harePos += hareSpeed;
minsSinceLastNap++;
}
Jeśli zając powinien drzemać, kod zwiększa
minsSinceNapStart
, a gdy zając zakończy drzemkę, resetuje minsSinceLastNap
i minsSinceNapStart
do 0:else {
if (minsSinceNapStart < napLength) {
minsSinceNapStart++;
} else {
minsSinceLastNap = 0;
minsSinceNapStart = 0;
}
}
Wizualizacja zmian
Symulacja nie musi mieć wyjścia wizualnego; może po prostu mieć wyjście tekstowe lub liczbowe, jak symulacje powyżej. Jednakże wizualizacja może pomóc użytkownikom symulacji w bardziej intuicyjnym zrozumieniu danych wyjściowych.
Sposób, w jaki dodamy komponent wizualny do symulacji komputerowej, zależy od języka, którego używamy i od tego, jakie biblioteki mamy do dyspozycji. W środowisku kodowania Khan Academy możemy wykorzystać bibliotekę ProcessingJS do rysowania i animowania kształtów na ekranie, dzięki czemu doskonale nadaje się ona do wizualizacji tej symulacji.
Symulacja ta działa w oparciu o tę samą logikę co poprzednio, ale dodaje wizualizację:
Dodanie zmienności
Prawdziwy świat jest pełen wariacji. Żółwie i zające różnią się prędkością; najwolniejszy żółw porusza się z prędkością 0,3 km/h, a najszybszy z prędkością 5 km/godz. Ponadto w ramach wyścigu żółw i zając nie będą poruszać się z dokładnie tą samą prędkością przez cały czas; będą mieli swoje szybkie i powolne momenty.
Jednym ze sposobów na dodanie wariacji do symulacji jest wygenerowanie liczb losowych. Możemy dowiedzieć się, jakie są oczekiwane zakresy wartości w świecie rzeczywistym i wygenerować wartości w tych zakresach.
Spróbuj znaleźć wszystkie miejsca, które używają losowo wygenerowanych liczb w tej wersji symulacji, a następnie uruchom ponownie, aby zobaczyć, co się zmienia:
Zauważ, że ta symulacja wykorzystuje bardziej realistyczne liczby dla prędkości zająca w porównaniu z żółwiem, więc możesz być trochę zszokowany wynikami. Pobaw się parametrami drzemki, aby sprawdzić, czy możesz dać żółwiowi szansę na wygranie wyścigu.
Co jest pominięte?
Symulacja ta jest abstrakcją scenariusza świata rzeczywistego. Próbuje się w niej zawrzeć najważniejsze parametry scenariusza, ale nie może ona obejmować wszystkiego.
Oto kilka pomysłów na pominięcie szczegółów, które mogą mieć wpływ na wyścig:
- czy każdy zawodnik porusza się po prostej ścieżce, czy też meandruje
- czy każdy zawodnik ma kalorie niezbędne do kontynuowania wyścigu
- czy któryś z zawodników ryzykuje przegrzaniem podczas wyścigu
🤔 Czego jeszcze brakuje w symulacji? W jaki sposób symulacja mogłaby być bardziej realistyczna? Jakie parametry pozwoliłyby nam zbadać więcej możliwości?
🙋🏽🙋🏻♀️🙋🏿♂️Masz pytania związane z tym zagadnieniem? Możesz zadać swoje pytanie poniżej!
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji