Ehtolauseet
Edellisessä osassa teimme ohjelman, jossa pallon väri vaihtui näppäintä painamalla. Ohjelmaa ei kuitenkaan kiinnostanut ollenkaan mitä näppäintä painettiin. Jatketaan ohjelmointia nyt niin, että ympyrä vaihtaa väriä ainoastaan, kun painetaan näppäintä A.
Näppäinten painamista tarkistava ikkunatapahtuma on_key_press
näyttää tällä hetkellä koodissa suunnilleen tältä:
@ikkuna.event
def on_key_press(merkki, muuntaja):
ympyrä.color = 255, 0, 0
Suluissa olevat merkki
ja muuntaja
ovat ikkunatapahtuman parametrejä. Ne ovat ikkunatapahtuman omia muuttujia, jotka kertovat lisätietoa näppäimen painalluksesta. Muuttujaan merkki
on tallennettu, mitä näppäintä on painettu. Muuttujaan muuntaja
on tallennettu onko samaan aikaan painettu jotain muuntavaa näppäintä kuten Shift tai Ctrl.
Haluamme nyt muokata koodiamme niin, että ympyrän väriä muutetaan vain jos painettu näppäin, eli merkki
, on A.
Kun halutaan tarkistaa ovatko jotkin kaksi asiaa sama asia, pythonissa käytetään kahta yhtäsuuruusmerkkiä. Pygletissä taas näppäimistön merkki P on pyglet.window.key.A
. Siis voimme tarkistaa onko painettu näppäin P seuraavasti:
merkki == pyglet.window.key.A
if-komento
Pelkällä testaamisella emme kuitenkaan tee mitään. Tarvitsemme ehtolauseen. Haluamme sanoa ohjelmalle, että jos merkki == pyglet.window.key.A
, niin ympyrän väriksi vaihtuu punainen. Poista koodistasi ympyrä.color = 255, 0, 0
ja korvaa se seuraavalla ehtolauseella:
if merkki == pyglet.window.key.A:
ympyrä.color = 255, 0, 0
Huom! Muista sisennys rivillä
ympyrä.color = 255, 0, 0
, niin että se on ehtolauseen sisällä.
if
on englantia ja tarkoittaa jos. Sitä kutsutaan ehtolauseeksi, koska sille annetaan ehto, kuten merkki == pyglet.window.key.P
. Jos ehto on totta, niin if
:n sisällä olevat asiat toteutuvat. Jos ehto taas ei ole totta, esimerkiksi painettu näppäin on B eikä A, niin ehtolauseen sisällä olevat komennot eivät toteudu.
Nyt ympyrän pitäisi muuttua punaiseksi ainoastaan, jos painetaan näppäintä A.
else-komento
Entäpä jos haluaisimme, että ympyrä muuttuu punaiseksi kun painetaan nappia A, mutta muita nappeja painamalla se muuttuisikin siniseksi?
Tällaisen ohjelmoimiseksi tarvitsemme jotain if
-ehtolauseemme lisäksi. Tarvitsemme else
-lauseen. Else on englantia ja tarkoittaa kutakuinkin muussa tapauksessa.
Haluamme siis, että nappia painaessa jos painettu nappi on A, ympyrästä tulee punainen. Muussa tapauksessa ympyrästä tulee sininen.
Haluamamme ohjelman saisi siis ohjelmoitua lisäämällä ikkunatapahtumaan on_key_press
ehtolause muussa tapauksessa.
@ikkuna.event
def on_key_press(merkki, muuntaja):
if merkki == pyglet.window.key.P:
ympyrä.color = 255, 0, 0
else:
ympyrä.color = 0, 0, 255
Ohjelma tähän mennessä
Tähän mennessä koko ohjelma näyttää siis seuraavalta:
import pyglet
ikkuna = pyglet.window.Window(width = 800, height = 600)
ympyrä = pyglet.shapes.Circle(x = 400, y = 300, radius = 100)
@ikkuna.event
def on_draw():
ikkuna.clear()
ympyrä.draw()
@ikkuna.event
def on_key_press(merkki, muuntaja):
if merkki == pyglet.window.key.A:
ympyrä.color = 255, 0, 0
else:
ympyrä.color = 0, 0, 255
@ikkuna.event
def on_key_release(merkki, muuntaja):
ympyrä.color = 255, 255, 255
pyglet.app.run()
Koodi suomeksi
Ohjelmoidessa törmää koko ajan uusiin sanoihin ja termeihin ja ne on helpompi muistaa, jos tietää mitä ne oikeasti tarkoittavat. Tässä on tähän asti tekemämme ohjelma suomennettuna.
Tehtävät
Tarvitset tehtäviä varten ohjelman, jolla on ikkuna, jossa näkyy valkoinen ympyrä.
a) Lisää ikkunatapahtuma, joka tarkistaa painetaanko jotain nappia.
b) Ohjelmoin ympyrä vaihtamaan väriä punaiseksi, kun mitä tahansa nappia painetaan.
c) Lisää ohjelmaan ikkunatapahtuma, joka muuttaa ympyrän takaisin valkoiseksi, kun napin painaminen loppuu.
Jatka edellisen tehtävän ohjelmaa ja muokkaa ikkunatapahtumaan, joka käsittelee napinpainallukset.
a) Poista koodi joka muuttaa ympyrän punaiseksi.
b) Kirjoita ehtolause, joka tarkistaa, että painettu nappi on A.
c) Laita ympyrä muuttamaan väriä punaiseksi jos painettu nappi on A.
Jatka edellisen tehtävän ohjelmaa.
Muokkaa koodia niin, että ympyrä vaihtaa väriä mitä tahansa nappia painamalla, mutta väriksi tulee punainen jos painetaan nappia A, ja sininen jos painetaan jotain muuta nappia.
Jatka edellisen tehtävän ohjelmaa.
a) Muokkaa koodia pyglet.window.key.A
muotoon pyglet.window.key.R
. Keksitkö mitä muutos sai aikaiseksi?
b) Muokkaa koodia niin, että ympyrä muuttuu punaiseksi painamalla nappia P.
- (Haastavampi tehtävä)
Entä jos haluaisimme, että ympyrä on punainen, kun painamme nappia P, vihreä kun painamme nappia V ja sininen kun painetaan jotain muuta nappia?
Kun haluamme antaa useita tarkkoja vaihtoehtoa ohjelmalle, tarvitsemme ehtolausetta elif
. Se on lyhenne englannin sanoista else if ja tarkoittaa suomeksi tai jos. Toisin sanoen haluamme ohjelmoida, että nappia painaessa:
- jos nappi on P, muutetaan väriksi punainen
- tai jos nappi on V, muutetaan väriksi vihreä
- muussa tapauksessa muutetaan väriksi sininen.
Haluamamme ohjelman saisi siis toteutettua muuttamalla ikkunatapahtumaa on_key_press
seuraavanlaiseksi:
@ikkuna.event
def on_key_press(merkki, muuntaja):
if merkki == pyglet.window.key.P:
ympyrä.color = 255, 0, 0
elif merkki == pyglet.window.key.V:
ympyrä.color = 0, 255, 0
else:
ympyrä.color = 0, 0, 255
Tietokone käy järjestyksessä läpi sille annettuja ehtolauseita kunnes törmää sellaiseen ehtoon mikä on totta, jolloin ehtolauseen sisältö toteutuu. Jos mikään ehto ei ole totta, toteutetaan ehtolauseen muussa tapauksessa sisällä oleva koodi.
Jatka edellisen tehtävän ohjelmaa
a) Muokkaa ohjelmaasi niin, että painaessa nappia P, ympyrä muuttuu punaiseksi, mutta mistä tahansa muusta napista ympyrä muuttuukin siniseksi.
b) Muokkaa ohjelmaasi niin, että ympyrä muuttuu nappia V painaessa vihreäksi.
c) Muokkaa ohjelmaani niin, että jos painetaan nappia K, ympyrä muuttuu keltaiseksi. Ympyrä muuttuu keltaiseksi koodilla ympyrä.color = 255, 255, 0