Ten przyspieszony kurs programowania w języku BASIC, przeznaczonego na komputery Apple II, pisałem z myślą o dzieciach (głównie o moim synu), ale mogą z niego korzystać również dorośli. BASIC to doskonały język na początek nauki programowania – prosty, przejrzysty i operujący wyłącznie wielkimi literami, co ułatwia naukę najmłodszym. Wersja przeznaczona dla komputerów Apple II jest znacznie bardziej intuicyjna, niż wersje dostępne na inne 8-bitowe platformy. Dodatkowo, oferuje bardzo łatwy sposób wykonywania operacji graficznych.
Każda lekcja zawiera materiał, który będzie wykorzystywany w kolejnych etapach kursu, dlatego warto dokładnie zapoznać się z treścią i nie przechodzić dalej bez utrwalenia wcześniej zdobytej wiedzy. Nazwy funkcji używanych w Applesoft BASIC są wyróżnione wielkimi literami, pogrubieniem oraz tym kolorem. Część trzecia kursu została opracowana z myślą o starszych dzieciach i osobach dorosłych.
Część 1 Podstawy
Komputer, czy emulator?
Apple II to najdłużej produkowany komputer osobisty w historii, produkcja trwała ponad 16 lat. Na eBay-u można znaleźć sprawne komputery Apple II, ale tutaj skupimy się na emulatorach, które są dostępne na wszystkie najważniejsze platformy: AppleWin dla Windows, Virtual ][ dla macOS, LinApple dla Linuxa (jest zawarty w standardowych repozytoriach systemowych) i DinosPi, czyli projekt kompilujący i konfigurujący emulator LinApple z przeznaczeniem dla Raspberry Pi.
Lekcja 1 Pierwsze programy
Po włączeniu komputera Apple II pojawia się ekran z zamkniętym nawiasem kwadratowym oraz z migającym kursorem. Właśnie teraz komputer czeka na twoje instrukcje.
Wpisz następujący kod:
PRINT "CZESC SWIECIE!"
I naciśnij klawisz ENTER.
Komputer wyświetli napis CZESC SWIECIE!, czyli najpopularniejszy pierwszy program. Drugim jest:
PRINT 2+2
Komputer wyświetli wynik obliczenia, czyli cyfrę 4.
Lekcja 2 Zrozumienie numerów linii
Numery linii mówią komputerowi, w jakiej kolejności ma wykonać polecenia. Polecenie z numerem 10 zostanie wykonane przed poleceniem z numerem 20.
Spróbuj napisać nieco bardziej skomplikowany program, który wyświetla więcej niż jeden napis. Wpisz:
10 PRINT "CZESC SWIECIE!" 20 PRINT "JAK SIE MASZ?" 30 END
Aby go uruchomić, wpisz RUN i naciśnij ENTER. Teraz, gdy program się uruchomi, komputer wyświetli dwie linie tekstu jedną po drugiej.
Polecenie END mówi komputerowi, że skończyliśmy wpisywanie programu.
Gdy zaczniesz pisać kolejną linię, rozpoczynając jednak od istniejącego wcześniej numeru linii, to w pamięci komputera nadpiszesz całą poprzednią linię, czyli zostanie ona wymazana z pamięci i zastąpiona nową treścią.
Jeżeli potrzebujesz dodać dodatkowy kod między istniejącymi liniami, wystarczy że podasz numer linii mieszczący się między wpisanymi już wcześniej, czyli w powyższym przypadku wystarczy na spodzie ekranu dopisać:
15 PRINT "PIEKNA POGODA!"
Czyszczenie ekranu wykonasz za pomocą polecenia HOME.
Ponowne wylistowanie całego kodu, już z posortowanymi liniami, uzyskasz poleceniem LIST.
Nowy program utworzysz poleceniem NEW – usuniesz w ten sposób cały poprzedni program z pamięci.
Poćwicz te nowe polecenia.
Lekcja 3 Funkcja GOTO
Funkcja GOTO pozwala nam przeskakiwać do innej części naszego programu. Używamy jej wraz z numerem linii, do której chcemy przeskoczyć.
Instrukcji GOTO możesz używać w różnych celach – napisz poniższy program i uruchom go:
10 PRINT "CZESC!"
20 GOTO 40
30 PRINT "NIE ZOBACZYSZ MNIE :-("
40 PRINT "I WITAJ PONOWNIE!"
50 END
W tym programie, linia 20 mówi komputerowi, żeby przeskoczył do linii 40. Dlatego linia 30 nigdy nie zostanie wykonana, a na ekranie zobaczysz tylko CZESC! I WITAJ PONOWNIE!.
Oto przykład kolejnego popularnego programu dla komputerów ośmiobitowych, który korzysta z funkcji GOTO:
10 PRINT "CZESC SWIECIE" 20 GOTO 10
W tym programie, linia 20 mówi komputerowi, żeby przeskoczył do linii 10. Program wykonuje się bez przerwy, aż do naciśnięcia kombinacji CTRL+C, dlatego nie wymaga instrukcji END.
Lekcja 4 Edytowanie kodu
Ponieważ nasz kod staje się dłuższy, nauczmy się go edytować, tak żeby nie trzeba było przepisywać całych linii, a móc zmienić np. tylko jeden znak w istniejącej linii. Wyedytujmy teraz treść linii 10 programu z poprzedniej lekcji, tak żeby linia nie zawierała wykrzyknika. W komputerach Apple II edycja wylistowanej treści jest możliwa następującą sekwencją:
- gdy kursor znajduje się pod wylistowanym programem, naciśnij klawisz ESC,
- przesuń kursor do linii 10, koniecznie ustawiając go na pierwszym znaku tej linii, czyli na cyfrze 1 i ponownie naciśnij klawisz ESC,
- od tej pory możesz poruszać się po linii strzałkami w prawo i w lewo i dowolnie edytować treść – spacją usuń wykrzyknik,
- po zakończonej edycji, strzałkami przesuń kursor koniecznie na koniec linii i naciśnij klawisz ENTER – teraz wyedytowana, nowa linia została zapamiętana przez komputer,
- możesz uruchomić program wpisując polecenie: RUN lub wyczyścić ekran i wylistować program ponownie w całości, już z uwzględnieniem Twojej zmiany.
Lekcja 5 Zapisywanie i wczytywanie programów
Instrukcja SAVE służy do zapisywania twojego programu na dysk, tak abyś mógł wrócić do niego później. Oto jak jej używać:
10 PRINT "TO KROTKI PROGRAM" 20 END SAVE MOJPROGRAM
Po wykonaniu polecenia SAVE ten krótki program zostaje zapisany na dysk pod nazwą MOJPROGRAM.
Poleceniem NEW wyczyść teraz ten program z pamięci i sprawdź wyczyszczenie poleceniem LIST.
Polecenie LOAD służy do wczytywania programu z dysku. Oto jak to działa:
LOAD MOJPROGRAM
Ten program wczyta z dysku program o nazwie MOJPROGRAM. Sprawdź, czy wczytał się poprawnie poleceniem LIST.
Możesz listować konkretny numer linii, podając go po poleceniu LIST. Możesz również listować zakres linii podając go po myślniku np. LIST 30-50. Pozostawienie samego myślnika na początku lub na końcu zakresu, oznacza, że chcesz listować od początku lub do końca.
Polecenie CATALOG wyświetla listę wszystkich dostępnych programów. Możesz go użyć, aby zobaczyć, jakie programy masz zapisane na dysku.
Nauczyłeś się zapisywać, wczytywać i wyświetlać pliki na dysku. Pamiętaj, że zawsze warto zapisywać swoje programy, abyś mógł do nich wrócić później.
Lekcja 6 Dodawanie komentarzy
Kiedy piszesz program, pomocne jest dodawanie komentarzy (notatek) dla siebie lub dla innych osób, które mogą czytać twój kod. W AppleSoft BASIC, możemy dodać komentarz używając znaku REM, co oznacza REMark, czyli komentarz, spostrzeżenie, notatka.
Na przykład:
10 REM TO JEST MOJ PIERWSZY PROGRAM 20 PRINT "CZESC SWIECIE!" 30 PRINT "JAK SIE MASZ?" 40 END
Kiedy komputer widzi REM wie, że to, co jest napisane po tym zwrocie, to tylko komentarz i nie próbuje go wykonać. Komentarze w kodzie są potrzebne, bo dzięki nim możemy łatwiej zrozumieć cudzy kod, lub nawet swój po dłuższej przerwie.
W nowej linii napisz nowy komentarz rozpoczynając numerowanie od liczby 25. Treść komentarza to PYTANIE, następnie wylistuj cały kod poleceniem LIST. Czy widzisz jak kod sam się uporządkował?
Jeżeli chcesz usunąć komentarz lub dowolną inną linię, wystarczy jak wpiszesz numer linii, którą chciałbyś usunąć, nie dodając niczego więcej. W ten sposób komentarz lub linia po prostu zniknie z listingu kodu i nie zostanie już wykonywana.
Lekcja 7 Prosta matematyka
Komputery są całkiem niezłe w liczeniu! Napisz program, który wykonuje poniższe operacje matematyczne:
10 PRINT 5 * 2 + 4 / 2 - 2 20 PRINT 5 * ( 2 + 4 / 2 ) - 2 30 END
Kiedy uruchomisz ten program, komputer wyświetli pierwszy wynik 10, ponieważ obliczenia wykonuje zgodnie z kolejnością działań, czyli najpierw mnożenie *, potem dzielenie /, następnie dodawanie + i na końcu odejmowanie –. Drugim wynikiem będzie już 18, ponieważ priorytetowo traktowane są obliczenia wewnątrz nawiasów.
Lekcja 8 Zmienne liczbowe
Zmienne to miejsca, gdzie możemy przechowywać informacje w naszym programie. Myślimy o nich jak o pudełkach, w których możemy umieszczać różne rzeczy. Aby stworzyć zmienną, po prostu napiszemy jej nazwę, a potem użyjemy znaku = do przypisania jej wartości. Na przykład:
10 MOJACYFRA = 5 20 PRINT MOJACYFRA + 2 30 END
Jeśli uruchomisz ten program, zobaczysz, że wyświetli cyfrę 7. W linii 10 powiedzieliśmy komputerowi, aby umieścił cyfrę 5 w pudełku o nazwie MOJACYFRA, a potem w linii 20 powiedzieliśmy mu, aby do cyfry znajdującej się w pudełku MOJACYFRA dodał cyfrę 2.
Nazwą zmiennej może być dowolny ciąg znaków od A do Z, od jednego do nawet ponad 20 znaków, włącznie z cyframi, ale nazwa zmiennej musi rozpoczynać się od litery.
Pamiętaj jednak, że interpreter Applesoft BASIC wykorzystuje tylko pierwsze dwa znaki nazwy zmiennej, czyli z powyższego przykładu cyfrę 5 uzyskamy po wylistowaniu zmiennej MOJACYFRA, jak i zmiennej MO.
Zapamiętaj tę zasadę, bo każda kolejna zmienna, która będzie zawierała w nazwie pierwsze dwa znaki już istniejącej zmiennej, nadpisuje wartość tej poprzedniej. Z tego powodu w Applesoft BASIC zalecam korzystanie wyłącznie z dwuznakowych nazw zmiennych.
Lekcja 9 Zmienne tekstowe
Zmienne mogą przechowywać nie tylko liczby, ale też tekst! Wartości takich zmiennych nazywamy łańcuchami znaków, czy też stringami. Aby stworzyć string musimy umieścić tekst w cudzysłowie oraz nazwę zmiennej zakończyć znakiem $. Na przykład:
10 NAZWA$ = "ANIA" 20 PRINT "CZESC " + NAZWA$ 30 END
Używamy zmiennej NAZWA$ zamiast NAZWA, aby powiedzieć komputerowi, że ta zmienna jest stringiem (ciągiem znaków), a nie liczbą. Jeśli uruchomisz ten program, to zobaczysz, że wyświetla napis CZESC ANIA. W linii 10 powiedzieliśmy komputerowi, aby umieścił ANIA w pudełku o nazwie NAZWA$, a potem w linii 20 powiedzieliśmy mu, aby wyświetlił CZESC następnie spację, plus to, co znajduje się w pudełku NAZWA$.
Czasami będziesz mógł spotkać się z poleceniem LET przed deklaracją nazwy zmiennej. Nie jest to wymagany krok, ale zwiększa nieco czytelność kodu. Na nasze potrzeby pozostaniemy przy automatycznym deklarowaniu zmiennych, czyli bez polecenia LET.
Lekcja 10 Pytanie o informacje
Możemy też zapytać kogoś, kto używa naszego programu, o dodatkowe informacje, by potem je wykorzystać w dalszej części programu. Użyjemy do tego polecenia INPUT. Na przykład:
10 INPUT "JAK MASZ NA IMIE? "; IMIE$ 20 PRINT "CZESC " + IMIE$ 30 END
Jeśli uruchomisz ten program, komputer zapyta JAK MASZ NA IMIE?, a potem wyświetli CZESC, plus to, co wpisałeś w odpowiedzi na pytanie, ponieważ wcześniej program umieścił podane przez Ciebie imię w pudełku IMIE$.
Lekcja 11 Pętla FOR
Pętle są bardzo ważnym elementem programowania. Pętla FOR pozwala nam na wykonanie określonej czynności wiele razy. Przykładowo, możemy napisać program, który liczy od 1 do 10. Oto jak to zrobimy:
10 FOR I = 1 TO 10 20 PRINT I 30 NEXT I 40 END
W tym programie, I jest zmienną, która zmienia swoją wartość każdym razem, gdy przechodzimy przez pętlę. Zaczyna od 1 (FOR I = 1) i kończy na 10 (TO 10). Po przetłumaczeniu na język polski oznacza to „DLA I = 1 DO 10”. Za każdym razem, gdy przechodzimy przez pętlę, wyświetlamy wartość I, a potem wracamy do początku (NEXT I), zwiększając wartość zmiennej I o 1. NEXT oznacza „następny”.
Lekcja 12 Warunek IF, czyli JEŻELI
Czasami chcemy, aby nasz program zrobił coś tylko wtedy, gdy jest spełniony jakiś warunek. Na przykład, możemy chcieć, aby program wyświetlił CZESC ANIA tylko wtedy, gdy wpisane imię to ANIA. Z pomocą przyjdzie tu funkcja IF. Oto jak jej użyć:
10 INPUT "JAK MASZ NA IMIE? "; IMIE$ 20 IF IMIE$ = "ANIA" THEN PRINT "CZESC ANIA" 30 END
Jeśli uruchomisz ten program i wpiszesz ANIA, komputer wyświetli CZESC ANIA. Ale jeśli wpiszesz cokolwiek innego, nic się nie wyświetli.
Zadanie programistyczne nr 1
Napisz prostą i krótką, tekstową grę RPG, z wyborem jednego z dwóch kierunków drogi gracza, korzystając z dotychczas poznanych poleceń, a następnie zapisz ją pod nazwą RPG.
Lekcja 13 Losowość z RND
Komputery mogą też generować losowe liczby! Jest to bardzo przydatne, na przykład gdy tworzymy gry. Aby wygenerować losową liczbę, używamy funkcji RND. Przykład:
10 HOME 20 FOR I = 1 TO 60 30 X = INT(RND(1) * 100) + 1 40 PRINT X, 50 NEXT I 60 END
Ten program wyświetli 60 losowych liczb między 1 a 100. W linii 30 funkcja RND(1) generuje losową liczbę zmiennoprzecinkową między 0 a 1, mnożymy ją przez 100, aby uzyskać liczbę między 0 a 99, a potem dodajemy 1, żeby wylosowana liczba zawierała się między 1 a 100. Funkcja INT jest używana do zaokrąglenia liczby do najbliższej liczby całkowitej (bez przecinków). W linii 40 używamy funkcji PRINT w ciekawy sposób, na końcu nazwy zmiennej dodając przecinek – w efekcie wylosowane liczby wyświetlają w trzech równych kolumnach.
Teraz umiesz korzystać z pętli, warunków i losowości w AppleSoft BASIC.
Zadanie programistyczne nr 2
Rozbuduj swoją grę RPG o element losowy.
Lekcja 14 Operatory logiczne
W Applesoft BASIC, warunki w instrukcji IF można łączyć przy użyciu operatorów logicznych AND (i), OR (lub) oraz NOT (nie). Przykład:
10 FOR X = 1 TO 2 20 IF X > 5 OR X = 2 THEN PRINT "DLA X=";X;" WARUNEK Z OR SPELNIONY" 30 IF X <> 2 AND X < 3 THEN PRINT "X=";X;" JEST MNIEJSZE OD 2" 40 NEXT X 50 END
Dostępne operatory porównania to:
= równy <> różny od < mniejszy niż <= mniejszy lub równy > większy niż >= większy lub równy.
W pierwszej odpowiedzi programu zostanie spełniony drugi warunek, a w drugiej warunek pierwszy.
Ciekawostka: w połączeniu IF z funkcją GOTO nie musisz używać THEN.
Lekcja 15 Gra tekstowa
Poniżej znajduje się kod popularnej w latach 70-tych gry komputerowej pisanej właśnie w BASICu.
Zasady gry: program losuje jedną liczbę od 1 do 100 i prosi gracza o jej odgadnięcie, gracz ma 7 prób, a komputer podaje tylko informację, czy wylosowana liczba jest większa, czy mniejsza, czy też gracz ją odgadł.
Poniżej znajduje się listing kodu gry, wpisz go do komputera, zapisz w pamięci na przyszłość i zagraj:
10 PRINT "WITAJ W GRZE ODGADNIJ LICZBE!" 20 PRINT "LOSUJE LICZBE OD 1 DO 100 …" 30 LB = INT(RND(1) * 100) + 1 40 PRINT "LOSOWANIE ZAKONCZONE. ZGADUJ! MASZ 7 PROB." 45 REM AKTUALNY NUMER PROBY ODGADYWANIA 50 PR = 1 60 INPUT "TWOJA PROPONOWANA LICZBA: "; ZG 70 IF ZG < LB THEN PRINT "ZA MALO!": PR = PR + 1: GOTO 90 80 IF ZG > LB THEN PRINT "ZA DUZO!": PR = PR + 1: GOTO 90 90 IF PR = 7 THEN PRINT "NIE ZGADLES! SZUKANA LICZBA TO: "; LB: GOTO 130 100 IF ZG = LB THEN PRINT "GRATULACJE, ZGADLES!": GOTO 130 110 GOTO 60 130 INPUT "CZY CHCESZ ZAGRAĆ JESZCZE RAZ? (T/N) "; OD$ 140 IF OD$="T" THEN GOTO 10 50 PRINT "DZIEKUJE ZA GRE!" 160 END
Zadanie programistyczne nr 6 – rozbuduj kod o wyświetlanie informacji również o tym „jaki jest numer aktywnej próby” w formacie 1/7, 3/7 itp. aż do 7/7.
Lekcja 16 Czytanie danych z DATA
Funkcja DATA pozwala nam przechowywać dane wewnątrz naszego programu. Możemy potem przeczytać te dane za pomocą polecenia READ. Oto przykład:
10 DATA 5, 10, 15 20 FOR I = 1 TO 3 30 READ X 40 PRINT X 50 NEXT I 60 END
W tym programie, mamy trzy wartości zapisane w DATA: 5, 10 i 15. Pętla FOR czyta każdą z tych wartości (READ X) i wyświetla ją na ekranie. Funkcja RESTORE przywraca możliwość odczytywania danych od początku.
Lekcja 17 Zagnieżdżanie pętli
Pętle mogą być umieszczane wewnątrz innych pętli. Nazywamy to zagnieżdżaniem pętli. Poniżej przykład wyświetlający wszystkie kombinacje popularnego zamku szyfrowego znanego z walizek i teczek:
10 REM KOMBINACJE ZAMKU SZYFROWEGO 20 FOR I = 0 TO 9 30 FOR J = 0 TO 9 40 FOR K = 0 TO 9 50 PRINT I; J; K, 60 NEXT K 70 NEXT J 80 NEXT I 90 END
W tym programie, mamy pętlę FOR wewnątrz innej pętli i wewnątrz kolejnej pętli. Dla każdej wartości I, pętla ze zmienną J jest wykonywana dziesięć razy, tak samo dla wartości K. To daje nam łącznie 1000 różnych kombinacji I, J, K, które są wyświetlane na ekranie.
Dodanie średnika w linii 50 powoduje, że po wykonaniu funkcji PRINT nie będzie wstawiony znak nowej linii. Dodanie przecinka, tak jak w przypadku lekcji z liczbami losowymi, tworzy nam równe trzy kolumny z wynikami działania programu.
Używamy tu większych wcięć (spacji po numerze linii), aby stworzyć wizualnie blok pętli, dzięki czemu kod jest czytelniejszy. Jednak po zapisaniu programu w komputerze Apple II spacje te zostaną usunięte.
Jeżeli funkcją NEXT kończymy ostatnią aktywną pętlę (w odwrotnej kolejności zagnieżdżania), to nie musimy wskazywać nazwy zmiennej, na której operujemy, czyli linie od 60 do 80 mogą zostać zastąpione jedną linią:
60 NEXT : NEXT : NEXT
Dzięki czemu najpierw zakończona zostanie pętla K, następnie J, a na końcu I.
Lekcja 18 Kontrolowanie tekstu
Czasami chcielibyśmy lepiej panować nad tekstem. Wyświetlać go na środku, dodawać różne ozdobniki itp. Użyj poniższego kodu, aby zapoznać się z funkcjami, które pomogą uzyskać ten cel:
10 REM OKLADKA 20 HOME 30 VTAB 8 : HTAB 15 40 PRINT "MARK TWAIN" 50 VTAB 12 : HTAB 8 60 INVERSE 70 PRINT TAB(32) 85 VTAB 13 : HTAB 8 90 PRINT " PRZYGODY TOMKA SAWYERA " 100 VTAB 14 : HTAB 8 110 PRINT TAB(32) 120 NORMAL 130 VTAB 18 : HTAB 18 140 FLASH 150 PRINT "1876" 160 NORMAL 170 VTAB 2
Funkcja VTAB powoduje przeskoczenie do konkretnej linii, a HTAB do konkretnego numeru wiersza, tak aby można było od nich rozpocząć pisanie tekstu. Funkcja INVERSE odwraca kolory, funkcja FLASH włącza migotanie tekstu, funkcja NORMAL przywraca właściwe wyświetlanie kolorów oraz wyłącza migotanie, a funkcja TAB odpowiada za automatyczne postawienie takiej liczby spacji, ile wynosi liczba przesłana w parametrze do tej funkcji. Efekt końcowy:
Lekcja 19 Tablice
Tablice to bardzo użyteczne narzędzie. Można je sobie wyobrazić jako szereg pudełek, w których możemy przechowywać różne wartości. Zobaczmy, jak możemy z nich korzystać:
10 DIM TBL(5) 20 FOR I = 1 TO 5 30 TBL(I) = I * I 40 NEXT I 50 FOR I = 1 TO 5 60 PRINT "KWADRAT ";I;" TO ";TBL(I) 70 NEXT I 80 END
W tym programie funkcja DIM tworzy tablicę o nazwie TBL z pięcioma miejscami do przechowywania wartości. Linie od 20 do 40 wypełniają tablicę kwadratami liczb od 1 do 5 (czyli mnożą liczbę I przez nią samą). Linie od 50 do 70 wyświetlają te wartości na ekranie.
Część 2 Rysujemy
Applesoft BASIC posiada kilka trybów graficznych. Każdy z nich ma swoje zalety i wady. Pierwszy, popularny tryb niskiej rozdzielczości, to GR, który pozwala na rysowanie w rozdzielczości tylko 40 x 40 punktów, ale wykorzystuje aż szesnaście kolorów (od 0 do 15). Tryb ten pozostawia na dole ekranu dostępne dwie linie tekstu. Drugim trybem jest tryb wysokiej rozdzielczości HGR, który pozwala na wykorzystanie tylko sześciu kolorów (od 0 do 5), ale oferuje rozdzielczość 280 x 160 pikseli, ponownie jednak pozostawiając dwie linie tekstu na spodzie ekranu. Trybem pełnoekranowym wysokiej rozdzielczości jest HGR2, jego rozdzielczość wynosi 280 x 192 piksele, a liczba kolorów nadal tylko sześć.
Lekcja 20 Rysowanie w niskiej rozdzielczości
Zaczniemy od trybu GR. Poniższym kodem narysujesz kilka dużych punktów na ekranie. Funkcja PLOT rysuje punkt korzystając ze współrzędnych X i Y. Pierwsza liczba po poleceniu PLOT określa ile pikseli od lewej części ekranu ma znajdować się punkt, a druga liczba określa ile pikseli od górnej części ekranu. Jeżeli przełączysz się na ekran kolorowy, to każdy z punktów, po wykonaniu poniższego programu, będzie w innym kolorze – dzięki funkcji COLOR.
10 GR 20 FOR I = 14 TO 24 STEP 5 30 COLOR = I - 2 40 PLOT I,19 50 NEXT I 60 END
Możesz dalej rysować punkty wpisując polecenie PLOT bez numerów linii i pisząc w dwóch ostatnich liniach edytora. Edytor jest przełączony teraz w tryb graficzny i pozwala na pisanie kodu tylko w dwóch ostatnich liniach. Aby przywrócić możliwość pisania kodu na całym ekranie wpisz: TEXT:HOME. Aby powrócić do trybu graficznego i pisania w dwóch ostatnich liniach wpisz: GR.
W powyższym programie użyliśmy w pętli opcji STEP, która wskazuje co ile kroków ma być wykonywane zwiększanie wartości zmiennej w pętli. W tym przypadku pętla przechodzi co pięć wartości, czyli 14, 19, 24. Dzięki temu trzy punkty wyświetlają się dokładnie na środku ekranu z zachowaniem większych odstępów między sobą. Te same liczby użyliśmy do zmiany koloru, ale najpopularniejsze wartości kolorów uzyskujemy odejmując od każdej z nich cyfrę 2. Efekt końcowy:
Lekcja 21 Prosta mozaika
Wykorzystajmy nabytą wiedzę i narysujmy prostą mozaikę z wykorzystaniem wspomnianej funkcji PLOT.
10 REM MOZAIKA PUNKTOWA 20 GR: COLOR=3 : HOME 30 XC = 19: YC = 20: D = 1 40 FOR S = 1 TO 38: FOR I = 1 TO S 50 PLOT XC, YC 60 IF D = 1 THEN XC = XC + 1 70 IF D = 2 THEN YC = YC + 1 80 IF D = 3 THEN XC = XC - 1 90 IF D = 4 THEN YC = YC - 1 100 NEXT I 110 D = D + 1: IF D > 4 THEN D = 1 120 NEXT S 130 END
W linii 10 definiujemy tryb GR, wybieramy kolor różowy dla aktywnego rysowania i czyścimy ekran. Następnie w pętli rysowany jest punkt zgodnie z aktualnymi współrzędnymi i wykonywane są operacje matematyczne obliczające dalsze współrzędne punktów mozaiki. Efekt końcowy prezentuje się następująco:
Ponieważ program rysuje punkt po punkcie, jego wykonanie trwa dość długo. Poniżej kod rysujący z wykorzystaniem funkcji HLIN, VLIN i AT tworzących linie, a nie punkty. Dzięki temu rozwiązaniu wykonanie programu jest dużo szybsze:
10 REM MOZAIKA LINIOWA 20 GR: COLOR=3 : HOME 30 X = 19: Y = 20: D = 1 40 FOR S = 1 TO 37 50 IF D = 1 THEN HLIN X, X + S AT Y: X = X + S 60 IF D = 2 THEN VLIN Y, Y + S AT X: Y = Y + S 70 IF D = 3 THEN HLIN X - S, X AT Y: X = X - S 80 IF D = 4 THEN VLIN Y - S, Y AT X: Y = Y - S 90 D = D + 1 100 IF D > 4 THEN D = 1 110 NEXT S 120 END
Jak wynika z powyższego przykładu, konstrukcja rysowania linii tymi funkcjami jest następująca: HLIN OD, DO AT NR-WIERSZA dla linii poziomych oraz VLIN OD, DO AT NR-KOLUMNY dla linii pionowych.
Gotowy rysunek:
Lekcja 22 Rysowanie w wysokiej rozdzielczości
W trybie wysokiej rozdzielczości i z wykorzystaniem funkcji HPLOT, narysujesz dużo mniejsze punkty na ekranie. Nazwa funkcji określającej wybór koloru również się zmieniła, teraz nazywa się ona HCOLOR. Obie funkcje obsługuje się identycznie, jak w trybie GR.
10 HGR 20 HCOLOR = 1 : HPLOT 50,50 30 HCOLOR = 5 : HPLOT 100,100 40 HCOLOR = 6 : HPLOT 150,150 50 END
Jak widzisz tutaj punkty są dużo mniejsze. niż w trybie GR i śmiało można je już nazywać pikselami.
Zadanie programistyczne nr 3 – stwórz program, który za pomocą pętli, rysując punkt po punkcie, narysuje prostą linię w poprzek ekranu.
Lekcja 23 Sinusoida
Funkcja SIN oblicza sinus kąta, a funkcja INT zamienia liczbę na całkowitą. Dzięki tym funkcjom możemy w prosty sposób narysować sinusoidę:
10 HGR2 20 FOR X = 1 TO 275 30 Y = INT (SIN (X / 40) * 75) + 75 40 HPLOT X,Y 50 NEXT X 60 END
HGR2 to tryb graficzny wypełniający cały ekran – jednak gdy po zakończeniu programu nadal nie widzimy kursora, to wpisanie „w ciemno” polecenia TEXT i naciśnięcie ENTER, przywróci nas do trybu tekstowego. Poniżej wykres który uzyskamy programem:
Zadanie programistyczne nr 4 – efektem działania powyższego kodu, jest uproszczona sinusoida – spraw, by Twoja wersja wyglądała tak, jak na powyższej grafice. By pionowa grubość linii sinusoidy wynosiła 3 piksele oraz by w jednym miejscu była zawarta informacja o aktualnie obliczonym wyniku SIN(X), korzystając z lekcji o kontroli pozycji tekstu.
Lekcja 24 Rysowanie linii
Linie rysujemy tym samym poleceniem, co w poprzednich lekcjach. Dodajemy jednak drugie współrzędne po słowie TO. Linia zostanie narysowana od współrzędnych pierwszego punktu, do współrzędnych drugiego punktu.
HGR : HPLOT 0,0 TO 130,130
Poniżej mój programik rysujący tą funkcją rzut pentagramu – wykorzystamy bazę współrzędnych utworzoną w poznanej wcześniej funkcji DATA. Program jest ciekawy również dlatego, że rysuje od punktu do punktu, czyli w DATA wystarczy umieścić współrzędne kolejnych punktów, a program sam przypisuje im wartość X1,Y1 TO X2,Y2. Kod zawiera również przykład wykorzystania dwóch operacji rozdzielonych znakiem dwukropka w wyniku działania funkcji IF. Dodanie znaku dwukropka oddziela funkcje tak, jakbyś dodał kolejny numer linii, jednak pozostając nadal w tej samej linii.
10 REM PENTAGRAM 20 DATA 130,30,205,134,70,64 30 DATA 190,64,55,134,130,30 40 HOME : HGR 50 X = 0 : Y = 0 60 FOR I = 0 TO 5 70 READ A,B 80 IF I = 0 THEN X = A : Y = B : NEXT I 90 HPLOT X,Y TO A,B 100 X = A : Y = B 110 FOR U = 1 TO 500 : NEXT U 120 NEXT I 130 END
W linii 70 za pomocą funkcji READ odczytujemy równocześnie po dwie wartości z bazy DATA, przypisując je od razu do dwóch zmiennych. Linia 110 jest pętlą, która emuluje nieistniejącą w Apple II funkcję SLEEP, dzięki czemu rysunek wydaje się rysowany jakby ludzką ręką, znacznie wolniej.
Powyższym programem możesz utworzyć dowolny rysunek składający się z linii prostych, wypełniając odpowiednio wartości DATA.
Wyobraź sobie jakie ciekawe rysunki można tworzyć w połączeniu z funkcją losującą RND.
Lekcja 25 Losowanie i rysowanie, czyli prosty wygaszacz ekranu
Poniżej bardzo prosty wygaszacz ekranu rysujący losowe linie, czyszczący ekran a następnie ponownie się uruchamiający. Przepisz go i uruchom, aby później wykonać zadanie programistyczne.
10 REM SCREENSAVER
20 DIM TB(5)
30 HOME : HGR2
40 FOR I = 1 TO 50
50 FOR K = 1 TO 4
60 TB(K) = INT ( RND (1) * 190) + 1
70 NEXT K
80 HCOLOR = INT ( RND (1) * 6) + 1
90 HPLOT TB(1),TB(2) TO TB(3),TB(4)
100 NEXT I : GOTO 30
Dla uproszczenia kodu wygaszacz rysuje linie tylko w kwadracie 190 x 190 pikseli, pozostawiając pusty margines po prawej stronie. Twoje kolejne, piąte zadanie programistyczne polega na takim rozbudowaniu kodu, aby linie były rysowane na całej dostępnej powierzchni ekranu.
Lekcja 26 Rysowanie efektowne
Poniżej popularny, prosty do uzyskania i ciekawy efekt graficzny, znany z komputerów ośmiobitowych:
Przeanalizuj kod, aby zrozumieć w jaki sposób efekt został uzyskany.
10 REM EFEKTOWNY 20 HOME : HGR2 : SL = 7 30 V = 279 : N = 189 40 FOR I = 0 TO 1 STEP 0.05 50 HCOLOR = 6 60 HPLOT V * I, 0 TO 0,N * (1 - I) 70 HCOLOR = 1 80 HPLOT V * I, N TO V * (1 - I), 0 90 HCOLOR = 3 100 HPLOT V,N * (1 - I) TO V * I, N 110 NEXT 120 END
Część 3 Procedury, funkcje i trygonometria
Lekcja 27 Procedury, czyli GOSUB i RETURN
GOSUB i RETURN są używane do wywoływania i powrotu z podprogramów. Podprogram to fragment kodu, który możemy wywołać z różnych miejsc w naszym programie. Oto przykład:
10 PRINT "POCZATEK PROGRAMU" 20 GOSUB 100 30 PRINT "KONIEC PROGRAMU" 40 END 100 PRINT "TO JEST PODPROGRAM" 110 RETURN
W tym programie, GOSUB 100 mówi komputerowi, aby przeszedł do linii 100 i zaczął wykonywać kod z tego miejsca. Kiedy komputer natrafi na RETURN, wraca do linii, która następuje po GOSUB.
Lekcja 28 Funkcje trygonometryczne
Funkcje trygonometryczne w Applesoft BASIC są podstawowymi narzędziami matematycznymi, które pozwalają na obliczanie wartości sinusów, cosinusów oraz tangensów dla danych kątów.
Lista tych funkcji:
- SIN(X) – zwraca sinus kąta X, gdzie X jest wyrażony w radianach,
- COS(Y) – zwraca cosinus kąta Y, gdzie Y jest wyrażony w radianach,
- TAN(Z) – zwraca tangens kąta Z, gdzie Z jest wyrażony w radianach,
- ATN(L) – zwraca arcus tangens (inwersję tangensa) wartości L, dając wynik w radianach.
Poniżej wykorzystanie funkcji SIN i COS w tworzeniu zaokrąglonej konstrukcji geometrycznej. Liczba π została zdefiniowana jako uproszczona stała o wartości 3.14.
10 REM RADIAL 20 HGR2 : PI = 3.14 : X = 20 30 A = 2 * PI / X : C = 1 / SIN (PI / X) 40 S = 140 : T = 95 50 FOR L = 1 TO X + 0.5 60 M = 0 : N = 0 : R = (L - 1) * A 70 FOR Q = 1 TO X 80 M = M + COS (R) / C 90 N = N + SIN (R) / C 100 U = 140 + INT (95 * M + 0.5) 110 V = 95 + INT (95 * N + 0.5) 120 HPLOT S,T TO U,V 130 S = U : T = V : R = R + A 140 NEXT : NEXT
Ten kod jest nieco trudniejszy do zrozumienia, ale umieszczam go w tym podstawowym kursie, ponieważ tworzy ciekawy, trygonometryczny pattern:
Lekcja 29 Definiowanie własnych funkcji
Możemy również zdefiniować własne funkcje za pomocą DEF FN. Oto przykład:
10 DEF FN KW(X) = X*X 20 PRINT "KWADRAT 5 TO "; FN KW(5) 30 PRINT "KWADRAT 2 TO "; FN KW(2) 40 END
W tym programie, definiujemy funkcję o nazwie KW, która zwraca kwadrat danej liczby (czyli funkcja mnoży dwie te same liczby przez siebie). Potem używamy tej funkcji, aby wyświetlić kwadraty liczb 5 i 2. Do definicji możemy przesłać parametr (w naszym przypadku to cyfry 5 i 2), zostaje on automatycznie przypisany do zmiennej X, którą zdefiniowaliśmy w nawiasie tuż po nazwie definicji.
Lekcja 30 Grafika i tekst wspólnie
Na zakończenie jeszcze jeden mój programik, który tym razem pracuje równocześnie w trybie graficznym i tekstowym. Jest to benchmark liczb pierwszych – sprawdza liczby pierwsze i graficznie wizualizuje ich rozkład:
Liczbę pierwszą zamalowuje, dla każdej innej pozostawia pusty kwadrat. Czas wykonywania programu, czyli zapełnienie całego ekranu wynosi około 20 minut. Na początku program działa szybko – zaczyna zwalniać wraz ze wzrostem wartości liczb pierwszych. Benchmark pozostawiam w angielskiej wersji językowej.
10 REM PRIME-NUMBER BENCHMARK
20 HOME:HGR
30 COL = 2
40 VTAB 24
50 PRINT TAB ( 9); : INVERSE
60 PRINT "PRIME-NUMBER BENCHMARK"
70 NORMAL
100 P = 0 : X = 0 : Y = 0
110 FOR N = 2 TO 4000
120 GOSUB 1000
130 FOR K = 2 TO 2000
140 M = N / K
150 L = INT(M)
160 IF L = 0 THEN 200
170 IF L = 1 OR M > L THEN 190
180 IF M = L THEN 250
190 NEXT K
200 VTAB 22
210 PRINT TAB( 2);
220 PRINT "PRIME-NUMBER: ";N;" TOTAL PRIMES: ";B
230 GOSUB 2000
240 B = B + 1
250 NEXT N
1000 IF X > 294 THEN Y = Y + 5 : X = 0
1010 HPLOT X,Y TO X + 5, Y
1020 HPLOT X + 5, Y TO X + 5,Y + 5
1030 HPLOT X + 5, Y + 5 TO X,Y + 5
1040 HPLOT X,Y + 5 TO X,Y
1050 P = 5 + 1 : X = X + 5
1060 IF X = 275 THEN Y = Y + 5 : X = 0
1065 IF Y = 155 THEN GOTO 2040
1070 RETURN
2000 FOR E = 1 TO 4
2010 HPLOT X + 1, Y + E TO X + 4, Y + E
2020 NEXT E
2030 RETURN
2040 PRINT TAB(20);: INPUT "PRESS ENTER "; Q$
2050 END
Zakończenie
Jeżeli rozumiesz jak działają powyższe programy, to gratulacje – oficjalnie jesteś już programistą!
W tym artykule wykorzystałem tylko część poleceń i funkcji języka BASIC – więcej znajdziesz w podręczniku Applesoft BASIC, który jest dostępny w języku angielskim. Możesz go pobrać tutaj. Dodatkowy manual Applesoft dostępny jest tutaj.









