Szkoła ponadpodstawowa, Informatyka II./2., I./2. Szkoła podstawowa, Informatyka II./1, 2.
W ramach tego warsztatu uczniowie poznają często używane w Pythonie rozszerzenie random pozwalające na dodanie do kodu elementów losowych. Zainspirowani grami komputerowymi uczynimy robota Photon bohaterem niezależnym i "oskryptujemy go", aby sprawiał wrażenie, że żyje własnym życiem.
1. Wprowadzenie w temat
Czy grywacie w jakieś gry komputerowe? Czy poza postacią gracza pojawiają się w nich inne postacie? Jak się zachowują, realistycznie?
20 lat temu w grach komputerowych bohaterowie niegrywalni (NPC) przeważnie stali w miejscu lub chodzili po linii z jednego miejsca w drugie. Dziś bohaterowie niezależni "żyją własnym życiem", a przynajmniej sprawiają takie wrażenie. W najnowszych grach niektóre elementy działania NPCów wynikają z decyzji podejmowanych w oparciu o sztuczną inteligencję, ale zupełnie powszechnie ich działaniem kierują sparametryzowane skrypty z elementami losowymi. Warto jednak zwrócić uwagę, że maszyny nie podejmują wyborów w sposób prawdziwie losowy. Np. w Minecrafcie losując mapę i wybierając dwukrotnie identyczne parametry "losowo" wygenerowana zostanie identyczna mapa.
2. Czynnik losowy
Metody związane z losowaniem znajdziemy w rozszerzeniu random. W scenariuszu #6 wyjaśniliśmy różnice pomiędzy formą import nazwa_biblioteki i from nazwa biblioteki import *. Tym razem warto, abyśmy nie importowali biblioteki w całości. Warto otworzyć uczniom dokumentację biblioteki random. Zawiera się w niej 28 metod, z których my prawdopodobnie użyjemy tylko jednej. Wśród developerów oprogramowania rzadko miarą sukcesu jest to "czy działa", ale właściwa optymalizacja i szybkość działania programu. Poświęcanie pamięci obliczeniowej na dane, których nie potrzebujemy jest drobnym marnotrawstwem i dobrze jest wyrabiać w sobie dobre nawyki w optymalizowaniu projektu.
Zaimportujemy from random import randint
3. Sekretne życie Photona
Każda z grup samodzielnie tworzy program, który po uruchomieniu sprawi, że jej Photon będzie "żył własnym życiem". Importujemy threading i time. Naszym zadaniem jest utworzyć funkcje główną, w której działać będą 3 wątki:
Chcemy, aby Photon zachowywał się w sposób mało przewidywalny, ale sensowny - wpadanie na ściany jest wykluczone ;-) Na tym etapie rozmawiamy z uczniami o tym, czy zatrzymywanie Photona przed przeszkodą powinno być osobnym wątkiem. Oczywiście nie, bo zarówno ruch jak i zatrzymywanie to sterowanie silnikami robota, a wątki nie mogą wchodzić w konflikt. Fragment kodu odpowiedzialny za niewpadanie na przeszkody musi być częścią pierwszego wątku.
Każda z grup próbuje wykonać zadanie samodzielnie. W razie potrzeby pomagamy, szczególnie przypominamy składnię wątków omówioną w scenariuszu #9.
Przykładowy program można zobaczyć poniżej:
Funkcję ruchu szczególnie można rozwiązać inaczej. W przykładowym kodzie stale sprawdzane są dwie sytuacje:
4. Prezentacja i podsumowanie
Każda grupa prezentuje swój kod i działanie Photona. Podsumowujemy realizację zadania. Jeśli realizowaliśmy cały cykl 10 zajęć, warto, abyśmy podsumowali całą naukę Pythona. Czy czujemy się pewnie używając go? Co sprawia nam jeszcze trudność? Czy macie inne pomysły na ciekawe programy dla Photona?
O zastosowaniach AI w grach komputerowych można przeczytać artykuł na stronie Komisji Europejskiej.