Inleiding
In de les ‘Communicatie tussen Sprites’ wordt aangeleerd hoe Sprites berichten (in het Engels messages) kunnen uitwisselen met elkaar. Berichten zullen worden versleuteld zodat ze enkel door bepaalde Sprites kunnen worden begrepen.
Encryptie verwijst naar technieken om gegevens te versleutelen vooraleer deze gegevens worden gecommuniceerd of opgeslagen. Een eenvoudig codeer algoritme wordt toegeschreven aan Julius Caesar en staat bekend als de Caesar codering. Door voor elke letter in het alfabet een vaste verschuiving toe te passen naar een andere letter in het alfabet wordt een tekst gecodeerd.
Elke Sprite zijn/haar eigen variabelen

Tot op heden hadden alle Sprites steeds toegang tot alle variabelen die in het programma werden gedefinieerd. Voorlopig hebben wij namelijk steeds het vakje Voor alle sprites aangevinkt bij de definitie van een nieuwe variabele.

Een variabele kan evenwel ook worden toegekend aan een bepaalde Sprite door Alleen voor deze sprite aan te vinken. Enkel deze Sprite kan dan van deze variabele gebruik maken. Op deze manier kunnen zowel Abby als Dee bijvoorbeeld over een variabele Positie beschikken. Deze variabelen staan dan volledig los van elkaar en kunnen elkaar niet beïnvloeden. De variabele Positie van Dee kan dan bijvoorbeeld de waarde 10 bevatten terwijl de variabele Positie van Abby de waarde 0 heeft. Indien we beide variabelen zichtbaar maken dan wordt dit verschil duidelijk weergegeven in het speelveld.
Om ongewenste beïnvloeding van variabelen door een andere Sprite te vermijden, is het aan te bevelen om variabelen steeds te beperken tot een welbepaalde Sprite (Alleen voor deze Sprite). Enkel variabelen die ook nuttig of nodig zijn voor andere Sprites worden dan gedefinieerd Voor alle sprites.
Deze redenering zullen we nu verder illustreren in dit hoofdstuk.
Communicatie tussen Sprites
In deze les gebruiken we twee Sprites: Dee en Abby. Dee zal een versleutelde boodschap overbrengen naar Abby. We starten dus met het verwijderen van onze Scratch-mascotte en voegen de Sprites Dee en Abby toe.

Dee start bijvoorbeeld het gesprek met een eenvoudig welkomstbericht “Abby, ik heb een bericht voor jou!”. Om een reactie van Abby uit te lokken verstuurt hij tevens het signaal ‘Abby Welkom‘. Dit signaal is niet enkel ‘hoorbaar’ door Abby maar kan ook door alle andere Sprites worden opgevangen. Om een onderscheid te maken tussen de vele berichten die soms tussen de Sprites circuleren, zou ik aanraden om de naam van het signaal steeds te laten voorafgaan door de naam van de geviseerde Sprite. Het signaal ‘Abby: Welkom ‘ duidt aan dat dit signaal voor de Sprite Abby is bestemd. De naam toegekend aan het signaal is namelijk volledig willekeurig. Het is dan aan de geviseerde Sprite om op het toegestuurde signaal al dan niet te reageren.

Een nieuw signaal kan worden aangemaakt door in het keuzeveld van het zend signaal-blok (categorie Gebeurtenissen) te kiezen voor Nieuw bericht. De naam van het nieuwe signaal kan nadien in een nieuw venster worden ingebracht.

De Sprite die op het signaal wil reageren (in dit geval Abby) maakt dan gebruik van het startblok Wanneer ik het signaal ‘Abby: Welkom’ ontvang uit de categorie Gebeurtenissen. Abby kan tevens reageren met een nieuw Dee:OK-signaal om Dee te laten weten dat hij verder kan gaan. Dee zal dan dit signaal opvangen als reactie op dit bericht van Abby. Op deze manier kan op een eenvoudige manier een vlotte conversatie tussen Sprites worden gerealiseerd.
Caesar codering
Julius Caesar gebruikte geheimschrift om met zijn veldheren te communiceren. Caesar verving elke letter uit het alfabet door een letter op een vast aantal plaatsen vroeger of later in het alfabet. Het aantal plaatsen verschuiving wordt aangeduid met de term rotatie. In volgend voorbeeld wordt een rotatie van 3 (rot3) gebruikt: A wordt vervangen door D, B wordt vervangen door E,…X door A, Y door B, Z door C…

In het algoritme zullen we gebruik moeten maken van twee strings: een string met het volledig alfabet (variabele Alfabet) en een string met de letters die de karakters op dezelfde posities in Alfabet moeten vervangen (variabele CaesarCode). Beide strings moeten zowel voor Dee als voor Abby toegankelijk zijn (Voor alle sprites).
De string CaesarCode
De string CaesarCode kan worden opgevuld door, voor elke letter van Alfabet, de letter te selecteren gelegen op de Positie van het oorspronkelijk karakter verhoogd met de waarde van de rotatie (variabele Rotatie). Als de berekende
Plaats (Positie+Rotatie) buiten de lengte van Alfabet valt (Plaats groter dan of gelijk aan 27) dan wordt de variabele Plaats verminderd met de lengte (26) van de string Alfabet. Deze werkwijze moet worden uitgevoerd voor alle letters in Alfabet. De variabelen Plaats en Positie kunnen worden gedefinieerd als behorend tot de Sprite Dee (Alleen voor deze sprite).
De pseudocode voor de procedure definieer_CaesarCode met de variabele Rotatie als parameter, kan dan als volgt worden voorgesteld:
Initialiseer Alfabet met alle letters van het alfabet
Initialiseer CaesarCode met een lege waarde
Initialiseer Positie op 1
Initialiseer Plaats op 1
Repeat voor alle karakters van Alfabet
Maak de variabele Plaats gelijk aan de variabele Positie + Rotatie
If de variabele Plaats > 26 Then
Verminder de variabele Plaats met 26
End If
Voeg het karakter op Plaats van Alfabet toe aan de variabele CaesarCode
Verhoog Positie met 1
End Repeat
Het Scratch-blok kan nu als volgt worden geprogrammeerd:

De tekst coderen
Om een tekst te coderen naar geheimschrift (variabele GeheimTekst) moeten alle letters van de oorspronkelijke tekst worden vervangen door de overeenkomstige letters uit de string CaesarCode. Indien een karakter niet beschikbaar is in de string Alfabet dan wordt het betreffende karakter gewoon toegevoegd aan de string GeheimTekst.
Omdat de variabele GeheimTekst ook toegankelijk moet worden gesteld aan de Sprite Abby wordt deze variabele gedefinieerd als Voor alle sprites.
De pseudocode voor de procedure codeer_Tekst met de variabele Tekst als parameter, kan dan als volgt worden voorgesteld:
Initialiseer GeheimTekst met een lege waarde
Initialiseer Positie op 1
Repeat voor alle karakters van Tekst
If karakter op Positie van Tekst bestaat in Alfabet
zoek_Plaats van karakter op Positie in Alfabet en bewaar de waarde in Plaats
Voeg karakter op Plaats van CaesarCode toe aan GeheimTekst
Else
Voeg karakter op Positie van Tekst toe aan GeheimTekst
End If
Verhoog Positie met 1
End Repeat
Het Scratch-blok ziet er dan als volgt uit:

De zoek_Plaats-procedure zoekt de plaats van een bepaald karakter (parameter Karakter) in een bepaalde tekst (parameter Tekst):

Het coderen van de oorspronkelijke tekst en het verzenden van de gecodeerde tekst kan gebeuren op het moment dat Dee het signaal Dee:OK van Abby ontvangt:

Geheimschrift decoderen
Op het moment dat Abby het signaal Abby:BerichtVerstuurd van Dee ontvangt kan Abby het bericht in de variabele GeheimTekst decoderen en omzetten naar verstaanbare tekst (variabele GedecodeerdeTekst). De variabele GedecodeerdeTekst is natuurlijk enkel voor Abby toegankelijk (Alleen voor deze sprite).

Het denk-blok
(categorie Uiterlijken) is vergelijkbaar met het zeg-blok. Het denk-blok toont een tekst in een denkwolk.
De decodeer_Tekst-procedure zal elk karakter uit de variabele GeheimTekst omzetten naar het overeenkomstig karakter uit de string Alfabet. De werking van de procedure decodeer_Tekst is vrij gelijkaardig met de procedure codeer_Tekst in de vorige paragraaf.
De procedure decodeer_Tekst kan als volgt in Scratch worden geprogrammeerd:
