Arcade-pelien ohjelmointi
Pythonilla ja PygamellaChapter 1: Luodaan erikoislaskin
(Hei! Jos et ole vielä asentanut koneeseesi Python ja Pygame ohjelmia, niin palaa takaisin edelliseen kappaleeseen ja lataa ja asenna ne. Sitten voit jatkaa tästä kappaleesta.)
1.1 Johdanto
Pääset helposti alkuun Pythonilla ohjelmoimalla ensimmäiseksi yksinkertaisen laskimen. Niin todellakin. Vaikka laskinohjelma ei olekaan peli, niin mitä hyötyä laskimen ohjelmoimisesta on peliohjelmoinnissa?
Tarvitset pelissä monenlaista laskentaa, objektien liike, ammusten lentorata, pisteiden laskenta ym. pitää pelissä laskea. Ja lisäksi, todellinen 'giikki' ohjelmoi laskimen huvikseen eikä kiduttaakseen itseään. Aloittaakaamme peliohjelmointi siis tekemällä laskin, jota käytetään tekstipohjaisesti näppäimistöllä. Graafisten elementtien ohjelmointiin tutustumme sitten kappaleessa 5.
Yksinkertainen laskinohjelma kysyy käyttäjältä tietoja ja laskee sitten jotain (vähemmän kiinnostavia) asioita kuten asuntolainan korkoja tai enemmän kiinnostavia kuten ilmassa lentävien mutapallojen lentoratoja.
Kuvassa 1.1 on esimerkki ohjelmasta joka laskee liikkeessä olevan kappaleen energian (kineettisen energian). Tämä voisi olla vaikkapa osana pelin fysiikkamoottoria.
Ohjelmoinnissa voidaan monimutkainen laskenta piilottaa käyttäjältä. Käyttäjän tarvitsee vain syöttää ohjelman tarvitsemat tiedot ja tuloksena tarjotaan helposti ymmärrettävä ja tulkittava vastaus. Samankaltainen laskin olisi mahdollista toteuttaa käytettäväksi vaikkapa älypuhelimeen, jolloin sitä voisi käyttää milloin ja missä tahansa.
1.2 Tulostus
1.2.1 Tekstin tulostus
Miten ohjelma tulostaa jotakin näytölle? Tarvittava ohjelmakoodi on varsin yksinkertainen, vain yksi rivi vaaditaan:
print("Hello World.")
Tämä ohjelma tulostaa “Hello World” näytölle. Kokeilepa syöttää rivi IDLE-editorin kehotteeseen ja katso miten se toimii. Kokeile tulostaa muitakin lauseita. Kone tulostaa haluamasi tekstit, eikö vain?
Miltä mahtaa “Hello World” ohjelma näyttää ohjelmoituna jollakin muulla kielellä?
Tämän voit tarkistaa Wikipediasta, jossa on esitettynä mukava joukko erilaisia “Hello World” toteutuksia eri kielillä:
http://en.wikipedia.org/wiki/Hello_world_program_examples
Mielenkiintoista on nähdä, miten monia eri ohjelmointikieliä on olemassa ja tässä on helppoa verrata eri kielten monimutkaisuutta.
Nyt siis muistat, että tulostus komento Pythonissa on yksinkertaisesti: print. print komennon jälkeen tulee kaarisulkeet ( ). Sulkeiden sisään lainausmerkkien väliin tulee tulostettava teksti. Sulkeita käytetään tyypillisesti funktion parametrin välittämiseen niin matematiikassa kuin ohjelmoinnissakin.
Matematiikassa (sinulle saattaa olla tuttu) esimerkiksi lauseke $sin(\theta)=cos(\frac{\pi}{2}-\theta)$, jossa $sin$ ja $cos$ ovat trigonometrisia funktioita. Parametri välitetään funktioille sulkeiden sisällä ja funktio palauttaa vastaavan arvon. Erona meidän esimerkissämme on se, että sulkeiden sisällä oleva parametri on tekstimuotoista.
Huomaa, että tulostettavan tekstin alussa ja lopussa on lainausmerkit. Jos print-lauseessa on lainausmerkit tekstin ympärillä, tietokone tulostaa sen kuten se on kirjoitettu. Esimerkiksi seuraava ohjelma tulostaa 2+3:
print("2 + 3")
1.2.2 Lausekkeen arvon tulostaminen
Seuraavassa esimerkissä ei ole lainausmerkkiä tulostettavan parametrin $2+3$ ympärillä, ja tietokone suorittaa ensin matemaattisen lausekkeen. Tulostuksena saadaan lausekkeen arvo, eli luku 5 eikä 2+3.
print(2 + 3)
Alla oleva koodi generoi virheen, koska tietokone yrittää laskea merkkijonoa “Hello World” kuin se olisi matemaattinen lauseke, ja sehän ei toimi. alkuunkaan:
print(Hello World)
Ohjelman generoima syntaksivirhe SyntaxError: invalid syntax tarkoittaa, että tulkki ei ymmärrä mitä “Hello” ja “World” tarkoittavat.
Tärkeä: Muista erotella yksinkertainen lainausmerkki ' ja kaksoislainausmerkki " Niitä ei saa sekoittaa/käyttää samassa tulostuslauseessa. Eli käytä joko yksinkertaisia lainausmerkkejä tai kaksoislainausmerkkejä.
1.2.3 Monipuolisempi tulostaminen
print-lauseella voidaan tulostaa useita erityyppisiä parametreja samalla kertaa. Kaikki tulostettavat parametrit erotellaan pilkulla. Esimerkiksi seuraava lause tulostaa Your new score is 1040
print("Your new score is", 1030 + 10)
Seuraava koodirivi tulostaa Your new score is 1030+10. Lukuja 1030 ja 10 ei lasketa yhteen, koska ne ovat lainausmerkkien sisällä. Tietokone käsittelee niitä merkkijonoina.Kaikkea muuta tietokone käsittelee matemaattisina lausekkeina tai tietokoneen käskykoodina.
print("Your new score is", "1030 + 10")
Seuraava koodi ei toimi ollenkaan, koska merkkijonoparametrin ja matemaattisen lausekkeen 1030+10 välissä ei ole pilkkua ollenkaan. Pilkun pitää olla lainausmerkkien ulkopuolella parametrien välissä. Jos pilkku halutaan tulostukseen mukaan, niin se on kirjoitettava lainausmerkkien sisään:
print("Your new score is," 1030 + 10)
Seuraava koodiesimerkki on toimiva. Siinä pilkku erottaa parametrit. Tulostus on:
Your new score is, 1040
Huomaa, että vain yksi pilkku tulostuu. Ensimmäinen pilkku lainausmerkkien sisällä tulostetaan ja toinen pilkku erottaa parametrit.
print("Your new score is,", 1030 + 10)
1.3 Escape koodit
Jos lainausmerkkipari aloittaa ja lopettaa tulostettavan merkkijonon, niin miten ohjelmassa voidaan tulostaa lainausmerkit näkyviin? Esimerkiksi:
print("Haluaisin tulostaa kaksoislainausmerkin " jostakin syystä.")
Tämä koodi ei toimi. Tietokone tunnistaa lainausmerkin merkkijonon keskellä ja päättää merkkijono siihen. Sen jälkeen oleva jostakin syystä." tulkitaan epäkelvoksi komennoksi ja tästä tulkki generoi virheilmoituksen.
Tässä tilanteessa koneelle tulee kertoa, että myös merkkijonon keskellä oleva lainausmerkki halutaan tulostaa ja se onnistuukin varsin helposti kirjoittamalla lainausmerkin eteen takakenoviiva. Takakenoviiva kertoo koneelle, että lainausmerkki on osa merkkijonoa eikä sen tarkoitus ole lopettaa merkkijonoa. Esimerkiksi:
print("Haluaisin tulostaa kaksoislainausmerkin \" jostakin syystä.")
Tätä kahden merkin yhdistelmää \" kutsutaan escape koodiksi. Melkein jokaisessa ohjelmointikielessä on mahdollisuus käyttää escape koodeja. Jos haluat kirjoittaa takakenoviivan merkkijonoon näkyviin, pitää se kirjoittaa kahden takakenoviivan yhdistelmänä. Seuraava koodi onkin siis virheellinen:
print("Tiedosto on tallennettu C:\nopat kansioon")
Miksi se ei toimi? Siksi, että \n on rivin vaihdon tekevä escape koodi ja tulostuslause rivitetään kahdelle riville. Oikein koodattuna tulostus tehdään näin:
print("Tiedosto on tallennettu C:\\nopat kansioon")
Seuraavaan taulukkoon on koottuna muutama tärkeä escape koodi:
Escape koodi | Kuvaus |
---|---|
\' | Yksinkertainen lainausmerkki |
\" | Kaksoislainausmerkki |
\t | Tabulaattori |
\r | CR: Carriage Return (siirtää kohdistimen vasempaan reunaan) |
\n | LF: Linefeed (uusi rivi) |
Mitä tekevät “Carriage Return” ja “Linefeed”? Tutki asiaa seuraavan esimerkkikoodin avulla:
print("Tämä\non\nminun\nesimerkki.")
Tästä koodista tulostuu:
Tämä on minun esimerkki.
Escape koodi \n on rivinvaihto ja se siirtää kursorin seuraavalle riville. Tietokone tallentaa merkkijonon yhtenä pitkänä rivinä ja näyttää merkkijonon katkaisten rivin seuraavalle riville \n escape koodin kohdasta.
Aivan yksinkertainen ei rivin loppuminen ja vaihtaminen ole, koska käytännössä se riippuu käyttöjärjestelmästä. Seuraavassa taulukossa on yleisimpien käyttöjärjestelmien rivinvaihdon escape koodeja.
Escape koodi | Kuvaus |
---|---|
\r\n | CR+LF: Microsoft Windows |
\n | LF: UNIX ja uudemmat Mac-laitteet. |
\r | CR: Vanhat Mac -laitteet |
Tavallisesti tekstieditori huolehtii rivinvaihdoista, mutta tosin Microsoft Notepad (Muistio) ei sitä tee. Jos avaat esim. UNIX tekstitiedoston Notepadilla, näyttää teksti sekavalta, koska rivinvaihtoja ei joko ole tai ne näytetään mustina laatikoina. Siksi tarvitsetkin kunnollisen tekstieditorin ja seuraavassa on suositeltavia vaihtoehtoja: Sublime tai Notepad++.
1.4 Kommentit
Kommentit on tarkoitettu selittämään koodin toimintaa ja selventää koodin tarkoitusta lukijalle. Kommentit selventävät koodin tarkoitusta lukijalle. Kone ei niitä huomioi millään tavalla eivätkä ne vaikuta ohjelman toimintaan.
Kommentteja voidaan kirjoittaa kahdella tapaa. Kommenttirivin alkuun kirjoitetaan # merkki ja tietokone jättää rivin huomioimatta ajon aikana. Esimerkiksi:
# Kommentti aloitetaan # merkillä # ja tietokone ei huomio näitä rivejä. print("Tämä taas on tulostuslause") print("ja tietokone tulostaa nämä.")
Jos ohjelmassa on # merkki lainausmerkkien välissä, sitä ei tulkita kommentiksi. Ohjelmoija voi sulkea jonkin ohjelmarivin pois lisäämällä # merkin rivin alkuun ensimmäiseksi merkiksi. On myös mahdollista lisäs kommentti komentorivin/lauseen jälkeen, kuten seuraavassa esimerkissä on esitetty..
print("Keskellä tulostuslausetta oleva # merkki ei ole kommentti.") # print("Tästä tulostuslauseesta onkin tehty kommentti.") print("Hi") # Tämä kommentti on lisätty rivin loppuun.
Kommentteja voidaan kirjoittaa myös useammalle riville jakamalla kommentit kolmoislainausmerkkien väliin useammalle riville.
print("Hi") ''' Tässä on kommentti useammalla rivillä. Mitään ei suoriteta ennen print("tätä") ''' print("Tehty")
Useimmat Python-ammattiohjelmoijat käyttävät useamman rivin kommentointia, jota kutsutaan englanninkielisellä nimellä docstring. Docstring-kommenteista on mahdollisuus tulostaa dokumentaatio esimerkiksi web-sivuina. Yleisesti ottaen kuitenkin # kommenttitagi toimii parhaiten.
Kommenttien käyttö on hyödyllistä vaikka kirjoittaisit ja käyttäisit koodia yksinkin. Kommentit esimerkiksi säästävät aikaa, kun merkitset koodin osat kommenteilla. Löydät kommenttien avulla helposti koodista esimerkiksi kohdan “Käsittelee avaruusolioiden pisteet” tutkimatta koodia sen tarkemmin.
1.5 Asetusoperaattori, asetuslause
Kuinka voimme tallentaa pelissä pisteet? Tai miten huolehditaan vastustajan heikkeneminen ja vahvistuminen pelin aikana? Tällaisten asioiden huolehtimiseen tarvitaan asetusoperaattori.
Operaattoreiksi kutsutaan esimerkiksi + tai - merkkejä. Ohjelmoinnissa asetusoperaattoriksi kutsutaan = merkkiä. Se tallentaa muuttujaan jonkin annetun arvon, jota voidaan sitten ohjemassa käyttää myöhemmin. Alla olevassa koodissa tallennetaan muuttujaan x luku 10.
Tutki alla olevaa esimerkkiä. Klikkaa “Step” painiketta ja katso, miten koodi toimii.
# Luodaan muuttuja x # Tallennetaan muuttujaan x arvo 10. x = 10 # Tämä lause tulostaa muuttujan x arvon. print(x) # Tämä tulostaa merkin x, mutta ei x muuttujan arvoa. print("x") # Tässä tulostuu "x= 10" print("x=", x) |
Variables:
x= Output:
10 x x= 10 |
Huomaa: Yllä olevassa listauksessa nähdään myös x muuttujien käyttäytyminen tulostuslauseessa; lainausmerkkien sisällä tulostuu merkki x ja lainausmerkkien ulkopuolella tulostetaan x muuttujan arvo.
Ohjelmoinnissa asetuslauseen (komentorivi, jossa on = operaattori) tarkoitus on eri kuin matematiikassa. Matematiikassahan = merkki tarkoittaa algebrallista yhtäsuuruutta ('on yhtäsuuri kuin'). Ohjelmoinnissa asetuslauseessa = merkin oikealla puolella olevan lausekkeen arvo sijoitetaan vasemmalla puolella olevan muuttujan arvoksi. Vasemmalla puolella = merkkiä saa olla vain yksi muuttujan tunnus, ei siis laskutoimituksia tms.
Yhtäsuuruusmerkin oikealla puolella on lauseke. Lausekkeella on yksikäsitteinen arvo. Arvo voi olla esimerkiksi merkki, merkkijono, lukuarvo tai totuusarvo (boolean). Katso alla olevaa koodia.
x = x + 1
Yllä oleva koodi ei luonnollisestikaan voi pitää paikkaansa matematiikassa. Algebrallisesti lausekkeen oikea ja vasen puoli eivät ole yhtä suuria. Mutta ohjelmoinnissa lauseke on tietokoneelle aivan toimiva sijoituslauseke.
Yllä oleva koodi toimii niin, että muuttujaan x lisätään luku 1 ja tämän yhteenlaskun tulos sijoitetaan muuttujan x uudeksi arvoksi.
Laajennetaan esimerkkia siten, että se tulostaa luvun 6.
x = 5 x = x + 1 print(x)
Lauseet suoritetaan peräkkäin, ylhäältä alas. Tietokone ei osaa lukea koodirivejä ennalta. Alla olevassa koodissa rivillä 2 tulostetaan luku 5. Sitten x:n arvoa kasvatetaan yhdellä ja rivillä 4 tulostetaan luku 6.
x = 5 print(x) # tulostaa 5 x = x + 1 print(x) # tulostaa 6
Seuraava lause on toimiva, mutta hyödytön. Tietokone lisää muuttujaan x luvun yksi, mutta arvoa ei tallenneta mihinkään saatikka arvoa ei tulosteta.
x + 1
Seuraavassa koodissa tulostuukin luku 5 eikä 6, koska ohjelmoija on unohtanut tallettaa kausekkeen x + 1 arvon takaisin muuttujaan x.
x = 5 x + 1 print(x)
Alla olevassa koodissa on syntaksivirhe. Yhtäsuuruusmerkin vasemmalla puolella on lauseke ja siellä pitäisi olla vain muuttujan nimi (tunnus):
x + 1 = x
Python-kielessä on mahdollista käyttää erityisiä operaattoreita. Niillä saadaan lyhennettyä asetuslausetta:
x += 1
Yllä oleva koodi tekee x-muuttujan arvon kasvatuksen yhdellä, eli saman kuin koodi alla:
x = x + 1
Näitä "lyhennettyjä" operaattoreita on kasvattamisen lisäksi myös vähentämiseen, kertomiseen ja jakamiseen.
1.6 Muuttujat
Yleisen tavan mukaisesti muuttujan nimi pitäisi kirjoittaa pienellä alkukirjaimella. Se voidaan erikoistapauksissa kirjoittaa isolla alkukirjaimella tai alaviivalla. Ensimmäisen pienen akukirjaimen perään voidaan kirjoittaa isoja tai pieniä kirjaimia, numeroita ja alaviivoja. Välilyöntejä muuttujan nimeen ei saa kirjoittaa. Älä myöskään käytä muuttujien nimissä skandinaavisia merkkejä; ö, ä, å.
Muuttujien nimessä erotetaan pienet ja isot kirjaimet. Esimerkiksi alla olevassa koodissa tulostetaan 6 eikä 5, koska muuttuja x ja X ovat eri muuttujia.
x = 6 X = 5 print(x)
Virallisessa Python-oppaassa ohjeistetaan, että useammasta sanasta muodostuvissa muuttujien nimissä sanat yhdistetään alaviivalla. Esimerkiksi hair_style on suositeltava muuttujan nimi, mutta hairStyle ei ole. Tätä sääntöä ei kuitenkaan voida pitää yleispätevänä, sillä esim. Java-kielessä sääntö on päinvastainen. Noudattakaamme tässä kirjoittajan suosittamaa Python-ohjetta. Kirjoittaja yritti noudattaa Java-tyylistä muuttujien nimeämistä, mutta se aiheutti niin paljon narinaa Python-leirissä, että oli viisampaa noudattaa Pythonin ohjetta.
Alla on muutama esimerkki sopivista ja epäsopivista muuttujien nimistä:
Laillinen muuttujan nimi | Epäkelpo muuttujan nimi | Laillinen, mutta ei suositeltava |
---|---|---|
first_name | first name | FirstName |
distance | 9ds | firstName |
ds9 | %correct | X |
ISOILLA kirjaimilla kirjoitetut muuttujat; esim. MAX_SPEED on tarkoitettu käytettäväksi vakioille. Vakiot ovat muuttujia, joiden arvo ei ohjelmassa muutu eikä muuteta.
1.7 Operaattorit
Alla olevassa taulukossa on yleiset sekä vähemmän yleiset matemaattiset operaattorit:
operaattori | operaatio | esimerkkilauseke | koodiesimerkki |
---|---|---|---|
+ | yhteenlasku | $3 + 2$ | a = 3 + 2 |
- | vähennys | $3 - 2$ | a = 3 - 2 |
* | kertolasku | $3 \cdot 2$ | a = 3 * 2 |
/ | jakolasku | $\frac{10}{2}$ | a = 10 / 2 |
// | jako alaspäin pyöristäen | N/A | a = 10 // 3 |
** | potenssi | $2^3$ | a = 2 ** 3 |
% | kokonaislukujako | N/A | a = 8 % 3 |
“Jako alaspäin pyöristys” pyöristää tuloksen alaspäin lähimpään kokonaislukuun. Esimerkiksi, 11//2 tulos on 5, eikä 5.5, ja 99//100 tulos on 0.
Pythonissa kertolaskuissa tulee käyttää kertolaskuoperaattoria. Matematiikasta tuttu esitys ilman kertomerkkiä ei toimi Pythonissa. Alla oleva koodiesimerkki siis ei toimi:
# Ei toimi x = 5y x = 5(3/2)
Toimivana samainen koodi olisi:
# Tämä toimii x = 5 * y x = 5 * (3 / 2)
1.7.1 Operaattorit ja välilyönnit
Operaattoreiden ympärillä, alussa tai lopussa, voi olla tyhjiä välilyöntejä. Ne eivät haittaa koneen laskutoimenpiteitä. Esimerkiksi seuraavat kolme koodiriviä suorittavat saman tuloksen:
x=5*(3/2) x = 5 * (3 / 2) x =5 *( 3/ 2)
Virallinen Python-opas suosittelee käytettäväksi välilyöntejä operaattorin alussa ja lopussa. Eli yllä toinen koodirivi olisi kelpo esitys. (Nyt on monesti mainittu virallinen Python-tyyliopas. Sitä kutsutaan: PEP-8. Voit tarkistaa sieltä Pythonin koodaustyyliin liittyviä seikkoja.)
1.8 Operaatioiden suoritusjärjestys, presedenssi
Pythonin operaatioiden ja lausekkeiden suoritusjärjestys on sinulle tuttu, koska se on samanlainen kuin sinulle matematiikassa. Seuraavassa olisi tarkoitus laskea keskiarvo, mutta laskujärjestyksestä johtuen lausekkeesta ei saada oikeaa tulosta:
average = 90 + 86 + 71 + 100 + 98 / 5
Ensimmäiseksi suoritetaan 98/5. Kone laskee siis lausekkeen seuraavasti:
$90+86+71+100+\frac{98}{5}$
vaikka pitäisi laskea:
$\dfrac{90+86+71+100+98}{5}$
Tässä tarvitaan siis sulkeiden käyttöä:
average = (90 + 86 + 71 + 100 + 98) / 5
1.9 Trigonometriset funktiot
Trigonometrisia funktioita käytetään mm. sinin ja kosinin laskemiseen. Pythonin perusfunktioissa ei ole mahdollisuutta laskea trigonometrisia laskutoimituksia, mutta ottamalla import lauseella käyttöön matemaattinen (math) funktiokirjasto, saadaan tämäkin asia tehtyä. Yksikköinä käytetään radiaaneja (rad). Radiaania ei käsitellä peruskoulumatematiikassa, mutta lukiomatematiikassa se käsitellään.
# Import ottaa käyttöön math kirjaston # import-lause kirjoitetaan ohjelman alkuun kerran from math import * # Lasketaan x käyttäen sin ja cos funktioita x = sin(0) + cos(0)
1.10 Modifioidaan laskin
Tehdään laskin, jolla voidaan laskea polttoaineen kulutus / km. Autolla ajetaan 470 km ja polttoainetta kuluu 34.5 litraa. Keskikulutus k on:
k = 34.5 / 470 print(k)
Ohjelmaa pitää parantaa käyttämällä muuttujia, jolloin laskulauseketta ei tarvitse kirjoittaa uudelleen.
km = 470 g = 34.5 k = km / g # tässä on käytetty muuttujia print(k)
Ohjelma on vielä hieman vaikeaselkoinen. Muuttujat km ja g eivät ole kovin helposti ymmärrettävissä. Niiden tilalla voitaisiin käyttää selkeämpää nimeämistä:
ajetut_kilometrit = 470 kulunut_polttoaine = 34.5 kulutus_kilometrilla = ajetut_kilometrit / kulunut_polttoaine print(kulutus_kilometrilla)
Näin jopa ohjelmointitaidoton näkee, mitä ohjelmassa tehdään. Seuraavaksi katsotaan vielä esimerkki huonosta muuttujien nimeämisestä:
# Huonoja muuttujan nimiä ir = 0.12 b = 12123.34 i = ir * b # Asiallinen nimeäminen korko_prosentti = 0.12 tili_saldo = 12123.34 korko_tuotto = korko_prosentti * tili_saldo
IDLE editorissa voit editoida aiempia rivejä kirjoittamatta niitä uudelleen. Siirrä kohditin rivin kohdalle ja näppäile “enter” näppäintä. Rivi kopioituu uudelle riville.
Kirjoittaminen promptin perään on hidasta ja voit syöttää vain rivin kerrallaan. Promptissa koodia ei voida tallentaa.
Python koodin kirjoittaminen skriptiksi (tallennettavaksi koodiksia) onnistuu avaamalla IDLE-editoriin uusi ikkuna. Katso oheinen kuva. 1.2.
(Voit käyttää myös muita editoreja Python-ohjelman koodaamiseen; esim. Wing IDE tai PyCharm. Nämä ovat helppokäyttöisiä ja ilmaisuvoimaisempia verrattuna IDLE-editoriin.)
Kirjoita edellä oleva kulutus/kilometri -ohjelma Pythonilla uuteen ikkunaan. Tallenna ohjelma koneellesi omaan kansioosi. Python-tiedostopääte tulee olla .py ja uusi IDLE-versio osaa lisätä sen automaattisesti. Katso Kuva 1.3.
Aja ohjelma klikkaamalla “Run”- “Run Module”. Muuta muuttujien arvoja, tallenna ja aja uudelleen.
Tästä eteenpäin sinun tulee kirjoittaa ohjelmakoodi aina uuteen ikkuna, jossa se voidaan tallentaa uudellenkäyttöä varten. Älä vahingossakaan kirjoita ohjelmaasi IDLE >>> promptiin, koska sitä ei voida korjata helposti eikä tallentaa. Promptiin kirjoitettu ohjelma pitää kirjoittaa aina uudelleen ja se ei ole kivaa.
Polttoaineenkulutusohjelmaa voisi parannella vielä eteenpäin. Se olisi käyttäjäystävällisempi, jos se esim. kysyisi kilometrit ja kulutuksen käyttäjältä. Tämä parannus saadaan aikaan input lauseella. Katso koodi alla:
# Tämä koodi melkein toimii ajetut_kilometrit = input("Syötä ajetut kilometrit:") kulutettu_polttoaine = input("Syötä kulutetun polttoaineen määrä:") kulutus_kilometrilla = kulutettu_polttoaine / ajetut_kilometrit print("Kulutus kilometrillä:", kulutus_kilometrilla)
Kun tämä ohjelma ajetaan, se kysyy käyttäjältä kilometrit ja polttoaineen määrän, mutta tuloksena kuitenkin generoituu kummallinen virheilmoitus, Kuva 1.4.
Syy virheilmoitukseen saadaan näkyviin muuttamalla ohjelmaa jonkin verran:
ajetut_kilometrit = input("Syötä ajetut kilometrit:") kulutettu_polttoaine = input("Syötä kulutettu polttoaine:") x = ajetut_kilometrit + kulutettu_polttoaine print("Summa ak + kp:", x)
Nyt ohjelman ajaminen tulostaa oheisen kuvan mukaisen tuloksen Kuva 1.5.
Ohjelma ei lisää lukuja yhteen, vaan niitä käsitellään merkkijonoina ja liitetään peräkkäisiksi merkkijonoiksi (katenoidaan). Ohjelma ei osaa tulkita käyttäjän syöttämiä merkkejä luvuiksi. Jos käyttäjä syöttäisi `Bob” ja “Mary”, olisi tuloksena merkkijonoyhdiste “BobMary”.
Syötteen muuntaminen tietokoneen ymmärtämäksi lukutyypiksi, pitää input funktio "ympäröidä" int( ) or a float( ) tyypinmuunnoksella. int-tyyppi on kokonaislukuja ja float-tyyppi käsittää desimaaliluvut.
Alla on hieman toisenlainen ohjelmaesimerkki, jossa lasketaan yhdellä gallonalla (1 gal = 4.4litraa) ajettava matka maileina (1 mi = 1.61km) Ohjelma esitetään alkuperäisenä, joten se on englanninkielinen. Se on toimiva, lopullinen ja hyvin kommentoitu ohjelma:
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Explanation video: http://youtu.be/JK5ht5_m6Mk # Calculate Miles Per Gallon print("This program calculates mpg.") # Get miles driven from the user miles_driven = input("Enter miles driven:") # Convert text entered to a # floating point number miles_driven = float(miles_driven) # Get gallons used from the user gallons_used = input("Enter gallons used:") # Convert text entered to a # floating point number gallons_used = float(gallons_used) # Calculate and print the answer mpg = miles_driven / gallons_used print("Miles per gallon:", mpg) |
Variables:
milesDriven= gallonsUsed= mpg= Output:
This program calculates mpg. Enter miles driven: 288 Enter gallons used: 15 Miles per gallon: 19.2 |
Katsotaan vielä toisena esimerkkinä fysiikkaan liittyvä ohjelma, jolla lasketaan kappaleen liike-energia:
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Calculate Kinetic Energy print("This program calculates the kinetic energy of a moving object.") m_string = input("Enter the object's mass in kilograms: ") m = float(m_string) v_string = input("Enter the object's speed in meters per second: ") v = float(v_string) e = 0.5 * m * v * v print("The object has " + str(e) + " joules of energy.")
Muutetaan tässäkin ohjelmassa input lauseen merkkimuuttuja float määreellä desimaaliluvuksi. Esimerkiksi koodirivit:
milesDriven = input("Enter miles driven:") milesDriven = float(milesDriven)
Yhdistetään muunnos yhdeksi lauseeksi:
milesDriven = float(input("Enter miles driven:"))
Tässä tapauksessa input funktion tulos syötetään suoraan float funktion parametriksi. Tällainebn tyypinmuunnos on syytä opetella, koska se on varsin tärkeä asia ohjelmoinnissa.
1.11 Review
1.11.1 Multiple Choice Quiz
Klikkaa tästä monivalintatehtävään.
1.11.2 Short Answer Worksheet
Klikkaa tästä kappaleen kertaustehtäviin.
1.11.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