Kraps

Programmi skriptides peab määrama vajalikud tegevused ja nende täitmise järjekorra, arvestades ülesande olemust ja Scratchis olevaid vahendeid protsesside juhtimiseks. Selleks on olemas vastavad plokid grupis Juhtimine, mille abil saab kirjeldada erinevat liiki kordusi ja valikuid ning esitada muid juhtimisega seotuid korraldusi.

Protsesside juhtimisest

Põhimõtteliselt on protsess suvaline tegevuste kogum. Scratchis kujutab protsessi kirjelduse käsuplokkide gruppi, milleks võib olla terve skript või osa sellest. Sõltumata kasutatavatest vahenditest võib ülesannete lahendamisel eristada nelja liiki protsesse:

  • järjestikprotsess ehk jada
  • tsükliline protsess ehk kordus
  • hargnev protsess ehk valik
  • paralleelsed protsessid.

Paralleelseid protsesse saab Scratchis realiseerida ainult nö projekti tasemel: paralleelselt saab täita skripte, skripti sees tegevusi paralleelselt täita ei saa. Skriptid, millel on ühesugune päiseplokk: [kui klõpsati rohelist lippu], [kui vajutati klahvi...], [kui teade nimi] käivituvad üheaegselt vastava sündmuse esinemisel (näiteks teate saabumisel) ja töötavad paralleelselt. Paralleelprotsesse siin eraldi ei vaadelda, nad lihtsalt esinevad mitmes näites.

Järjestikprotsessid

Järjestikprotsessi korral täidetakse kõik käsud täpselt sellises järjekorras nagu nad on esitatud programmis. Käske ei jäeta vahele ega toimu kordamisi. Mingeid erilisi vahendeid protsessi määratlemisel ei ole vaja, sest täitmine toimub nö loomulikus järjekorras. Illustratsiooniks on toodud kaks näidet.

Jada_rist.gif

Jada_trumm_1.gif

Esimese skripti korral on tegemist ülesandega, mille lahendamine oma olemuselt kujutab järjestikust protsessi. Programm küsib ja loeb ristküliku külgede pikkused (a ja b), arvutab selle pindala (S) ja ümbermõõdu (P) ning leiab pindala ja ümbermõõdu suhte (suhe).
NB! käskude järjekorra valimisel peab arvestama, et neid täidetakse täpselt selles järjekorras, nagu need on esitatud programmis. Siin peavad algandmete lugemise käsud kindlasti eelnema pindala ja ümbermõõdu arvutamisele ning viimased omakorda suhte leidmisele. Samal ajal a ja b lugemise omavaheline järjekord ning S ja P arvutamise järjekord ei oma tähtsust.
Teises, samuti järjestikku täidetavas skriptis, korduvad kolm korda täpselt kolm ühesugust käsku. Sellisel juhul on otstarbekas kasutada korduste kirjeldamise vahendeid.

Tsüklilised protsessid

Tsükliline protsess seisneb tegevuste (käskude) korduvas täitmises. Programmis tuleb määrata reeglid ja tingimused, kuidas toimub protsessi täitmine. Scratchis on korduste kirjeldamiseks mitu erinevat käsuplokkiehk liitkäsku, mis võimaldavad arvestada erinevat tüüpi kordusega. Vt ka Algoritmimine.

Scratchis on vahendid kolme tüüpi korduste kirjeldamiseks:

  • etteantud korduste arvuga kordus
  • lõputu kordus
  • eelkontrolliga tingimuslik kordus

Etteantud korduste arvuga kordus

Selleks on Scratchis plokk [korda n], kus n on kordamiste arv. Viimane võib olla esitatud konstandi, muutuja või avaldise abil. Allpool on toodud ka antud korduse tüübi esitus UMLi diagrammidel ja algoritmikeeles. Samuti on kõrval toodud kordusena realiseeritud näide eelmisest jaotisest.


korda_n.gif

kordus n korda

    tegevused
    ....
lõpp kordus

kordus_trumm.gif

Etteantud korduste arvuga korduste demod

Klipis on toodud kolme lihtsa etteantud korduste arvuga korduse näited: Hyppa, Liigu ja Salto. Proovide neid käivitada nupuga Läks ja vaadata ka sammhaaval täitmist, käivitades neid nupuga Näita. Liuguritega paus ja heli, saab reguleerida täitmise kiirust ja heli kasutamist kordustes. Täiitmisel pange tähele, millised tegevused kuuluvad kordusesse ja millised mitte.

 

Näide. "Jalka. Karistuslöögid"

Imiteeritakse pealelööke väravale. Palli sihtkoha koordinaate määratakse juhuarvude abil. Laval on sprait nimega värav. Löökide (korduste) arv on määratud muutuja lööke väärtusega, seda saab muuta liuguri abil.
Programm loendab tabamuste arvu. Iga tabamuse korral väljastatakse teade Sees. Selle võtab vastu Krapsu skript, mis paneb Krapsu hüppama 3 kuni 5 korda (korduste arv määratakse juhuarvude abil). Peale korduse lõppu väljastab palli skript teate Valmis. Selle võtab vastu Krapsu skript, mis teeb kindlaks tabamusprotsendi ning kui see ei ole väiksem 50-st, teeb Kraps salto.
Rakenduses on kolm põhispraiti: Kraps, pall ja värav ning kolm muutujat: lööke, tabas ja protsent.
Nupuga Mäng saab käivitada mängu, nupuga Demo - põhiskripti sammhaaval täitmise.

 

Näide "Rehmaatika"

Skript esitab järjest korrutamise ülesandeid, loeb vastuseid ja hindab neid. Ülesannete arvu sisestab kasutaja. Rakenduses on kasutusel üks põhisprait: Kraps, kes esitab küsimusi ja hindab vastuseid. On veel mitu nö abispraiti: skripti pilt, käsunupud jm. On kasutusel järgmised muutujad: n - ülesannete arv, a ja b ülesanete operandid (juhuarvud), vastus (sisemuutuja), punkte, paus - demo täitmis kiiruse reguleerimiseks.
Saab lihtsalt käivitada (nupp Täida) või vaadata sammhaval täitmist (nupp Demo).

 

Lõputu kordus

Formaalselt täidetakse ploki sees olevaid käske lõputult. Praktiliselt katkestatakse kordus ühel või teisel viisil, kui peatatakse selle või kõikide skriptide töö. Alati saab katkestada kõik tegevused punase nupuga, ühe skripti töö lõpetab hiireklõps skriptil. Sageli katkestatakse kordus käsuga [stopp see skript] või [stopp kõik],  viimane võib asuda ka mõnes teises skriptis.


kordus

    tegevus
    ...

lõpp kordus

Loputu_Poorle.gif

Lõputu korduse demo

Näites töötavad paralleelselt kaks skripti, kus kasutatakse lõputud kordust. Krapsu käimist juhtiv skript ja palli lendamist korraldav skript. Demo variandis toimib ainult Krapsu skript. Lõpetada täitmise saab mõlemal juhul punase nupuga,

 

Näide "Kõik liiguvad"

Antud näites on kasutusel lausa viis lõputud kordust ja võib korraga toimida kuus paralleelset protsessi. Käivitage rakendus ja proovige, vaadake ka skripte.
Kui klõpsatakse rohelist lippu, hakkab Kraps liikuma lava alumises servas, kuhu viiakse ka pall. Kui Kraps puudutab palli, lendab see värava suunas. Pange tähele, et värav liigub ka. Jõudes sihtohta liigub pall tagasi lava alumisse serva ja hakkab seal liikuma edasi-tagasi, seni kuni teda ei puuduta Kraps. Krapsu saab pöörata ja liigutada ka nooleklahvidega. Siis kõik kordub, kuni kella aeg ei jõua etteantud 45 sekundini. Kella skript käsuga [stopp kõik] lõpetab kogu rakenduse töö: st kõik lõputud kordused. Muide, see on üks üsna tüüpiline lõputude korduste katkestamise variant,

 

LK!

LK2

Eelkontrolliga tingimuslik kordus

kord_eel_kuni.gif

kordus kuni ting

    tegevus
    ...

lõpp kordus

kell

Selle korduse liigi korral korratakse tegevusi, kuni antud tingimus saab tõeseks. Taolist korduse liiki nimetatakse mõnikord ka eelkontrolliga Until-korduseks (kuni-korduseks). Inglise keeles on see [repeat until tingimus]. Paljudes programmeerimiskeeltes on selle asemel või lisaks sellele nn While‑kordus (kui-kordus). Selle korduse tüübi korral korratakse tegevusi seni kuni tingimus on tõene.
Tingimuste esitamiseks kasutatakse Scratchis loogikaavaldisi, mis esitatakse võrdluste ja loogikatehete plokkide abil:
vordlus_1.gifloogika_ja_voi.gif
Loogikaavaldise väärtuseks saab olla ainult tõeväärtus: tõene (true) või väär (false). Loogikaavaldisi ja ülaltoodud plokke kasutatakse ka järgmistes jaotistes vaadeldavates käskudes.

Näide. Pall ja "ingel"

 

Taevas lendab (paremalt vasemale) ringi mingi nõia- või inglitaoline olevus. Kasutaja võib üritada tabada teda palliga ning saada võimalikult palju punkte. Mäng kestab valitud ajani m_aeg. Kõigis kolmes toodud skriptis kasutatakse tingimuslikku kordust. Esimene skript juhib ingli ringliiklust. Välises korduses kasutatakse lõputut kordust, mille katkestab taimeri skript. Sisemises korduses kontrollitakse pidevalt ingli x-koordinaati; kui see saab väiksemaks lava vasakpoolsest servast (x<-240), peidetakse sprait korraks, viiakse lava paremasse serva, tehakse nähtavaks ning lend jätkub. Parempoolne skript juhib palli lendu. Siin kontrollitakse korduses tingimust, kas pall jõuab lava ülemise ääreni. Kui jah, lõpetatakse kordus. Keskmine protseduur juhib aja kuvamist ning lõpetab kogu programmi töö, kui ületatakse valitud ajapiir.
Objektid:  pall, nõid. Kraps. Muutujad: aeg, m_aeg, viskeid, tabas

skript  Lenda_ingel
kordus
    kordus kuni ingel.x > lava.minX
        ingel.liigu h
    ingel.peida 
    paus 1..3 sek 
    ingel.x = lava.maxX
    ingel.näita
skript kell
taimer = 0
aeg = 0
kordus kuni aeg <= 0
    aeg = m_aeg - timer
stopp kõik
skript Lenda_pall
pall.y = lava.minY
pall.näita
viskeid = viskeid + 1
kordus kuni serv
    pall.y = pall.y + hy
    kui puudutab ingel siis
        tabas = tabas + 1
        pall.peida
        stopp skript  
noid
kell pall

Plokk "oota kuni"

oota_kuni.gif oota0

oota kuni tingimus

    tegevused
    ...
lõpp oota

oota_Kalle.gif

Tegemist on omapärase „valvuriga“, võiks öelda ka, et varjatud kordusega. Kui täitmisjärg jõuab antud plokini, hakatakse pidevalt kontrollima tingimust ja skripti töö ei lähe enne edasi, kui tingimus saab tõeseks. Võib ka mitte minna. Paralleeselt töötavad teised skriptid. Peab aga silmas pidama, et tingimuse väärtust antud skript ise muuta ei saa. Seda peab tegema mõni paralleelselt töötav skript.

Näide. Karistuslöögid. Etteantud tabamuste arv

 

Tegemist on jälle karistuslöökidega. Seekord määratakse programmi töö lõpp etteantud tabamuste arvuga. Antud juhul ei saa löökide arv ega aeg olla fikseeritud, sest tegemist on juhusega. Käivitakse korraga kaks skripti, mis töötavad paralleeselt. Muide, ka kolmas skript pannakse tööle: kella skript.

oota1
Esimise skripti esimeseks käsuks on [oota kuni tabas = norm]. See jätab skripti nö ooteseisu. Selles pidevalt kontrollitakse tingimust tabas = norm. Skripti töö jätkub, kui antud tingimus saab tõeseks. Täites mõned abitegevused, lõpetab see kogu programmi töö.
oota2
Teine skript töötab paralleelset ja see juhib löökide täitmist. Põhiosa skriptist kujutab endast lõputud kordust. Selle töö lõpetab esimese skripti käsk [stopp kõik], kui saab tõeseks tingimus tabas = norm.
Igal kordamisel genereeritakse kaks juhuarvu X ja Y: palli sihtkoha koordinaadid, ja käsuga [liigu ... sek ...] viiakse pall sinna. Sihtkohas kontrollitakse, kas pall puudutab väravat. Kui jah, suurendatakse tabamuste arvu ühe võrra, Pall viiakse tagasi Krapsu juurde, tehakse väikene paus ja kõik kordub.
oota3
Et demonstreerida käsu [oota kuni ...] kasutamist, on lisaspraidil baleriin skript, kus samuti on see käsk. Jukut saab liigutata noole-klahvidega. Kui ta viia puutesse antud spraidiga, käivitu-vad käsud, mis lõpetavad programmi töö. Proovige!

Hargnevad protsessid

Hargnevas protsessis valitakse antud tingimuste alusel mitmest võimalikust tegevusest üks. Vt ka Algoritmimine. Scratchis on kaks valikuplokki: valik kahest ja valik ühest. Esimesel juhul täidetakse kahest võimalikust plokkide grupist üks. Teisel juhul, olenevalt tingimuse väärtusest, antud plokid kas täidetakse või jäetakse vahele. Iga plokk võib omakorda sisaldada kui-plokke. Tingimuste esitamiseks kasutatakse loogikaavaldisi, mis esitatakse võrdluste ja loogikatehete plokkide abil:
vordlus_1.gifloogika_ja_voi.gif
Loogigaavaldise väärtuseks saab olla ainult tõeväärtus: tõene (true) või väär (false).


kui_muidu.gif

kui tingimus siis
    tegevused 1
muidu
    tegevused 2
lõpp kui

valik_2

kui_plokk.gif

kui tingimus siis
    tegevused
lõpp kui

valik_1

Näide. Suurim kolmest arvust

Nn klassikaline loogikaülesanne. On antud kolm arvu: a, b ja c, programm peab leidma neist suurima ja omistama selle väärtuse muutujale max. Vaatamata ülesande lihtsusele, on siin võimalikud mitu erinevat varianti. Allpool on toodud kolm.
Esimeses skriptis on kasutusel kolm järjestikust kui-plokki. Igas plokis võrreldakse ühte arvu kahe teisega. Kui tingimus on tõene, võetakse vastav arv muutuja max väärtuseks. Algoritm ei ole eriti ratsionaalne. Oletame, et suurim arv on a, see omistatakse muutujale max kohe esimeses plokis, kuid edasi kontrollitakse järgmisi tingimusi ikka. Seega täidetakse 9 tehet: igas tingimuses 2 võrdlust ja üks loogikatehe.
Teises skriptis valitakse suurim  väärtustest a ja b ning omistatakse muutujale max. Seejärel võrreldakse c väärtust max-ga ja kui see on suurem, võetakse max väärtuseks c. Halvimal juhul on kaks võrdlust ja kaks omistamist. Kolmandas skriptis võetakse kohe max algväärtuseks esimene arv a. Edasi võrreldakse teistega.
valik_max_3_1                valik_max_3_2            valik_max_3

Viimase variandi kohta on toodud ka täitmise demo:

Näide. Kolme arvu mediaan

Valitakse kolmest arvust vahepealne (mediaan). Kõigepealt valitakse min väärtuseks väiksem a-st ja b-st ning max väärtuseks suurem. Edasi toimub võrdlus c-ga ja tehakse kindlaks mediaan.


Näide. Fragment mängust „Kivi, paber, käärid“

 

Kaks mängijat (näiteks Pille ja Kalle) näitavad korraga ühe märkidest: kivi, paber või käärid, kasutades mingit kokkulepet (vt näide). Võitja tehakse kindlaks järgmiste reeglite kohaselt:

  • kivi võidab käärid,
  • käärid võidavad paberi,
  • paber võidab kivi

Programmis omistatakse kahele muutujale P (Pille) ja K (Kalle) väärtused: 1( kivi), 2 (paber), 3 (käärid). Kalle (esindab kasutajat) poolt teeb valiku kasutaja, klõpsates vastavat pilti: kivi, paber või käärid. Pille (esindab arvutit) jaoks genereerib program juhusliku arvu: 1, 2 või 3. Programmi põhisisuks ongi: teha kindlaks võrdluste abil teha kindlaks tulemus. Selleks on palju erinevaid variante. Allpool on toodud algoritm, milles kasutatakse järjestikuseid võrdlusi.

Nagu näha, on tegemist üsna pika ja võrdlemisi ebaülevaatliku esitusega. Kui kasutada loogikaavaldisi on lahendus kompaktsem ja selgem, kuigi Scratchi skript läheb veidi suureks teises suunas.



Toodud rakenduse realisatsioonis kasutatakse allpool toodud kolme skripti. Väliselt paistab olema tegemist kolme paralleelselt töötava skriptiga, kuid igal täitmisel töötab praktiliselt ainult üks neist. Käivitakse samaaegselt küll kõik kolm skripti, kuid tööle jääb see, kus esimene tingimus on tõene.
kivi