Rozdział 19 - Czas i ruch

Często będziesz chciał, aby twój program wykonywał się przez określony czas, a do tego celu przyda ci się polecenie PAUSE (szczególnie w trybie FAST):

PAUSE n

zatrzymuje obliczenia i wyświetla obraz przez n ramek telewizyjnych (przy 50 ramkach na sekundę lub 60 w Ameryce). Parametr n może przyjmować wartości do 32767, co daje ci nieco poniżej 11 minut; jeśli n jest większe, to oznacza wstrzymanie programu w nieskończoność.

Pauzę zawsze można przerwać naciskając jakiś klawisz (a spacja spowoduje dodatkowo przerwanie programu). Klawisz musisz wcisnąć po wystartowaniu polecenia PAUSE.

Na końcu pauzy ekran błyśnie.

Jeśli polecenie PAUSE jest zastosowane w programie, który będzie uruchomiony w trybie FAST na starym komputerze ZX80 z nową pamięcią 8K ROM, to po nim należy bezpośrednio zastosować polecenie POKE 16437,255. PAUSE wydaje się działać bez tego, lecz w wyniku cały twój program zostanie wymazany z pamięci.

Ten program wyświetla małą wskazówkę sekundową (właściwie będzie to kropka na krawędzi tarczy) zegara:

    5 REM NAJPIERW TWORZYMY TARCZE ZEGARA
  10 FOR N=1 TO 12
  20 PRINT AT 10-10*COS (N/6*PI),10+10*SIN (N/6*PI);N
  30 NEXT N
  35 REM TERAZ URUCHAMIAMY ZEGAR
  40 FOR T=0 TO 10000
  45 REM T JEST CZASEM W SEKUNDACH
  50 LET A=T/30*PI
  60 LET SX=21+18*SIN A
  70 LET SY=22+18*COS A
200 PLOT SX,SY
300 PAUSE 42
310 POKE 16437,255
320 UNPLOT SX,SY
400 NEXT T

(opuść polecenie REM, chyba że posiadasz rozszerzenie pamięci).

Ten zegar będzie pracował przez około 2 3/4 godziny z powodu wiersza 40, lecz z łatwością możesz ten czas wydłużyć. Zwróć uwagę na sposób kontroli czasu w wierszu 300. Mógłbyś tam oczekiwać PAUSE 50, aby zegar tykał co sekundę, lecz obliczenia również zabierają nieco czasu i należy je uwzględnić. Najlepiej ustalić odpowiednią wartość metodą prób i błędów, porównując czas komputera z prawdziwym zegarkiem i modyfikując wiersz 300 aż uzyska się zgodność (nie możesz zrobić tego zbyt dokładnie; regulacja o jedną ramkę w jednej sekundzie daje 2% dokładność lub pół godziny na dobę).

Funkcja INKEY$ (nie posiadająca argumentu) czyta klawiaturę. Jeśli wciskasz dokładnie jeden klawisz (lub SHIFT i inny klawisz), to wynikiem jest znak otrzymywany z tego klawisza w trybie  L ; w przeciwnym razie otrzymasz pusty łańcuch tekstowy. Znaki sterujące nie mają swoich zwykłych funkcji, lecz dają wynik jak CHR$ 118 dla NEWLINE - na wydruku otrzymasz znak "?".

Wypróbuj ten program, który pracuje jak maszyna do pisania:

10 IF INKEY$<>"" THEN GOTO 10
20 IF INKEY$="" THEN GOTO 20
30 PRINT INKEY$;
40 GOTO 10

Tutaj wiersz 10 czeka, aż podniesiesz swój palec ponad klawiaturę, a wiersz 20 czeka, aż naciśniesz nowy klawisz.

Pamiętaj, iż w przeciwieństwie do INPUT, INKEY$ nie czeka na ciebie. Zatem nie musisz wciskać NEWLINE, lecz z drugiej strony, jeśli nic nie wpiszesz, to przegapisz swoją szansę.

 

Podsumowanie

Polecenie: PAUSE

Funkcja: INKEY$

 

Ćwiczenia

  1. Co się stanie, jeśli przegapisz wiersz 10 w programie maszyny do pisania?

 

 

  1. Dlaczego w programie maszyny do pisania nie możesz wprowadzić spacji lub znaku £?

Oto zmodyfikowany program, który udostępnia ci spację, jeśli naciśniesz prawy kursor (8 z SHIFT):

  10 IF INKEY$<>"" THEN GOTO 10
  20 IF INKEY$="" THEN GOTO 20
  30 LET A$=INKEY$
  40 IF A$=CHR$ 115 THEN GOTO 110
  90 PRINT A$;
100 GOTO 10
110 PRINT " ";
120 GOTO 10

Zauważ jak wczytujemy INKEY$ do A$ w wierszu 30. Można by to pominąć i zastąpić A$ przez INKEY$ w wierszach 40 i 90, ale wtedy zawsze istniałaby mała szansa, iż INKEY$ zmieni się pomiędzy tymi wierszami.

Rozbuduj program, aby po naciśnięciu NEWLINE (CHR$ 118), tworzony był nowy wiersz.

 

 

  1. Innym sposobem wykorzystania INKEY$ jest połączenie z PAUSE, tak jak w alternatywnym programie maszyny do pisania:

10 PAUSE 40000
20 POKE 16437,255
30 PRINT INKEY$
40 GOTO 10

Dlaczego do poprawnej pracy tego programu konieczne jest, aby pauza nie przerywała się, gdy w momencie jej rozpoczęcia będzie wciśnięty klawisz?

Wadą tej metody jest mruganie ekranu, ale w trybie FAST tylko tak to można zrobić. Uruchom ten program w trybie FAST i zwróć uwagę na to, iż komputer korzysta z pauzy do wyświetlania obrazu telewizyjnego.

 

 

  1. Ten program sprawi, że oszalejesz. Komputer wyświetla liczbę, którą ty (lub inna niewinna ofiara) powinna wpisać z powrotem. Na początku masz na to sekundę, lecz jeśli się pomylisz, to przy następnej twój czas wzrośnie, natomiast przy poprawnej odpowiedzi dostaniesz mniej czasu następnym razem. Chodzi o to, aby wpisywać liczby najszybciej, jak to jest możliwe, a na koniec naciśnij Q dla zobaczenia swoich wyników - im wyższe tym lepsze.

  10 LET T=50
  15 REM T=LICZBA RAMEK NA RUCH - POCZATKOWO 50 DLA 1 SEKUNDY
  20 SCROLL
  30 LET A$=CHR$ INT (RND*10+CODE "0")
  35 REM A$ JEST PRZYPADKOWA LICZBA
  40 PRINT A$
  45 PAUSE T
  50 POKE 16437,255
  60 LET B$=INKEY$
  70 IF B$="Q" THEN GOTO 200
  80 IF A$=B$ THEN GOTO 150
  90 PRINT "DO KITU"
100 LET T=T*1.1
110 GOTO 20
150 PRINT "OK"
160 LET T=T*0.9
170 GOTO 20
200 SCROLL
210 PRINT "TWOJ WYNIK TO "; INT (500/T)

 

 

  1. (Tylko dla posiadaczy dodatkowej pamięci RAM). Wykorzystując podprogram rysowania linii prostej z rozdziału 15, zmień program rysujący wskazówkę sekundową tak, aby również pokazywane były wskazówki minutowa i godzinowa, rysując je co jedną minutę (niech wskazówka godzinowa będzie krótsza). Jeśli uważasz się za osobę ambitną, to co kwadrans niech coś się dzieje.

 

 

  1. (Dla zabawy). Wypróbuj to:

10 IF INKEY$ = "" THEN GOTO 10
20 PRINT AT 11.14; "ACH"
30 IF INKEY$<>"" THEN GOTO 30
40 PRINT AT 11,14; ""
50 GOTO 10

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.