Kraps

Muutujad mängivad väga olulist rolli kõikides programmeerimiskeeltes. Võrreldes traditsiooniliste tekstipõhiste programmeerimiskeeltega on Scratchis muutujate kasutamises teatud iseärasused, kuid muutujate olemus ja kasutamise üldised põhimõtted on samad. Peamiseks erinevuses muutujate kasutamisel Scratchis on see, et siin luuakse muutujad nö "käsitsi".

 

Muutujate käsitlemine Scratchis

Muutuja olemus, nimi ja skoop

Muutuja on nimega varustatud koht arvuti mälus, kuhu programm saab salvestada mingi väärtuse: arvu, teksti jms. Salvestatud väärtust saab programm kasutada näiteks uue väärtuse leidmiseks, argumendina mingi tegevuse määramisel jm. Tegemist on mäluväljaga ehk lühemalt väljaga (öeldakse ka mälupesa ehk pesa). Viitamiseks väljale (muutujale) kasutatakse programmis nime.
Scratchis luuakse muutujad projekti loomise faasis grupis Andmed asuva korraldusega Loo muutuja. Korralduse alusel kuvatakse dialoogiboks, milles küsitatakse muutuja nime ja skoopi.

loom
Muutuja nimele mingid erilisi nõudeid või piiranguid Scratchis ei ole. Kuid on otstarbekas arvestada teatud väljakujunenud reeglitega, mis kehtivad enamikes programmeeri-miskeeltes. Muutuja nimi peab koosnema ühest tähest või tähtede ja numbrite jadast, mis peab algama tähega. Nimes ei tohi olla tähtedest ja numbritest erinevaid märke (tehtemärgid, kirjavahemärgid, sulud jmt), välja arvatud allkriipsud.  Nimes ei tohi olla tühikuid.

Muutuja skoobi saab kasutaja määrata vastava suvandinupu abil. Muutuja skoobi (scope) all mõistetakse selle määramispiirkonda ehk kättesaadavuse (nähtavuse) areaali. Scratchis saab kasutada globaalseid ja lokaalseid muutujaid ning pilvemuutujaid. Globaalne muutuja on kättesaadav kõikidele spraitidele ja lava skriptidele, lokaalne muutuja on otseselt kättesaadav ainult ühe spraidi jaoks. Pilvemuutujaid saab jagada Internetis teiste kasutajatega.
Peale esimese muutuja loomist, ilmuvad ka muutujatega seotud plokid: muutuja nimega viitamisplokk ning pinuplokid: võta, muuda, näitaja peida. Järgmiste muutujate lisamisel ilmuvad ainult muutujate nimedega viitamisplokid.

Muutujate monitorid ehk näidikud

Iga muutuja jaoks luuakse automaatselt monitor ehk näidik, mis võimaldab esitada laval muutuja jooksva väärtuse. Monitori saab näidata ja peita, lülitades sisse või välja märkeruudu muutuja nime ees. Monitori saab näidata või peita ka skriptis, kasutades käske [näita muutujat nimi] või [peida muutuja nimi]. 
monitorid

Monitoris kuvatakse muutuja nimi ja jooksev väärtus. Lokaalse muutuja monitoris kuvatakse muutuja
nime ees ka spraidi nimi. On kolm monitori esitusviisi ehk tüüpi:

  • tavaline ehk normaalne näit, kuvatakse muutuja nimi ja väärtus
  • liuguriga näit; liuguri ehk kerimisriba abil saab muuta muutuja väärtust. Liuguri jaoks saab vastava käsuga määrata minimaalse ja maksimaalse väärtuse. Oma olemuselt vastab liugur paljude süsteemide kasutajaliidestes esinevale kerimisribale.
  • suur näit; muutuja nime ei kuvata. Muutuja identifitseerimiseks võib kasutada nn tekstispraiti.

    Vajaliku monitoritüübi saab valida menüüst, mis kuvatakse, kui klõpsata monitoril hiire parema nupuga.

Muutuja, monitori ja liuguri omadused ja meetodid

Muutuja kujutab endast objekti, millele vastab füüsilisel tasemel mäluväli. Nii nagu igal objektil, on ka muutujal teatud valik omadusi ja meetodeid. Scratchis on muutuja otse seotud monitoriga, mis kujutab endast muutuja alamobjekti. Viimasel võib olla liugur, mis on omakorda monitori alamobjekt. Tegemist on allpool toodud objektide süsteemiga. Siin, nagu ka teistes jaotistes, tähendab sulgude esinemine meetodi nime järel: n. näita(), seda, et vastavat meetodit (tegevust) saab täita ka skriptides. Sulgude puudumine näitab, et antud tegevust saab täita ainult nö „käsitsi“.
mudel

Monitor võimaldab näha muutuja jooksvat väärtust. Liuguri abil saab seda väärtust ka muuta. Liuguriga monitor on üsna sarnane tekstiboksiga, mis on seotud muutuja ja kerimisribaga. Viimasega saab muuta tekstiboksi väärtust ja selle kaudu ka muutuja väärtust.
         keri
Liugurit saab kuvada ja peita nö „käsitsi“ rakenduse loomise ajal. Selle jaoks saab määrata minimaalse ja maksimaalse väärtuse. Liuguri omadus väärtus, mis kuvatakse monitoris, on ühtlasi ka muutuja väärtus. Kui skriptis muudetakse muutuja väärtust, muutuvad ka monitori ja liuguri väärtused.
Monitori nimeks on muutuja nimi ning seda eraldi määrata ja muuta ei saa. Monitori tüübi ehk esitusviisi (tavaline, liuguriga või suur) saab määrata monitori objektimenüüst. Monitori nähtavust saab määrata nii käsitsi kui ka programselt. Monitori asukohta saab muuta hiire abil.
Muutuja nimest ja skoobist oli juttu eespool – jaotises „Muutuja olemus, nimi ja skoop“. Muutuja väärtuseks võivad olla arvud, tekstid, tõeväärtused või objektide nimed. Muutujate tüüpide  deklareerimist (määratlemist), mis on iseloomulik enamikule traditsioonilistele programmeerimiskeeltele, Scratchis ei toimu. Erinevatel ajahetkedel võib muutujal olla erinevat tüüpi väärtused: kord arv, teinekord tekst jms. Peab rõhutama, et igal ajahetkel saab muutujal olla ainult üks väärtus. NB! Peale programmi töö lõppu, muutuja viimane väärtus säilib!
Muutujate loomine ehk mälu (mäluvälja) eraldamine muutujatele toimub rakenduse loomise faasis nö „käsitsi“ korraldusega Loo muutuja. Enamikus traditsioonilistes programmeerimiskeeltes toimub see alati programmi täitmise ajal vastavate deklaratsioonide alusel. Ka muutujate eemaldamine projektist toimub Scratchis „käsitsi“.  Muutaja loomisel võetakse selle algväärtuseks 0 (null).
Muutuja väärtuse muutmiseks on Scratchis järgmised võimalused:

  • liuguri kasutamine (ainult arvud),
  • omistamine käskudega [võta muutuja = avaldis] ja [muuda muutuja avaldis võrra],  
  • lugemine klaviatuurilt käsuga [küsi … ja oota]   + käsk [võta muutuja = vastus].
Muutuja väärtuse lugemine seisneb muutuja väljas salvestatud väärtuse kasutamises näiteks uue väärtuse leidmiseks avaldise abil

Omistamine ja omistamiskäsk

Muutujale väärtuse omistamine seisneb mingi väärtuse salvestamises antud muutuja väljas. Sageli eelneb sellele väärtuse tuletamine (leidmine) etteantud avaldise alusel või lugemine väliskeskkonnast. Scratchis on omistamise põhivahendiks käsuplokk: omist n. muut_y
Siin on muutuja esindatud oma nimega; märki "=" nimetatakse omistamissümboliks ehk omistamisoperaatoriks (NB! mitte võrdlusmärgiks); avaldis määrab väärtuse leidmise eeskirja. Avaldise erijuhuks on ka konstant ja muutuja. Käsu täitmisel leitakse avaldise väärtus ja see võetakse muutuja väärtuseks, st salvestatakse muutujale eraldatud väljas.
Enamuses tekstipõhistes programmeerimiskeeltes ja ka pseudokoodis on omistamislausel järgmine kuju:
    muutuja = avaldis, n y = 5*(x + a)
Scratchis on ka omistamislause teine variant: muuda
Muutuja väärtust muudetakse avaldise väärtuse võrra ja saadud tulemus võetakse muutuja uueks väärtuseks. Taoline omistamine esitatakse tekstipõhistes keeltes kujul:
    muutuja = muutuja + avaldis või muutuja =+ avaldis

Mõned omistamiskäskude näited

na1t1
   S = 0             k = 1           nimi = "Juku Naaskel“

muutujatele omistatakse konstantide väärtused, st salvestatakse need vasakus pooles näidatud muutujate väljades
max = a max loetakse muutuja a väärtus ja salvestatakse see muutujas max – toimub kopeerimine, NB! [võta a = max] ei ole samaväärne, tegemist on vastupidise tegevusega
dikraminantD = b * b – 4 * a * c loetakse muutujate a, b ja c väärtused, leitakse avaldise väärtus ja omistatakse muutujale D – salvestatakse selle muutuja väljas
kp1 k = k + 1, loetakse muutuja k väärtus, liidetakse sellele 1 ja tulemus salvestatakse tagasi muutujasse k  
mm5 n = n – 5, loetakse muutuja n väärtus, lahutatakse 5, tulemus salvestatakse tagasi muutujasse n

Näide „Täpsusvisked"

 

Käivitamiseks klahv "Tühik"
Imiteeritakse täpsusviskeid palliga. Lava keskel asub kolmest kontsentrilisest ringist koosnev märklaud. Etteantud aja jooksul (piiraeg) muudetakse teatud sagedusega palli asukohta etteantud piirkonnas juhuarvude abil. Programm loendab visete arvu, tabamuste arvu, tabamuste protsendi ja punktide arvu.  Tabamuse korral antakse punkte sõltuvalt märklaua koha värvusest, kuhu sattus pall: punane 4 punkti, sinine 2 ja kollane 1 punkt.
Kasutusel on kaks spraiti: pall ja märklaud. Kõik skriptid on seotud palliga, märklaud on nö passiivne sprait. Arvestatakse palli sattumist selle sisse ja värve.
Visete juhtimiseks ja „statistika“ pidamiseks on kasutusel järgmised muutujad:

  • X ja Y – palli sihtkoha koordinaadid,
  • viskeid – visete jooksev ja lõpparv,
  • tabas – tabamuste jooksev ja lõpparv,
  • protsent – tabamuse protsent,
  • punkte – punktide arv

Aja kuvamiseks ja kontrolliks kasutatakse muutujaid:

  • aeg – jooksev aeg,
  • piiraeg – mängu aeg, saab valida kasutaja liuguri abil.

Kõik muutujad on globaalsed. Kuna kõik skriptid kuuluvad ühele spraidile, siis ei ole erilist vahet, kas kasutatakse lokaalseid või globaalseid muutujaid. Viimased on siiski veidi mugavamad monitoride kuvamise seisukohast, sest lokaalsete muutujate monitorides kuvatakse ka spraidi nimi.

pskr1

palskr2
Programm käivitub vajutusega klahvile tühik. Pall viiakse lava keskele. Muutujatele viskeid, tabas, protsent ja punkte omistatakse algväärtuseks 0. Seda peab tegema iga uue mängu alguses, sest muidu jätkatakse eelmise mängu tulemustest. Käsuga [teata Start] käivitatakse põhiskript ning paralleelselt jätkub antud skripti täitmine tegevustega, mis on seotud aja kontrolliga. Muutuja aeg algväärtuseks võetakse 0 ja pannakse taimer nulli. Edasi toimib kordus seni, kuni muutuja aeg väärtus saab võrdseks või suuremaks muuutuja piiraeg väärtusest. Korduse täitmine seisneb praktiliselt aja kuvamises ja kontrollis.

Põhiskript kujutab formaalselt lõputud kordust. See katkestatakse, kui aeg saab täis: esimeses skriptis täidetakse käsk [peata kõik]. Jälgige muutujate muutmist rakenduse täitmisel.
Igal kordamisel omistatakse muutujatele X ja Y juhuslikud väärtused ning käsuga [mine...], milles kasutatakse nimetatud muutujaid, viiakse pall uude kohta ja suurendatakse muutuja viskeid väärtust ühe võrra. Järgnev kui-plokk kontrollib, kas pall puudutab märklauda. Kui see on nii, suurendatakse muutuja tabas väärtust ühe võrra ning alamskript Mis värv kontrollib, millist värvi pall puudutab ja suurendab muutuja punkte väärtust nelja, kahe või ühe võrra. Sõltumata sellest, kas toimus tabamine, arvutatakse protsent, tehakse paus 1..2 sekundit ja protsess kordub.

Näita rakendust.

Väärtuste sisestamine

Väärtuse lugemiseks klaviatuurilt saab kasutada spraidi või lava skriptis andurigrupi plokki:
.kysi
Ploki täitmisel skripti töö peatakse, lava alumisse serva ilmub tekstiväli, kuhu saab tippida vajaliku väärtuse. Ploki sisendväljas olev teade (tekst) kuvatakse kõneballoonis vastava spraidi juures (plokk on spraidi skriptis) või tekstivälja ülaosas (plokk on lava skriptis).

knimi lai

Kui kasutaja tipib tekstiväljas väärtuse (tekst või arv) ja vajutab klahvile Enter või klõpsab märkeringi tekstivälja paremas otsas, võetakse väärtus ploki  vastusväärtuseks. Ploki [vastus] näol on tegemist omamoodi süsteemi sisemuutujaga. Seda võib kasutada avaldistes ja käskudes või selle väärtuse võib omistada muutujale.
Kuna järgmise ploki [küsi … ja oota] täitmisel asendab uus sisend ploki (sisemuutuja) vastus eelmise väärtuse, siis sisemuutuja vastus väärtus tüüpiliselt omistatakse nö "tavalisele" muutujale taoliselt:

sis_muut

Väärtuste kuvamine ekraanile

Scratch ei saa printida andmeid ega väljastada neid välismälu faili, Andmeid saab ainult kuvada kuvari ekraanile kahel viisil:

  • muutujate monitorides ehk näidikutes
  • käskudega [ütle avaldis] ja [mõtle avaldis] nn kõnebaloonides

Näidikute abil väärtuse kuvamine kaasneb väärtuse leidmisele käskudega
[võta muutuja = avaldis] ja [muuda muutuja avaldis võrra], avadise erijuhuks on konstant või muutuja. Näidikuid saab peita ja kuvada vajalikul hetkel käskudega [peida muutuja...] ja [näita muutujat...]. Muide, taolist väärtuste kuvamise viisi kasutatakse teistes programmeerimiskeeltes tekstiboksides vormidel.
Käskudes [ütle ...] ja [mõtle ...] saab lasta kuvada suvalisi avaldisi. Naiteks toodud avaldis kuvab taolise teate:

ay

Näide „Ideaalne kaal“

 

Rakendus demonstreerib muutujate väärtuste sisestamist klaviatuurilt, muutmist liugurite abil, kuvamist monitorides, leidmis ja omistamist.
Rakendus võimaldab leida inimese „ideaalse“ kaalu ehk massi mid (kg) järgmise valemi järgi:

ivalem

L – pikkus (cm),
v - vanus (aastates)

skr1

Esimene käsk [küsi …] loeb klaviatuurilt kasutaja nime. Kui kasutaja ei sisesta nime, on tegemist nn tühja väärtusega. Sellisel juhul skripti töö katkestatakse.
Kui kasutaja sisestab nime, omistatakse see muutujale nimi, seda muutujat kasutatakse mitmes käsus.
Järgnevad käsud [küsi …] loevad ja omistavad väärtused muutujatele L, v ja sugu.
Skript Ideaal leiab ideaalse massi.
Abimuutujale a omistatakse avaldiste ühisosa väärtus.

skr2

Näita rakendust.

Sammhaaval täitmine - skriptide täitmise visualiseerimine

Järgnevates klipides demonstreeritakse programmide (skriptide) sammhaaval täitmist ehk täitmise visualiseerimist. Järjest näidatakse ja kommenteeritakse täidetavaid käsuplokke ja tulemusi: muutuja väärtus, kuvatav teade vm. Siin ja ka edaspidi lähtutakse järgmisest lihtsustatud mudelist.
Täidetav programm asub arvuti põhimälus, selle põhiosadeks on programmiplokk ja andmeplokk. Programmiplokk sisaldab täidetavat skripti, andmeplokk - muutujate väärtusi (praegu näidatud muutujate monitoride abi).
Programmi täitmist korraldab Interpetaator. Selle põhikomponentideks on juhtplokk ja täiturplokk. Juhtplokk valib järjest käske, teeb kindlaks mida peab tegema ning annab täiturplokile korralduse käsu täitmiseks. Edaspidi viimaseid tavaliselt ei näidata.
Erilist tähelepanu võiks praegu pöörata muutujate väärtuste muutumisele (muutujate monitoride sisule) vastavate käskude toimel.

Näide „Korrutamine“

Igal käivitamisel programm (skript) genereerib kaks juhuarvu vahemikus 1 kuni 10 ja salvestab need muutujates a ja b, kuvab korrutamise ülesande, loeb kasutaja vastuse, kotrollib selle õigsust ning kuvab vastava teate teate Õige või Vale.
Pogrammis on kasutusel kolm muutujat:
   a ja b - globaalsed muutujad, neisse salvestatake genereeritud juhuarvud,
   vastus - sisemuutuja, kuhu salvestatakse kasutaja poolt sisestatav vastus.
Klipp võimaldab vaadelda ka algoritmi täitmist pseudokoodis

 

Näide "Animatsioon: horisontaalne liikumine ja hüppamine"

Näide demonstreerib muutujate kasutamist animatsiooni juhtimisel.
Kraps alguses liigub vasakult paremale ia seejärel teeb antud arvu hüpet. Kasutusel on kaks skripti: Liigu ja Hüppa. Skriptide pilte (need on ühe spraidi kaks kostüümi) võib näha laval, Hiireklõps vahetab skripti pildi. Täitmise ajal vahetab neid programm.
Rakenduses kasutatakse üsna palju muutujaid:
n - korduste (sammude) arv liikumisel, h - sammu pikkus, paus - sammudevaheline paus,
nh - hüpete arv, hh - hüppe kõrgus, ph - paus hüpete vahel,
heli - heli tugevus (0 kuni 100%)
Ülaltoodud muutujate väärtusi saab teatud piirides muuta kasutaja
x0, y0 - Krapsu koordinaadid alguses, nende monitore laval ei ole, väärtused määrab programm
Laval on ka objekti Kraps omaduste x ja y monitorid, mis peegelavad nende jooksvaid väärtusi. Objektide omadused (x, y, suund, suurus jm) on nende lokaalsed muutujad.

 

Näita rakendust

Näide "Rehmaatika"

Siin programm esitab järjest mitu korrutamise ülesannet ja kontrollib vastuseid.
Muutujad
:
n - ülesannete arv, a ja b - genereeritavad juhuarvud, punkte - õigete vastuste arv, vastus - kasutaja vastus (sisemuutuja), paus - pausi pikkus kiiruse reguleerimiseks.

 

Näide "Naturaalarvude ruutude summa"

Rakendus demonstreerib skripti tööd, mis leiab naturaalarvude ruutude summa,
Kasutusel on kolm põhimuutujat:
  n - liikmete arv, k - arvu jooksev väärtus (1 kuni n), Sum - arvude ruutude jooksev summa.
Jälgige muutujate k ja Sum muutmist käskudega [muuda k 1 võrra] (k=k+1) ja
[võta Sum = Sum + k*k] (Sum=Sum+k*k). Igal kordamisel võetakse muutuja k jooksev väärtus, liidetakse sellele 1 ja saadud väärtus salvestatakse tagasi muutujasse k, seega suurendatakse väärtust ühe võrra. Analoogiliselt toimub summa nö kogumine. Muutuja Sum jooksvale väärtusele liidetakse k*k väärtus ja tulemus salvestatakse tagasi muutujasse Sum. Enne korduse algust omistatakse muutujale k ja Sum väärtus 0.

 

Muutujate kasutamine objektidele viitamiseks

Muutujale võib omistada ka objekti (sprait, heliklipp) nime. Sellisel juhul võib muutujat kasutada viitamiseks erinevatele objektidele. Taolisi muutujaid nimetatakse sageli viitmuutujateks ehk objektimuutujateks. Objektimuutujat võib kasutada objektile viitamiseks kindla nime (konstandi) asemel plokkides ja käskudes, kus on ette nähtud viit objektile: [mine objekt], [osuta objekt], [omadus kujundil objekt], [mängi heli].
Näide. Laval on Kraps ja tema sõbrad - spraidid (objektid) nimedega: koer, part, hiir ja kass. Kui klõpsatakse mõnda sõpradest, omistatakse selle nimi muutujale NN ning väljastatakse teade Tule. Selle võtab vastu Kraps ja läheb sõbrale külla, tuleb tagasi lava keskele ja ütleb kauguse sõbrani.

 

om

ob2
Krapsu skript demonstreerib muutuja NN kasutamist viitamiseks objektidele (spraitidele).
Käsk [osuta NN] pöörab Krapsu spraidi poole, mida klõpsati. Käsk ütle kuvab teksti „Oi! nimiI“, kus nimi on spraidi nimi, mida klõpsati. Järgmised kaks käsku omistavad muutujatele X ja Y spraidi koordinaadid, mille nimi on muutujas NN. Käsk liigu viib Krapsu vastava spraidi juurde.
Käsus ütle kasutatakse muutuja NN tekstväärtust: kuvatakse tekst „Tere“ ja vastav nimi. Järgmine käsk liigu viib Krapsu lava keskkohta. Käsk võta leiab ja omistab muutujale L vahemaa Krapsu ja selle spraidi vahel, mille nimi on muutujas NN.

Näide „Suur võidusõit“

 

Käivitamiseks klahv "Tühik"
Näide illustreerib lokaasete ja globaalsete muutujate, omistamise ning erinevat tüüpi monitoride kasutamist. Esineb ka objektimuutuja. Imiteeritakse autode võidusõitu. Võistlevad kolm autot. Sõidetavate „ringide“ arvu (muutuja ringe väärtuse) saab kasutaja määrata teatud piirides liuguri abil. Programm fikseerib autode sõiduaajad ning teeb kindlaks võitja.
Projektis on neli põhiobjekti: Kraps (kohtunik) ja kolm autot.
Kasutusel on kaks globaalset muutujat: ringe ja võitja. Igal autol on kaks lokaalset muutujat: ring – jooksva ringi number ja aeg – jooksva ringi ja lõppaeg. Lisaks on Krapsul üks lokaalne abimuutuja (min). Ühetüübiliste väärtuste salvestamiseks on lokaalsete muutujate kasutamine üsna kasulik. Tänu sellele on näiteks siin kõikide autode skriptid täiesti ühesugused. Tehes skripti ühe spraidi jaoks ja paljundades seda, saab kohe uue spraidi valmis skriptiga. Globaalsete muutujate korral peaks võtma kuus erineva nimega muutujat näiteks aeg_1, aeg_2, aeg_3, ring_1 jne ning korrigeerima skripte peale kopeerimist.
Pärast algseadete tegemist ja taimeri viimist algseisu, käivitab põhiskript käsuga [teavita Start] autode skriptid. Need juhivad autode ringliiklust, kuvavad iga auto jaoks jooksva ringi aja ja sõidu koguaja. 

Kraps. Põhiskript a_kraps
Käsus mine kasutatakse objektile viitamiseks muutujat.

Autod
Kõigil kolmel autol on täpselt ühesugused skriptid.

Sõit lava parempoolse servani.

Tagasi vasakusse serva

 

Jooksva ringi aeg.
Ringi numbri muutmine

auto
kes
Kui kõik autod on sõidu lõpetanud, käivitatakse abiskript Kes, mis teeb kindlaks võitja.
Kõigepealt võetakse muutuja min väärtuseks auto_1 aeg ja muutujale võitja omistatakse esimese auto nimi auto1. Kui auto2 aeg on väiksem min väärtusest, võetakse see muutuja min uueks väärtuseks ning muutujale võitja omistatakse nimi auto2. Ning lõpuks, kui auto3 aeg on omakorda väiksem kui min, omistatakse muutujale võitja nimi auto3.
Muutujat võitja kasutakse viitamiseks objektile käsus mine, mis viib Krapsu võitnud auto juurde.