Arcade-pelien ohjelmointi
Pythonilla ja PygamellaChapter 3: Arvauspelit ja If-lauseet
Miten pelissä saadaan listattua pelaajan uusi huippupistesaldo ensimmäiseksi? Kuinka kerrotaan, jos 'elämät' ovat loppumaisillaan? Miten ilmaistaan se, että onko pelaajalla sopiva avain lukon avaamiseen?
Tällaisten asioiden toteuttamiseen tarvitsemme if lauseen. if lausetta kutsutaan myös ehtolauseeksi. if lauseella voidaan testata ehto ja päättää, mitä ohjelmassa tehdään seuraavaksi. Esimerkiksi, onko avaruusalus liikkunut näytön reunaan? Onko tililtä nostettava summa liian suuri? Ohjelmassa voidaan testata tällaisia tilanteita if lauseella.
3.1 Perustapauksia
Katsotaan muutamaa if lauseen perusesimerkkiä. Ensimmäisessä osassa esitellään kaksi muuttujaa (a ja b) if lauseessa käytettäväksi. Kahdessa if lauseessa a ja b muuttujia vertaillaan keskenään. Sen mukaan, kummanko lauseen vertailutulos on tosi, suoritetaan tulostuslause. Klikkaa “Step” painiketta niin huomaat, kuinka koodi suoritetaan koneessa.
# If-lauseessa käytettävät muuttujat a = 4 b = 5 # perusvertailu if a < b: print("a on pienempi kuin b") if a > b: print("a on suurempi kuin b") print("Suoritus päättyi") |
Muuttujat:
a=4 b=5 Tulos:
a on vähemmän kuin b Suoritus päättyi |
Kun a on pienempi kuin b, niin suoritetaan ensimmäinen tulostuslause. Jos muuttujat a ja b olisivat yhtäsuuria; esim. 4; niin kumpikin if lauseen vertailu tuottaisi epätoden eikä kumpaakaan tulostuslausetta suoritettaisi.
Ohessa on vuokaavioesitys, joka havainnollistaa ohjelman toimintaa. Vuokaaviosta voi nähdä ohjelman (algoritmin) toiminnan, vaikka ei itse ohjelmakoodista ymmärtäisikään mitään. Ymmärrätkö oheista vuokaaviokuvaa 3.1.
Tässä yhteydessä ei vuokaavioihin syvennytä tarkemmin, mutta pidemmälle ohjelmointia opiskeltaessa
myös vuokaavioita on hyvä osata ja ymmärtää.
Lue tästä lisää:
http://en.wikipedia.org/wiki/Flowchart
Edellä oleva esimerkki vertailee muuttujista vain sen, että onko toinen suurempi tai pienempi kuin toinen. Jos muuttujien arvot ovat yhtäsuuret, niin kumpaakaan if-lauseen haaraa ei suoriteta. Seuraavassa esimerkissä tarkistetaan suurempi tai yhtäsuuri arvo:
if a <= b: print("a on pienempi tai yhtäsuuri kuin b") if a >= b: print("a on suurempi tai yhtäsuuri kuin b")
Symbolit <= ja >= pitää kirjoittaa tähän järjestykseen eikä niiden välissä saa olla välilyöntejä. Esimerkiksi:, =< ei toimi, eikä myöskään < =.
Myöskään yhdistelmämerkkinä ≤ vertailusymboli ei toimi, esimerkiksi:
if a ≤ b:
≤ symboli ei ole Pythonissa sallittu. Tosin tuo symboli on hankalasti näppäiltävissä, koska merkki ei löydy suoraan näppäimistöltä. (Jos olet riittävän utelias tietämään, miten tuo yhdistelmämerkki saadaan, niin näppäile numeronäppäimistöltä Alt-näppäin pohjassa 243.) Siis vielä selvyyden vuoksi: vertailuoperaattori kirjoitetaan <= eikä ≤.
Yhtäsuuruus tutkitaan == operaattorilla (siis kaksi yhtäsuuri kuin -merkkiä peräkkäin ilman välilyöntejä) ja erisuuri kuin operaattori on !=. Tässä vielä näistä koodiesimerkki.
# Yhtäsuuri kuin if a == b: print("a on yhtäsuuri kuin b") # Erisuuri kuin if a != b: print("a ja b ovat erisuuret")
Yhtäsuuri kuin ja asetuslauseen sijoitusoperaattori (== ja =) menevät helposti sekaisin. == on yhtäsuuruusvertailu, ja = on asetuslauseen sijoitusoperaattori.
Alla kaksi yleistä virhettä, jolloin nämä = ja ==operaattorit menevät helposti sekaisin:
# Tämä on väärin a == 1 # Ja niin on tämäkin if a = 1: print("A on yksi")
älä jatka vielä! Varmista tässä, että ymmärrät takuulla yllä olevan koodiesimerkin. Varmista symbolien = ja == käyttö niin, ettei sinun jatkossa tarvitse arvailla niiden käyttöä.
3.2 Sisennys
Kaikki if lauseessa, sen alle kirjoitettavat lauseet, tulee sisentää. If-lauseen ehdon ollessa tosi, suoritetaan kaikki sisennetyt lauseet:
if a == 1: print("Jos a on yksi, niin tämä rivi tulostetaan.") print("Myös tämä.") print("Ja tämä.") print("Tämä rivi tulostuu aina, koska sitä ei ole sisennetty.")
Sisennyksen pitää olla jokaisella sisennetyllä rivillä samanlainen. Seuraava koodi ei toimi:
if a == 1: print("Tässä on oikea sisennys.") print("Tässä liian suuri sisennys ja tästä generoidaan virhe.") print("Tietokone haluaas, että osaat päättää.")
Kun if lause lopetetaan (siis lopetetaan sisennys, niin if-lausetta ei voida jatkaa uudelleen pelkällä sisennyksellä. Kohdistin on siirrettävä viimeisen if-lohkossa olevan lauseen perään ja tästä jatketaan näppäilemällä enter niin saat uuden rivin if-lohkoon.
if a == 1: print("Jos a on yksi, tämä tulostetaan.") print("Tämäkin tulostuu.") print("Tämä tulostuu aina, koska ei ole sisennetty.") print("Tästä tulee virheilmoitus, koska se on sisennetty if lauseen ulkopuolella.)
3.3 And/Or ehtolauseessa
if lauseen ehtoja voidaan ketjuttaa and ja or varatuilla sanoilla. Näitä voidaan pitää operaattoreina samoin kuin + or - merkkejä.
# And eli ja if a < b and a < c: print("a on vähemmän kuin b ja c") # tavallinen or eli tai if a < b or a < c: print("a on vähemmän kuin b tai c (tai molemmat)")
Yleinen virhe and ja or vertailuissa on jättää muuttuja pois vertailusta, jolloin vertailua ei kohdisteta muuttujaan. Esim. alla olevassa esimerkissä kone ei tiedä, mihin muuttujan c vertailu kohdistetaan, koska siitä puuttuu muuttuja a.
# Tämä ei ole oikein if a < b or < c: print("a on vähemmän kuin b ja c")
3.4 Boolean tyyppiset muuttujat
Python osaa käsitellä Boolean tyyppisiä muuttujia. Mutta, mitä boolean tyyppiset muuttujat ovat? Boolean tyyppinen muuttuja voi voi saada arvokseen joko True tai False (tosi/epätosi, 1/0). Boolean algebra oli George Boolen vuonna 1854 kehittämä malli. Tuskin hän osasi arvatakaan, kuinka tärkeäksi hänen työnsä tulikaan modernin tietokonetekniikan parissa!
if lauseessa pitää olla lauseke, josta saadaan tuloksena joko True tai False. Lausekkeen tulos voidaan saada yhdellä Boolean tyyppisellä muuttujalla, jolloin vertailulauseke näyttää hieman puutteelliselta, mutta toimii kuitenkin. Kunhan muuttujan arvo on joko True tai False, niin toimii hyvin.
# Boolean data tyyppi. Tämä on toiva ratkaisu, jopa suositeltava! a = True if a: print("a on tosi")
Boolean tyyppisen lausekkeen voi kääntää vastakkaiseksi not operaattorilla. Seuraavassa esimerkissä not kääntää a muuttujan arvosta true arvoon false (tai päinvastoin).
# not operaattori if not(a): print("a :n arvo on false")
Koska not on operaattori eikä funktio, niin sulkeita ei tässä tarvita.Voit siis kirjottaa näin:
# not esim. 2 if not a: print("a :n arvo on false")
Voit käyttää Boolean tyyppisiä muuttujia and ja or operaattoreiden kanssa.
a = True b = True if a and b: print("a ja b ovat molemmat true")
Muuttujaan voidaan asettaa Boolean tyyppinen arvo vertailulausekkeen tuloksen perusteella. Esim. alla muuttujia a ja b vertaillaan. Jos ne ovat yhtäsuuret, niin c saa arvon True, muutoin c saa arvon False.
a = 3 b = 3 # Seuraava lause näyttää oudolta, mutta on kelvollinen. # c on joko true tai false, riippuen siitä # onko a ja b yhtäsuuret. c = a == b # tulostetaan c:n arvo, tässä True print(c)
On mahdollista kirjoittaa if lauseita, joissa vertailuehdoissa käsitellään muita kuin true tai false arvoja. Tämä on epätavallista, mutta on tärkeä ymmärtää, miten kone käsittelee näitä arvoja, varsinkin etsittäessä ohjelmasta mahdollisia virheitä. Alla oleva lause on täysin kelvollinen ja tulostaa, jos if lauseen ehto ei ole nolla:
if 1: print("1") if "A": print("A")
Taasen seuraava koodi ei tulosta mitään, koska if lauseen ehto on nolla ja se tulkitaan boolean arvoksi False. Kaikki nollasta poikkeavat luvut tulkitaan boolean arvoksi true.
if 0: print("Zero")
Alla koodissa, ensimmäinen if lause näyttää toimivalta. Ongelma on siinä, että tuloksena on aina true muuttuja a ei olisikaan yhtä suuri kuin b. Tämä johtuu siitä, että b itsessään tulkitaan aina arvoksi true.
a = "c" if a == "B" or "b": print("a on yhtäsuuri kuin b. Mahdollisesti.") # Tämä on parempi esimerkki if lauseesta. if a == "B" or a == "b": print("a on yhtä suuri kuin (merkkijono) b.")
3.5 Else and Else If
Alla koodiesimerkissä kysytään lämpötila ja ilmoitetaan, jos on lämmin sää.
temperature = int(input("Anna lämpötila Celsiusasteina? ")) if temperature > 22: print("Huh hellettä") print("Tehty")
Seuraavassa esimerkissä suoritetaan koodia myös silloin, kun ei ole hellettä, eli käytämme else lausetta (haaraa). Huomaa, kuinka else on sisennetty samalle tasalle if lauseen kanssa ja else lauseessa on kaksoispiste samalla tavalla kuin if lauseessakin.
if...else lauseesta suoritetaan aina joka tapauksessa jompi kumpi haara. Ensimmäinen if haara suoritetaan, jos ehto on tosi eli True, toinen haara (eli else haara) suoritetaan, jos ehto on False.
temperature = int(input("Syötä lämpötila Celsius-asteina? ")) if temperature > 22: print("Huh hellettä") else: print("Eipä ole kovin lämmin") print("Tehty")
Useita if lauseita voidaan ketjuttaa käyttämällä else...if lauseita. Pythonissa tämä on lyhennetty muotoon elif.
temperature = int(input("Syötä lämpötila Celsius-asteina? ")) if temperature > 22: print("Huh hellettä") elif temperature < 10: print("Aika viileä ilma") else: print("Eipä ole ainakaan kuuma") print("Tehty")
Alla oleva ohjelmakoodi tulostaa aina “Huh hellettä” vaikka käyttäjä syöttäisi 60 astetta. Miksi näin? Miten algoritmia pitäisi korjata?
Katso oheinen video, jos ongelma ei ratkea.
temperature = int(input("Syötä lämpötila Celsius-asteina? ")) if temperature > 22: print("Huh hellettä") elif temperature > 50: print("Ohhoh, nyt voi paistaa vaikkapa kananmunaa auringossa!") elif temperature < 10: print("Onpas viileä ilma") else: print("Pitelee kelpo kelejä") print("Done")
3.6 Tekstien vertaaminen
if lauseella voi vertailla myös tekstityyppistä dataa (muuttujia).
user_name = input("Mikä sinun nimesi on? ") if user_name == "Paul": print("Onpa sinulla kiva nimi.") else: print("Nimesi on ok.")
Edellisessä esimerkissä if-lauseen ehto toimii vain, jos syöttää “Paul”. Se ei toimi, jos syöttää esim. “paul” tai “PAUL”.
Usein tehdään se virhe, että lainausmerkit unohtuvat merkkijonon ympäriltä. Kone tulkitsee Paul sanan muuttujaksi, johon kuuluisi tallentaa jokin arvo. Tästä generoituukin sitten virhe, koska Paul ei sisällä mitään arvoa.
user_name = input("Mikä on nimesi? ") if user_name == Paul: # Tämä on väärin, lainausmerkit puuttuvat print("Onpa sinulla hieno nimi.") else: print("Nimesi on ok.")
3.6.1 Useamman tekstivaihtoehdon vertaaminen
Jos haluat verrata muuttujaa useampaan tekstivaihtoehtoon, niin muista, että vertailulausekkeen pitää sisältää jokin muuttuja. Esimerkiksi:
# Tämähän ei toimi! Ehtolauseke on aina tosi if user_name == "Paul" or "Mary":
Koodissa pitäisi olla:
# Tämä toimii if user_name == "Paul" or user_name == "Mary":
Muistathan, että kaikki muut paitsi nolla tulkitaan Boolean arvoksi True. Eli koneelle sana "Mary" on samalla tapaa True ja siksi kelpaa suorittamaan if lauseen. Merkkijonojen vertailussa tulee käyttää funktioita ja niihin palaamme myöhemmin.
3.6.2 Merkkikoosta riippumaton vertailu
Jos haluat koodata ohjelman, jossa suoritus ei riipu siitä, onko syötetty pieniä vai isoja kirjaimia, niin helpointa on muuttaa kaikki merkit pieniksi aakkosiksi. Tämä muunnos voidaan tehdä merkkijonofunktiolla lower.
Alla oleva esimerkkikoodi muuntaa käyttäjän syötteen pieniksi kirjaimiksi. Sen jälkeen suoritetaan merkkijonojen vertailu. Huomaa: Vertailumerkkijonossa ei saa olla yhtään isoa kirjainta, koska silloin vertailussa ei saada milloinkaan tosi arvoa eikä if-haaraa suoriteta.
user_name = input("Mikä on nimesi? ") if user_name.lower() == "paul": print("Onpas sinulla kiva nimi.") else: print("Nimesi on ok.")
3.7 if lausesta esimerkki
Seuraavassa koodiesimerkissä käydään läpi kaikkea edellä ollutta asiaa. Oheisessa on-line videossa on selitettynä koodi rivi riviltä.
Videossa on käytetty editorina (IDE) Eclipsea. Eclipse ei oletusversiona toimi Pythonissa, mutta PyDev versio toimii.
The PyDev editori on ladattavissa vapaasti täältä:
http://pydev.org/
Editori on monimutkainen, mutta se on erittäin ilmaisuvoimainen käytössä. Jotkut ohjelmoijat pitävät PyDev-editoriversiosta, koska siihen on saatavissa hyödyllisiä plug-ins laajennuksia.
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Explanation video: http://youtu.be/pDpNSck2aXQ # Variables used in the example if statements a = 4 b = 5 c = 6 # Basic comparisons if a < b: print("a is less than b") if a > b: print("a is greater than than b") if a <= b: print("a is less than or equal to b") if a >= b: print("a is greater than or equal to b") # NOTE: It is very easy to mix when to use == and =. # Use == if you are asking if they are equal, use = # if you are assigning a value. if a == b: print("a is equal to b") # Not equal if a != b: print("a and b are not equal") # And if a < b and a < c: print("a is less than b and c") # Non-exclusive or if a < b or a < c: print("a is less than either b or c (or both)") # Boolean data type. This is legal! a = True if a: print("a is true") if not a: print("a is false") a = True b = False if a and b: print("a and b are both true") a = 3 b = 3 c = a == b print(c) # These are also legal and will trigger as being true because # the values are not zero: if 1: print("1") if "A": print("A") # This will not trigger as true because it is zero. if 0: print("Zero") # Comparing variables to multiple values. # The first if statement appears to work, but it will always # trigger as true even if the variable a is not equal to b. # This is because "b" by itself is considered true. a = "c" if a == "B" or "b": print("a is equal to b. Maybe.") # This is the proper way to do the if statement. if a == "B" or a == "b": print("a is equal to b.") # Example 1: If statement temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") print("Done") # Example 2: Else statement temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") else: print("It is not hot outside") print("Done") # Example 3: Else if statement temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") elif temperature < 30: print("It is cold outside") else: print("It is not hot outside") print("Done") # Example 4: Ordering of statements # Something with this is wrong. What? temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") elif temperature > 110: print("Oh man, you could fry eggs on the pavement!") elif temperature < 30: print("It is cold outside") else: print("It is ok outside") print("Done") # Comparisons using string/text # Note, this example does not work when running under Eclipse # because the input will contain an extra carriage return at the # end. It works fine under IDLE. userName = input("What is your name? ") if userName == "Paul": print("You have a nice name.") else: print("Your name is ok.")
3.8 Review
3.8.1 Multiple Choice Quiz
Klikkaa tästä monivalintatehtävään.
3.8.2 Short Answer Worksheet
Klikkaa tästä kappaleen kertaustehtäviin.
3.8.3 Lab
Klikkaa tästä ohjelmointitehtäviin.
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin