Introductie

Deze lesbrief gaan we je leren over de if-statement  en while loop. Deze zijn allemaal belangrijk voor wanneer we in de volgende les structuren gaan bouwen. Misschien dat je ze bij een andere cursus al tegen bent gekomen, maar zo niet, dan kan deze les een beetje lastig zijn. Neem dus gerust de tijd om er nog een keer overheen te kijken. Start eerst alle programma’s (IDLE, Python Shell, Bukkit Server en Minecraft) op en zorg dat de Bukkit Server verbonden is met Minecraft. Als je bent vergeten hoe dit moet, ga dan gerust terug naar lesbrief één om nog een keer te bekijken hoe dit allemaal werkt. Om te beginnen gaan we nog iets terughalen uit de vorige les, namelijk je lesbrief_2_variables script. Sla hem vervolgens op als lesbrief_3_ifstatement. In lesbrief 2 is nogmaals te zien hoe je iets onder een nieuwe naam opslaat.

Als alles goed is staat nu het volgende script in je document:

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

tekst= “Hello Minecraft World”

getal= 2

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(getal)

mc.postToChat(getal)

mc.postToChat(getal)

Het maakt niet uit als er andere teksten of getallen in de mc.postToChat() staan. Druk een keer op F5 en test of er ook tekst in de Minecraft chat verschijnt. Het is momenteel zo dat je tekst altijd zal worden geplaatst op het moment dat je op F5 drukt. Toch is het mogelijk om een voorwaarde hieraan te verbinden. Dit kun je zien als een meetlat bij een achtbaan. Hij meet of je groot genoeg bent om de achtbaan in te mogen en alleen als je groot genoeg bent, mag je er in. Bekijk nu de video om te zien hoe je je eigen meetlat aan je scripts kunt verbinden met de if-statement.

If-statement

Video_6_if-statement

If betekent als in het Engels. Je vertelt de computer dus om pas iets te gaan doen als er iets anders aan de hand is. Dit gaan we nu ook in je bestand doen. If-statements hebben allemaal een variable nodig. We gaan dus een extra variable maken die we a noemen. Typ onder

tekst= “Hello Minecraft World”

de regel:

a=1

Vervolgens gaan we een if-statement in het script brengen. Een if-statement wordt boven de regels geplaatst waar je een voorwaarde aan wil binden. De regels eronder moeten we inspringen. Dit kun je doen met spaties of de tab-balk. Het handigst is de tabbalk. Hierdoor krijgen we het volgende script:

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

tekst= “Hello Minecraft World”

a=1

getal= 2

if a==1:

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(getal)

mc.postToChat(getal)

mc.postToChat(getal)

 

Druk nu op F5. Als alles goed werkt, zal er nu tekst in de Minecraft chat ontstaan.

Verander nu a=1 in a=0 en druk weer op F5. Zoals te zien zal er geen tekst verschijnen in de chat door het feit dat de computer in de if-statement gaat kijken wat de waarde van a is. Hij komt er vervolgens achter dat die niet gelijk is aan 0 en vervolgens worden de stappen niet uitgevoerd. Let er op dat je bij een if-statement == ipv = gebruikt om een waarde te controleren. Een variable wordt een waarde gegeven met = en de waarde wordt gecheckt met ==.

Probeer nu eens te kijken wat er gebeurt als je de onderste regel niet laat inspringenmaar gewoon weer helemaal links laat staan. Pauzeer de video even om dit uit te voeren. Als je vervolgens op F5 drukt, zal die de onderste regel wel in de Minecraft chat plaatsen. Dit komt omdat een if-statement alleen slaat op wat eronder ingesprongen is. Probeer nu ook eens alleen de middelste regel niet in te laten springen, maar de rest wel. Nu krijg je een error melding. Het is daarom belangrijk om de dingen die je in een if-statement wil zetten netjes onder elkaar laat inspringen op dezelfde hoogte. Gebruik om geen fouten te maken ook niet de spatie-balk, maar de tab-balk.

 

If-statements werken alleen met cijfers, niet met woorden. Als we even de code terug pakken die we kort geleden hadden en aanpassen naar het volgende:

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

tekst= “a is 1”

tekst_2= “a is niet 1”

a=1

getal= 2

if a==1:

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(tekst_2)

 

Op het moment dat we instellen dat de variable a=0, is er geen probleem. Wat er wordt gezegd is waar. Echter, op het moment dat we a=1 zeggen, zullen beide statements worden uitgevoerd. Om te zorgen dat de tweede uitspraak alleen wordt uitgevoerd op het moment dat a ook echt geen 1 is, moeten we een tweede statement gebruiken: de else statement.

Pas het script aan naar het volgende:

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

tekst= “a is 1”

tekst_2= “a is niet 1”

a=1

getal= 2

if a==1:

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(tekst)

else:

mc.postToChat(tekst_2)

Nu is het wel zo dat tekst alleen wordt geplaatst in de chat als a=1 en anders wordt tekst_2 geplaatst. Hier is de else statement een soort if-statement, alleen gelden alle ingesprongen regels eronder pas als de if-statement erboven niet is bereikt. Sla dit script op.

Stel dat je nu iets wil uitvoeren wanneer de variable a kleiner is dan 5. Je zou dan meerdere if-statements onder elkaar kunnen zetten. Dit werkt op kleine schaal nog wel. Maar stel dat je nou voor alle getallen kleiner dan 1000 moet gaan testen met een if-statement? Dat zou behoorlijk veel werk zijn. Gelukkig heeft python hiervoor een oplossing. In plaats van een = teken kun je ook een < of > teken gebruiken wanneer je bedoelt dat iets groter of kleiner moet zijn. (**laten zien in video**). Ga eens experimenteren met verschillende getallen en tekens en if- of else-statements. Als je deze opslaat, sla ze dan onder andere namen op.

While-loop

Tot nu toe hebben we de computer meerdere opdrachten op rij uit laten voeren. Dit hebben we tot nu toe gedaan door meerdere keren dezelfde regel code onder elkaar te zetten. Nu kun je natuurlijk begrijpen dat dit voor langere opdrachten nogal onoverzichtelijk wordt. Daarom kun je in python iets gebruiken wat een loop heet. Een loop kun je eigenlijk zien als een soort racebaan waar je rondjes omheen rijdt. Je rijdt telkens hetzelfde rondje, maar kunt wel zelf bepalen wanneer je stopt. De while-loop werkt ook zo. Je geeft aan de computer aan na hoeveel rondjes hij moet stoppen en zet, net als bij een if-statement, de opdrachten er ingesprongen onder.

Pak weer het lesbrief_2_variables script erbij en sla hem onder de naam lesbrief_3_whileloop op. Je hebt nu als het goed is het volgende script:

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

tekst= “Hello Minecraft World”

getal= 2

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(tekst)

mc.postToChat(getal)

mc.postToChat(getal)

mc.postToChat(getal)

 

Video_7_while_loop

We vervangen nu de zes mc.postToChat() regels door het volgende stukje script:

while getal<6:

mc.postToChat(tekst)

getal=getal+1

mc.postToChat(getal)

mc.postToChat(“En nu is de loop voorbij.”)

Vervang ook getal=2, door getal=0

Als je nu op F5 drukt, zal er vijf keer de tekst in de Minecraft chat verschijnen, met daaronder oplopende cijfers. Dit werkt doordat de computer eerst bij while getal<6 kijkt of het getal ook echt kleiner is dan zes, vervolgens mc.postToChat(tekst) uitvoert en als laatste de variable getal met 1 verhoogt. Die laatste regel laat ook meteen zien dat je variables nieuwe waarden kunt geven in je script. In dit geval doen we dat met een rekensommetje. De eerste keer dat die door de loop gaat is getal 0. De laatste regel zegt dus eigenlijk: getal=0+1. De tweede keer is getal 1, dan zegt de laatste regel getal=1+1, de derde keer 2+1, etc. Op het moment dat getal gelijk is aan 5 zal die voor de laatste keer door het scriptje heen gaan. Dit komt doordat vervolgens getal gelijk is aan zes en er niet aan de voorwaarde in de while vraag wordt voldaan. Sla dit script op, want we hebben hem later nodig.

Zodra de loop voorbij is, zal het script gewoon zoals vanouds doorgaan. Dan plaatst hij ook het bericht “En nu is de loop voorbij.” Maak nu je eigen script die 10 keer je eigen naam in minecraft zet, gevolgd door 10 keer de naam van je woonplaats. Sla deze niet op. Pauzeer de video maar om dat te doen. Gelukt? Zo niet, dan laten we het je even zien (**laten zien hoe het moet**).

Met de while loop wordt het ook mogelijk om een script oneindig te laten lopen. Dit is belangrijk om allerlei leuke dingen in minecraft te doen, omdat je dan non-stop dingen kunt bijhouden. Om een script oneindig door te laten lopen gaan we gebruik maken van iets dat een infinite-loop heet. Infinite is het Engelse woord voor oneindig. Om te zorgen dat een loop oneindig is, moeten we zorgen dat de variable altijd aan de waarde voldoet die achter while staat. We gaan dit doen door de variable niet in de while loop te veranderen. Sluit het huidige bestand af zonder op te slaan en open hem weer of druk een aantal keer op ctrl en z om te zorgen dat je terug bent naar de staat voor je laatste opdracht. Sla eerst het script op als lesbrief_3_deurmat. Verwijder nu in je script de regel:

getal=getal+1 en

mc.posToChat(getal)

Druk nu op F5. Zoals te zien is blijft de loop draaien. Omdat het script niet zal eindigen en dit in sommige situaties bij het testen een probleem kan zijn, heeft python een ingebouwde manier om dit op te heffen. Ga naar de python shell en druk op Ctrl en op C tegelijk. Hierdoor zal het script ophouden met lopen. Merk ook op dat ook de regel na de while loop niet wordt uitgevoerd. Dit komt omdat het hele script wordt beëindigd. Daarnaast Experimenteer gerust met je eigen infinite loops.

Minecraft deurmat

Nu gaan we voor de eindopdracht de if-statement en while-loop combineren om een deurmat in minecraft te maken. De deurmat zal doorhebben dat je er op staat en zal in de chat de tekst welcome home plaatsen.

Video_8_welcome_home_mat

Eerst gaan we de deurmat in minecraft plaatsen. (**laten zien hoe dat moet**) Vervolgens moeten we weten waar in het spel de deurmat ligt. Open eerst in IDLE het script: lesbrief_2_coordinaten. We weten helaas niet welk getal in de chat past bij welk coordinaat. Hiervoor gaan we iets aanpassen in het script. Als het goed is, moet je het volgende script voor je hebben:

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

plaats=mc.playergetTilePos()

mc.postToChat(plaats.x)

mc.postToChat(plaats.z)

mc.postToChat(plaats.y)

Vervolgens gaan we aan de berichten die in de chat worden gezet toevoegen welke coordinaat waarbij hoort. Dit doen we door bijv. X= voor het getal te zetten. Hierbij is er wel één ding belangrijk. Op het moment dat je tekst en getallen in één bericht gaat plaatsen, moeten de getallen in de volgende statement staan: string(variable naam). Wat je nu doet is de tekst tussen aanhalingstekens zetten met een spatie tussen = en de laatste aanhalingsteken zodat die ook in het bericht verschijnt. Vervolgens zet je een plus neer na het aanhalingsteken om aan te geven dat er een string achter komt. Vervolgens typ je string(variable_naam) en sluit je nog een extra haakje.

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

plaats=mc.playergetTilePos()

mc.postToChat(“X= “ +string(plaats.x))

mc.postToChat(“Z= “ +string (plaats.z))

mc.postToChat(“Y= “ +string(plaats.y))

 

De extra haakjes zijn heel belangrijk. Dit is omdat je script anders een error geeft. Probeer dat maar eens.

Nu drukken we op F5 en verschijnen de coordinaten in Minecraft chat. Je weet dus nu waar je poppetje zich bevindt op het moment dat die op de deurmat staat. Schrijf deze coordinaten op een papiertje. Open nu het bestand lesbrief_3_deurmat en typ de volgende code. Hierna krijg je er uitleg over. We gaan naast de standaard twee regels nu een derde standaardregel boven elk script zetten waarin we een tijd statement gebruiken. Dit zul je later zien in het script. Je moet de getallen voor pos.x, pox.z en pos.y vervangen door de getallen die je net hebt gemeten. (**Tom ga uit van de waardes die jou poppetje in de tutorial daadwerkelijk heeft**)

import mcpi.minecraft as minecraft

import time

 mc = minecraft.Minecraft.create()

a=1

while a==1:

time.sleep(1)

pos = mc.player.getTilePos()

if pos.x == 10 and pos.z == 12: and pos.y==13

mc.postToChat(“welcome home”)

Ga in minecraft van de deurmat af en loop daarna terug op de deurmat en blijf er even op staan. Als alles goed is staat er nu in de chat welcome home en wordt die telkens bij geplaatst.

Als we het script regel voor regel gaan bekijken zien we eerst dat er een nieuwe regel bij is gekomen: import time. Dit is omdat wie iets later een time statement gaan gebruiken. Wij zullen zeggen wanneer dit soort regels nodig zijn. Vervolgens wordt er een infinite loop gecreëerd, dus er zal permament worden gecheckt wat de coördinaten zijn. Direct onder while staat time.sleep(1). Dit is een statement die het script een bepaalde tijd (in sec) stillegt. Dit is om te voorkomen dat je script niet te vaak achter elkaar loopt. Daarna wordt de positie gemeten. Vervolgens is er een if-statement, maar deze is iets anders dan eerdere if-statements. Hier wordt namelijk and gebruikt. And is Engels voor en. Hierdoor kun je meerdere voorwaarden aan één statement binden. Vervolgens staat daaronder weer dat er moet worden gepost naar de minecraft chat. Dit wordt weer één tab verder ingesprongen. Dit is omdat het een onderdeel is van de if erboven en niet van de while. Sla je bestand op en als eindopdracht moet je een nieuwe mat ergens anders maken.

Er is nog een quiz en daarna ben je klaar voor lesbrief 4  waar we de eerste structuren gaan bouwen met Python.

 

In deze les heb je geleerd:

  • Wat een if-statement is.
  • Hoe je een if-statement gebruikt om een voorwaarde aan je scripts toe te voegen.
  • Wat een else-statement is en hoe je die gebruikt.
  • Wat een while-loop is.
  • Hoe je een while-loop gebruikt om een opdracht een bepaald aantal keren uit te voeren.
  • Hoe je een infinite loop maakt en hoe je die kunt gebruiken.
  • Hoe je in Minecraft een welkom thuis deurmat kunt maken.

Quiz wordt nog met de module toegevoegd. 

Categorieën: Python