Introductie

Ja je hebt het goed gelezen, gebannt of niet. Wij nemen het risico en geven jullie een manier om je eigen flappy bird in elkaar te knutselen. Dit microbit project wordt gemaakt met python, voor het javascript-block editor project kun je de andere posts bekijken.

 

Benodigdheden

  • Microbit
  • https://create.withcode.uk/python/pZ –> Op deze website kun je de python code maken, als je op Cntrl + enter drukt kan je de code ook simuleren (dat kan niet op de originele website).
  • Wel of geen python kennis –> Als je al python kunt dan is dat helemaal geweldig, maar geloof het of niet dit spel is gemaakt door iemand met 0,0 python kennis.

 

Uitleg

Stap 1: Breng je game in gereedheid

Voorat we kunnen beginnen met programmeren moeten we eerst een aantal dingen toevoegen. Het eerste dat je toevoegt is “from microbit import *”. Wat dit doet is dat het de library (waar alle voorgeprogrameerde items staan) kan bereiken.

Hieronder voeg je nog een zin toe: “import random”, deze import zorgt ervoor dat je random getallen kan gebruiken. Deze hebben we echter later pas nodig.

Stap 2: the birds and the bees

Okay, nu alles in gereedheid is gebracht kunnen we de eerste stappen zetten. Allereerst willen we aan de speler doorgeven dat het spel begint. Als je text wil laten zien op de microbit dan gebruik je het volgende zinnetje: “display.scroll(“tekst”).

 

Onder import random zetten we dus de volgende zin: display.scroll(“Get Ready…”). Als je de microbit nu zou opstarten dan zou deze tekst door je beeld gaan van rechts naar links.

Allereerst gaan we even een paar constanten maken. Deze hebben we nodig voor de game. De algemene regel voor constanten is dat we die altijd in CAPSLOCK schrijven. Als je dit niet doet is het niet per se fout, maar het is gewoon een algeme programeerregel.

Onder de display.scroll schrijven we de volgende constanten:

# Game constants (–> dit is een comment, dit komt niet terug in je echte spel)
DELAY = 20
FRAMES_PER_WALL_SHIFT = 20
FRAMES_PER_NEW_WALL = 100
FRAMES_PER_SCORE = 50

Na de constanten moeten we ook nog wat variabelen aanmaken. Variabelen zijn dingen die kunnen veranderen, de variabelen die we nu nodig hebben is de beginhoogte van flappy bird (“y”). De snelheid waarmee de bird valt (“speed”), de score (“score”) en de positie van de pijpen (“frame”).

Om een variabele aan te maken in python typ je gewoon “naam variabele” = beginwaarde

maak nu de variabelen aan:

# Global Variables
y = 50
speed = 0
score = 0
frame = 0

Stap 3: Plaatsen van de pijpen

Geen flappy bird zonder obstakel natuurlijk. Kort samengevat blijft de vogel op zijn plek, deze kan alleen omhoog en omlaag terwijl de pijpen elke stap een plek naar links gaan. De pijpen branden minder fel dan de vogel, zo kun je ze onderscheiden. Doormiddel van een random getal maken we iedere keer een gat van 2 Led lampjes in de muur waar de vogel doorheen moet kunnen manouvreren. (hiervoor hebben we dus die import random nodig).

We gaan nu eerst een functie maken (een stukje code dat we kunnen uitvoeren wanneer we dat willen).

Je creert een functie door de volgende regel ‘def  “naamfunctie”():’. Onze functie heet ‘make_pipe()’

Binnenin de functie komt het maken van de pijp. Eerst zorgen we dat de hele laatste rij van de Microbit oplicht met brightness 3. Je kunt een image maken door de functie: Image(“xxxxx:xxxxx:xxxxx:xxxxx:xxxxx”). Voor elke x kun je een waarde van 1 tot 9 invullen en zo gaan op elke rij de lampjes branden waar jij een getal invult (op volgorder van boven naar onder).

We willen de laatste rij oplichten dus dat doen we zo: i = Image(“00003:00003:00003:00003:00003”)

vervolgens gaan we een gat maken. Dit doen we doormiddel van een random getal te pakken tussen de 0 en de 3 en daarna dat getal plus 1 te doen, van die twee getallen zetten we de brightness uit en dan hebben we dus een gat.

Dit ziet er als volgt uit:

gap = random.randint(0,3) # random wall position
i.set_pixel(4, gap, 0) # blast a hole in the pipe
i.set_pixel(4, gap+1, 0)
return i

Nu moeten we nog even zorgen dat de pijp ook in beeld komt… dit doen we zo:

i = make_pipe()

Zo gaat het goed! We zijn nu ongeveer halverwege!

 

Stap 4: Game loop

Nu gaan we de ‘Game loop’ maken. Hier gebeurt de echte magie! Als je een loop wilt maken in Python doe je dat in een while …:

In dit geval doen we dat in een while True: (loop)

allereerst gaan we de pijpen laten zien door het zinnetje: ‘display.show(i)’

daarna zorgen we dat de pijpen ééntje opschuiven, als je het je nog kan herrinneren hadden we daar de variabele frame voor –> frame += 1

Nu gaan we eindelijk het vogeltje laten flapperen, zoals je weet is de beginpositie nog steeds y = 50, iedere keer als we op de a knop gaan drukken dan moet de vogel iets omhoog gaan. In ons geval is 0 bovenaan het scherm en 99 onderaan het scherm. Dus om naar boven te gaan moeten we min een getal doen. Om te kijken of knop a is ingedrukt gebruiken we de volgende functie: ‘button_a.was_pressed()’

# Making the bird flap if button a is pressed
if button_a.was_pressed():
speed = -8

Een hoofdregel bij python is dat je goed moet kijken naar je spaties. Na de dubbele punt komt de volgende regel iets naar binnen, dit doe je doormiddel van de [tab] knop.

Als je de B-knop indrukt, dan moet de score te zien zijn. Hiervoor gebruiken we dezelfde controle-functie (maar dan met b ipv a). Dit ziet er zo uit:

# Showing the score when button b is pressed
if button_b.was_pressed():
display.scroll(“Score: ” + str(score))

Als je niet aan het flapperen bent, moet de vogel natuurlijk naar beneden vallen. Dit noemen we ook wel zwaartekracht. Echter wordt de zwaartekracht steeds meer, dus dat moet ook in onze game.

speed += 1
if speed > 2:
speed = 2

Elke loop valt de vogel één positie naar beneden, dit loopt op tot 2 per loop. Zo valt de vogel steeds sneller naar beneden.

Er zijn toch nog twee problemen. De vogel kan nu nog uit de kamer (boven de 99 en onder de 0) en dat geeft een error. Daarom moeten we dat voorkomen door de volgende regels:

#define the position of the bird
y += speed
if y > 99:
y = 99
if y < 0:
y = 0

Maar het gekke is, er maar 5 lampjes, geen 100. Ja dat klopt, daarom om de positie van de vogel te bepalen moeten we de y-coordinaat delen door 20:

#draw the bird
led_y = int(y / 20) –> we maken dus een nieuwe variabele aan die de positie van de vogel weergeeft.
display.set_pixel(1, led_y, 9)

Stap 5: collision

Nu de vogel in gereedheid is gebracht, moeten we nog een paar controles uitvoeren. Eerst moeten we kijken of de vogel niet in de muur is gecrashed. Dit kunnen we doen door te kijken naar de van de lamp. Kijk, wanneer de vogel op de plek van het gat is (en dus erdoorheen gaat), dan is de brightness op die positie dus 0. Als de brightness niet nul is dan weet je dus dat de vogel in de muur zit. Je kan de brightness van een plek opvragen door de volgende functie: ‘microbit.display.get_pixel(x, y) = 0 t/m 9’. We gaan hier een paar dingen aanpassen. Allereerst vervangen we microbit.display door i, aangezien i onze muur voorstelt. De plek waar we moeten controleren is in dit geval x = 1 en y = positie van de vogel oftewel led_y. Onze functie wordt dus zo:

# check for collision
if i.get_pixel(1, led_y) != 0:
display.show(Image.SAD)
sleep(500)
display.scroll(“Score: ” + str(score))
break

Het uitroepteken betekent “niet”, wanneer de brightness van de muur niet nul is zijn we af. Dan laten we een verdrietig gezichtje zien en  wachten we een halve seconden, daarna laten we nog eens de score zien en doormiddel van ‘break’ stoppen we het spel. Voeg het laatste stukje code hieronder toe en dan zijn we klaar!! Nu kun je het spel ook daadwerkelijk spelen!

# create new wall
if(frame % FRAMES_PER_NEW_WALL == 0):
i = make_pipe()

# increase score
if(frame % FRAMES_PER_SCORE == 0):
score += 1
music.pitch(500, 100)

#wait 20ms
sleep(20)

 

Gefeliciteerd

 

Stap 6: Verdieping

Wat is het enige dat nu eigenlijk nog ontbreekt in ons spel. Ja! Geluidjes! Deze kunnen we heel makkelijk toevoegen maar dit hoort niet bij de oorspronkelijke handleiding. Dit is hoe het moet:

Muziek is weer een aparte library op python. Hiervoor moeten we dus weer iets importeren. Net onder import random voeg je het volgende toe:

import music

Oké nu kunnen we van alles toevoegen. Er zijn al bestaande deuntjes, zoals DADADADUM en NYAN, maar je kan ook je eigen noten maken. Als je een bestaand deuntje wilt invoegen dan typ je het volgende:

music.play(“muziek”) –> op deze website https://microbit-micropython.readthedocs.io/en/latest/tutorials/music.html vind je de bestaande deuntjes.

Wij gaan echter zelf één nootje maken. Om dit te doen hebben we een andere functie nodig namelijk:

‘music.pitch(toonhoogte, duur)’. De toonhoogte bepaalt dus de hoogte van de noot en de duur, dus hoe lang de noot moet duren (in milliseconden).

Als je ergens doorheen gaat moet er een hoge noot klinken, we gebruiken hier frequency van 500 en een duur van 50 ms, en als je er niet doorheen komt dan willen we een lage toon. Frequency van 200 en duur van 50 ms. Het laatste stuk van je code ziet er als het goed is dan zo uit, de vet gedrukte dingen zijn toegevoegd.

# check for collision
if i.get_pixel(1, led_y) != 0:
display.show(Image.SAD)
music.pitch(200, 100)
sleep(500)
display.scroll(“Score: ” + str(score))
break

# move wall left
if(frame % FRAMES_PER_WALL_SHIFT == 0):
i = i.shift_left(1)

# create new wall
if(frame % FRAMES_PER_NEW_WALL == 0):
i = make_pipe()

# increase score
if(frame % FRAMES_PER_SCORE == 0):
score += 1
music.pitch(500, 100)

#wait 20ms
sleep(20)

 

Categorieën: Microbit

1 reactie

pddring · 15 juli 2017 op 21:35

I like the music feature you added to the original tutorial. Great to see someone using the microbit simulator

Gesloten voor reacties.