Kurs programowania Applesoft BASIC

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ą:

  1. gdy kursor znajduje się pod wylistowanym programem, naciśnij klawisz ESC,
  2. przesuń kursor do linii 10, koniecznie ustawiając go na pierwszym znaku tej linii, czyli na cyfrze 1 i ponownie naciśnij klawisz ESC,
  3. od tej pory możesz poruszać się po linii strzałkami w prawo i w lewo i dowolnie edytować treść – spacją usuń wykrzyknik,
  4. 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,
  5. 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.

 

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.