Arcade-pelien ohjelmointi Pythonilla ja Pygamella

Arcade-pelien ohjelmointi
Pythonilla ja Pygamella

Chapter 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

fig.trajectory

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.

fig.kinetic_energy
Figure 1.1: Pythonia voi käyttää kineettisen energian laskemiseen

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.")
fig.printing_calculator

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.

Video: The print function

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")
Tuleeko pilkku lainausmerkkien sisälle vai ulkopuolelle?

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ä.")

fig.escape_codes

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 koodiKuvaus
\'Yksinkertainen lainausmerkki
\"Kaksoislainausmerkki
\tTabulaattori
\rCR: Carriage Return (siirtää kohdistimen vasempaan reunaan)
\nLF: 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 koodiKuvaus
\r\nCR+LF: Microsoft Windows
\nLF: UNIX ja uudemmat Mac-laitteet.
\rCR: 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 ovat tärkeitä! (Vaikka tietokone ei niitä huomioikaan.)

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

Video: The Assignment Operator

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

Muuttujia ei kirjoiteta lainausmerkkien sisään.

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.

fig.pi

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

Muuttuja kirjoitetaan pienellä alkukirjaimella.

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

Video: Operators

“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)
Käytä selkeitä muuttujien nimiä

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
Video: Creating a custom calculator program

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.

fig.entering_a_script
Figure 1.2: Entering a script

(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.

fig.saving_mpg_calculator
Figure 1.3: Saving a script

Aja ohjelma klikkaamalla “Run”- “Run Module”. Muuta muuttujien arvoja, tallenna ja aja uudelleen.

Varoitus, yleinen virhe!

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.

fig.mpg_program_error
Figure 1.4: Kulutusohjelman ensimmäinen versio generoi virheen

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.

fig.mpg_incorrect_addition
Figure 1.5: Virheellinen yhteenlasku

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”.

Käyttäjän antama syöte pitää muuntaa luvuiksi

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.