1
Donato D’Alessandro – Programmare il PC in GFA Basic
1.2 Il primo programma
Attenzione: per ora scriveremo i programmi in un modo semplificato, non in maniera rigorosa; questo permetterà
a chiunque di iniziare a divertirsi; più in là vedremo un modo di programmare più efficiente e affidabile.
Help in linea: si può utilizzare l’Help in linea per avere informazioni
sull’uso delle istruzioni ed esempi (fig. a destra); puoi posizionarti sopra
una istruzione e schiacciare il tasto F1 per avere le informazioni sulla
sintassi di quella parola.
Scriviamo un piccolo programma che chieda il nome all’utente e gli faccia
una domanda, controllando se la risposta è esatta. Ogni linea di
programma conterrà delle istruzioni precise con dei dati altrettanto
precisi; tutto ciò che è scritto dopo l’apostrofo o il doppio slash (//) è un
commento che può anche non essere scritto nell’editor e che serve per
spiegare il significato della linea (può servire anche allo stesso
programmatore per capire meglio, nel futuro, ciò che ha scritto).
Il programma inizia col comando Dim, che serve a dichiarare tutte le
variabili che saranno utilizzate (così il computer sa quanta memoria gli serve e la alloca per le variabili). Quindi apre
una finestra a schermo pieno (FullW), stampa sullo schermo (Print), memorizza una risposta (Input) e la
esamina (If…); quindi dice all’utente se la risposta è corretta o no.
Dim nome$, cap$ 'dichiara le variabili usate nel programma
FullW 1 'apri la finestra a schermo pieno
Print "Ciao! Come ti chiami?"
Input nome$ 'fa digitare un nome e lo memorizza nella variabile nome$
Print "Allora, "; nome$; ", mi sai dire qual è la capitale d'Italia?"
Input cap$
If cap$ = "Roma" Or cap$ = "ROMA" Or cap$ = "roma" 'se scrive "roma"
Print "Bravo! Risposta esatta!"
Else 'altrimenti
Print "Sbagliato. La risposta esatta è Roma."
EndIf 'fine della scelta condizionata
Repeat 'ciclo a vuoto
Sleep 'dormi un instante per far funzionare gli altri programmi
Until Me Is Nothing 'termina il programma quando chiude la finestra
CloseW 1 'chiudi la finestra 1
Scritto il programma, salvalo (si consiglia di salvarlo frequentemente durante la scrittura); lo puoi eseguire
schiacciando F5 o il tasto play, freccia verde.
Il punto e virgola nel comando Print serve il contenuto di una variabile accanto al contenuto delle virgolette. Il
comando Print può essere abbreviato col punto interrogativo (?).
L’istruzione Input fa comparire un piccolo box in cui l’utente può scrivere qualcosa; quello che scrive è
memorizzato nella variabile scritta accanto a Input.
2
Donato D’Alessandro – Programmare il PC in GFA Basic
Generare numeri casuali. Il programma chiede all’utente tra quali numeri deve essere il numero casuale e se lo
vuole intero o anche decimale. La funzione Rnd ritorna numeri casuali compresi tra 0 e 1; moltiplicando per la
differenza b-a, si ottiene un altro intervallo (per esempio se a=3 e b=10, si ottengono numeri casuali da 0 a 7);
sommando a, i numeri partiranno proprio da a (nel nostro esempio si andrà da 0+3=3 a 7+3=10).
Dim a, b, i, n 'dichiara le variabili del programma
FullW 1
FontSize = 20 'l'altezza dei caratteri sia 20 punti
Input "Da quale numero parto?";a
Input "Fiano a quale numero?";b
Input "Numeri interi o anche decimali (scrivi i per interi, altrimenti d)";i
n = Rnd * (b - a) + a
If i = "i" 'se l'utente vuole numeri interi
Print Round(n) //arrotonda il numero generato
Else 'altrimenti
Print n
EndIf
Do
Sleep
Until Me Is Nothing //chiudi quando l'utente chiude la finestra
CloseW 1
Numeri casuali messi a caso. Nel prossimo programma si generano e si stampano sullo schermo dei numeri casuali,
in posizioni casuali, con grandezza del carattere casuale e in tempi casuali.
Timer è una variabile riservata che ritorna il tempo trascorso dall’accensione del computer espresso in secondi.
Con Print AT(colonna, riga) possiamo stabilire la posizione di stampa sullo schermo fornendo il numero di
riga e il numero di colonna. Qui si danno numeri casuali di colonna (da 0 a 50) che di riga (da 0 a 30).
L’istruzione DoEvents è simile a Sleep, ma qui conviene usare DoEvents perché nel ciclo ci sono molti calcoli
(un continuo controllo del tempo trascorso).1
Dim t0, s
FullW 1
t0 = Timer ' memorizza in t0 il Timer attuale
s = Rnd * 2 ' genera un numero casuale di secondi da 0 a 2
Repeat
FontSize = 20
Print AT(2, 2); Timer
If Timer - t0 > s ' se è trascorso almeno il tempo s
FontSize = Rnd * 20 + 10 ' dim. del font casuale da 10 a 30 punti
Print AT(Rnd * 50, Rnd * 20); Round(Rnd * 100)
t0 = Timer 'memorizza in t0 il nuovo tempo
s = Rnd * 2 'genera un nuovo tempo s casuale
EndIf
DoEvents 'passa il controllo al kernel dell'ambiente operativo
Until Me Is Nothing
CloseW 1
Attenzione: se per qualche motivo il programma non si chiude, può essere fermato in emergenza con
Ctrl+Interr (o Ctrl+Pausa); è bene sempre però chiuderlo normalmente, per evitare errori in Windows; quindi
in ogni programma che si scrive si deve prevedere un modo per interromperlo senza dover ricorrere al
metodo descritto.
1
Non bisognerebbe usare DoEvents nel ciclo principale del programma, perché utilizza molto il processore; più in là studieremo
la programmazione a eventi e utilizzeremo meglio queste istruzioni.
3
Donato D’Alessandro – Programmare il PC in GFA Basic
1.3 Programmi grafici
O
Lo schermo del computer è assimilabile a un piano cartesiano. Se la x
risoluzione è 1024x768, ci saranno 1024 punti sull’asse delle ascisse
e 768 su quello delle ordinate. L’asse delle ordinate è rivolto verso il P1(750;120)
basso, come si vede nella figura a destra, a differenza del piano
cartesiano che usiamo abitualmente in matematica.
Realizziamo per iniziare un programma che apra una finestra a
schermo pieno, ci dica la risoluzione della finestra e disegni un P2(712;650)
y
rettangolo al centro e due circonferenze ai lati del rettangolo.
La funzione _X è ritorna la risoluzione orizzontale della finestra in
uso e _Y quella verticale.
Il programma sceglie con FontSize l’altezza del carattere pari a un decimo della risoluzione orizzontale (così,
anche cambiando dispositivo e risoluzione, la schermata resta proporzionata e leggibile). Analogamente disegna
cerchi e rettangolo utilizzando sempre come riferimento _X e _Y.
Con il comando Defline si può scegliere lo stile della linea (primo parametro) e il suo spessore (secondo
parametro).
FullW 1
FontSize = _X / 100
Print "La risoluzione orizzontale della finestra è "; _X
Print "La risoluzione verticale della finestra è "; _Y
Print "Disegno ora un rettangolo esattamente al centro "
Print "e due cerchi di raggio pari a un decimo della risoluzione orizzontale"
Print "posti uno; a 1/4 e l`altro ai 3/4 dello schermo"
DefLine 0, 10 'lo spessore delle linee sarà di 10 punti
Box _X / 2 - 150, _Y / 2 - 130, _X / 2 + 150, _Y / 2 + 130
Circle _X / 4, _Y / 2, _X / 10
Circle _X * 3 / 4, _Y / 2, _X / 10
Repeat
Sleep
Until Me Is Nothing
CloseW 1
4
Donato D’Alessandro – Programmare il PC in GFA Basic
Disegnare col mouse. Scriviamo un programma che disegni sullo schermo un cerchio pieno nella posizione del
mouse quando si prema il tasto sinistro; insomma, un programmino per disegnare sullo schermo col mouse.
Dim mx, my, mk
FullW 1
Repeat 'comincia un ciclo continuo
Mouse mx, my, mk 'memorizza nelle variabili mx, my e mk coordinate del mouse
If mk = 1 'se il tasto premuto è il sinistro
PCircle mx, my, 20 'disegna un cerchio pieno di raggio 20 punti alle
coordinate del mouse
EndIf 'fine delle azioni da fare in questa condizione
Sleep
Until mk = 2 'ripeti il ciclo finché non si preme il tasto destro del
mouse
CloseW 1 'chiudi la finestra n. 1
Le istruzioni Repeat (=ripeti) e Until (=fino a che) fanno sì che la parte di
programma compresa fra esse si ripeta continuamente, finché non si avvera la
condizione scritta accanto a Until.
L’istruzione Mouse memorizza nelle variabili che seguono (che possono avere un
nome qualsiasi) le coordinate del mouse (prime due variabili) e il tasto premuto;
il valore di quest’ultima variabile può essere
0 – nessun tasto premuto
1 – tasto sinistro premuto
2 – tasto destro premuto
L’istruzione If (=se) esegue le istruzioni che seguono fino a EndIf, se si avvera la condizione scritta accanto ad
essa. In questo programma, quindi, è scritto: “Se è stato premuto il tasto sinistro del mouse, disegna un cerchio col
centro di coordinate pari alla posizione del mouse e di raggio 20”.
La sintassi di PCircle, che disegna un cerchio, è la seguente:
PCIRCLE xc,yc,r dove xc è l’ascissa centro; yc è l’ordinata del centro; r è il raggio.
Altri comandi grafici (per maggiori informazioni consultare l’Help):
CIRCLE xc,yc,r ‘disegna una circonferenza
ELLIPSE xc,yc,r1,r2 ‘disegna una ellisse di raggi r1 e r2
BOX x1,y1,x2,y2 ‘disegna un rettangolo; x1 e y1 sono le coordinate del punto
superiore sinistro, x2 e y2 le coordinate del punto inferiore destro
PBOX x1,y1,x2,y2 ‘disegna un rettangolo pieno;
PLOT x,y ‘ disegna un punto di coordinate x e y
LINE x1,y1,x2,y2 ‘ disegna un segmento tra i punti di coordinate (x1,y1) e (x2,y2)
2
Le stampanti usano i colori ciano, magenta e giallo (e anche il nero per migliorare la qualità) nella cosiddetta sintesi sottrattiva.
3 3
Nota che avendo tre numeri compresi tra 0 e 255, il numero di combinazioni possibile sono 256 , ovvero 16.777.216.
5
Donato D’Alessandro – Programmare il PC in GFA Basic
Se vogliamo disegnare con il rosso, useremo quindi l’istruzione RGBColor RGB(255, 0, 0):
Dim mx, my, mk
FullW # 1
Repeat
Mouse mx, my, mk
If mk = 1
RGBColor RGB(255, 0, 0)
PCircle mx, my, 20
EndIf
Sleep
Until Me Is Nothing
CloseW # 1
Coloriamo ora con casualità, utilizzando la funzione Rnd. Come abbiamo visto, essa fornisce un numero casuale
compreso tra 0 e 1. Moltiplicando tale numero per 255, otteniamo un numero casuale compreso tra 0 e 255.
Il programma diventa quindi:
Dim mx, my, mk
FullW # 1
Repeat
Mouse mx, my, mk
If mk = 1
RGBColor RGB(Rnd * 255, Rnd * 255, Rnd * 255)
PCircle mx, my, 20
EndIf
Sleep
Until Me Is Nothing
CloseW # 1
Facciamo in modo ora di disegnare cerchi colorati con il contorno nero, forse può essere più bello da vedere.
Usiamo quindi il comando PCircle dopo aver selezionato un colore, e quindi il comando Circle (contorno del
cerchio) dopo aver selezionato il colore nero.
Dim mx, my, mk
FullW # 1
Repeat
Mouse mx, my, mk
If mk = 1
RGBColor RGB(Rnd * 255, Rnd * 255, Rnd * 255)
PCircle mx, my, 20
RGBColor 0 ' seleziono il nero
Circle mx, my, 20
EndIf
Sleep
Until Me Is Nothing
CloseW # 1
Vorrei ora disegnare un tubo che aumenti il suo diametro
quanto più in basso disegniamo, come per dare una certa
profondità al disegno.
Il raggio, quindi, non sarà più una costante pari a 20 punti,
bensì un numero che cresce con l’ordinata del mouse my, ad
esempio pari a 20+my/10 (il minimo raggio è 20, a cui si
aggiunge un trentesimo dell’ordinata, che, vi ricordo,
aumenta verso il basso):
Dim mx, my, mk
FullW 1
Repeat
Mouse mx, my, mk
If mk = 1
RGBColor RGB(Rnd * 255, Rnd * 255, Rnd * 255)
PCircle mx, my, 20 + my / 10 ‘il raggio cresce con l’aumentare dell’ordinata
EndIf
6
Donato D’Alessandro – Programmare il PC in GFA Basic
Sleep
Until Me Is Nothing
CloseW 1
Prova ora le varie combinazioni tra rosso, verde e blu per vedere che colore viene fuori. Inoltre, se vogliamo avere
solo gradazioni di rosso, potremmo scrivere
RGBColor RGB(Rnd * 255, 0, 0)
Analogamente, per gradazioni di verde
RGBColor RGB(0, Rnd * 255, 0)
Se vogliamo sfumare il colore gradualmente, potremmo inserire come componenti dei colori formule contenenti
ascissa o ordinata del mouse, o il tempo che passa… Ad esempio usando il prossimo comando il colore varia con
l’ascissa del mouse, quindi a sinistra dello schermo è nero ma spostando il puntatore verso destra diventa rosso
sempre più acceso:
RGBColor RGB(mx, 0, 0)
Domanda: noterai che quando mx arriva a 255, il colore diventa
rosso vivo e subito dopo torna a essere nero (vedi la figura a
destra); come modificare l’espressione mx per far sì che diventi
rosso acceso solo all’estrema destra della finestra?
7
Donato D’Alessandro – Programmare il PC in GFA Basic
1.6 Selezionare il colore da una tavolozza
Vogliamo scrivere un programma in cui l’utente possa selezionare il colore da utilizzare. Dobbiamo quindi far
comparire sullo schermo una tavolozza, per ora di tre colori, che consisterà in tre riquadri colorati; l’utente farà clic
sul colore desiderato che sarà utilizzato nel disegno.
Nel programma scritto di seguito si controllano i rettangoli colorati uno per uno, confrontando le coordinate del
mouse con quelle dei riquadri; più in là, quando studieremo i cicli, con poche righe potremo controllare un numero
enorme di pulsanti virtuali.
Dim mx, my, mk
FullW 1
RGBColor RGB(255, 0, 0) ' seleziona il rosso
PBox 10, 10, 200, 200 ' disegna un rettangolo rosso
RGBColor RGB(255, 255, 0) ' sel. il giallo
PBox 210, 10, 400, 200
RGBColor RGB(0, 255, 255) ' sel. il ciano
PBox 410, 10, 600, 200
Repeat
Mouse mx, my, mk
If mk = 1
If mx > 10 And mx < 200 And my > 10 And my < 200
'se il mouse si trova sul primo box
RGBColor RGB(255, 0, 0) ' seleziona il rosso
Else If mx > 210 And mx < 500 And my > 10 And my < 200
RGBColor RGB(255, 255, 0)
Else If mx > 410 And mx < 600 And my > 10 And my < 200
RGBColor RGB(0, 255, 255)
Else ' altrimenti
PCircle mx, my, 20 + my / 30 'disegna un cerchio del colore selez.
EndIf
EndIf
Sleep
Until Me Is Nothing
CloseW 1
Si può far in modo di poter selezionare tanti colori, regolare il tono con un
movimento del mouse, come pure variare lo spessore del pennello, o la
tecnica (per esempio il tratto potrebbe essere dato non da un cerchio, ma
da un insieme di tanti punti…). Prova tu a migliorarlo!
8
Donato D’Alessandro – Programmare il PC in GFA Basic