Python-jatkokurssi: Pygame-pelitehtävä

Niin vilahti syksy nopeaakin nopeammin algoritmejä kirjoitellessa. 😀 Lokakuun loppupuolella alkoi Helsingin yliopiston Python-jatkokurssi, ja sen aikana ei paljon ehtinyt muuta tehdä. Unetkin olivat pelkkää Pythonia: milloin tein binäärihakua ja milloin for-silmukoita tai listakoosteita. Nyt on kurssi päättynyt, kaikki tehtävät tehty ja palautettu, niin että tentin tulosta tässä enää odotellaan. 😉

Kahdella viimeisellä viikolla tutustuimme pelimaailmaan Pygame-palikan avulla. Lopputyönä meidän täytyi tehdä tietyt kriteerit täyttävä pikkupeli. Jotkut opiskelijakaverit tekivätkin hienoja pelejä, joita on ollut hauska pelata. Oma pelini ei niin ihmeellinen ole, mutta täyttää kuitenkin ne vaaditut kriteerit. Kuvat meille annettiin valmiiksi: robotti, haamu/mörkö, kolikko ja ovi. Niiden tiimoille peli oli tehtävä omia ideoita käyttäen. Peliäni voi pelata vain Python-editorilla, joten tähän postaukseen laitan pelistäni ottamani näytöntallennuksen. Kaikki pelin jutut eivät tule näkyviin videossa, esim. sitä ei näy, jos törmää haamuun tai häviää pelin muuten. Myöskään sloganit, jotka ilmestyvät komentotulkkiin, kun pelaaja lopettaa pelin ESC-näppäimellä, eivät videolla näy. Laitan ne sloganit tähän loppuun. 🙂

Pelin sloganit: 😀
Terve vaan ja kiitos kaloista!
Vierivä python ei sammaloidu.
Jos antaa pythonille pikkusormen, se vie koko käden.
Parempi python pivossa kuin kymmenen kyytä oksalla.
Ei kukaan ole python syntyessään… paitsi python.
Python has left the building. 😀

Python: listojen käsittelyä 2

Tässä artikkelissa käyn läpi, miten alkioita poistetaan listalta. Listojen käsittelyä 1 -sivulla kertoilin, miten alkioita voidaan lisätä listaan.

Kaikkien alkioiden poistaminen listalta yhdellä kertaa

Kun halutaan tyhjentää lista yhdellä kertaa kaikista alkioista, tähän löytyy eri tapoja, joista käsittelen kaksi. Metodi clear tyhjentää listan kertarykäisyllä.

lista = [1, 2, 3, 4, 5]
lista.clear()
print(lista)
[]

Saman asian ajaa del lista[:]. Tässä koodissa lista[:] tarkoittaa koko listan, sen kaikkien alkioiden valitsemista.

lista = ["pippuri", "oregano", "basilika", "rakuuna", "curry"]
del lista[:]
print(lista)
[]

Yksittäisen alkion poistaminen listalta

Kun tiedämme, minkä alkion haluamme poistaa listalta, voimme käyttää remove-metodia. Alla olevaan mausteet-listaan on erehdyksessä joutunut yksi aines, joka vaikkakin saattaisi hieman “maustaa” ruokaa, voisi aiheuttaa myös kalliin matkan hammaslääkäriin. 😉 Se on siis poistettava listalta.

mausteet = ["basilika", "oregano", "mutteri", "rakuuna", "curry"]
mausteet.remove("mutteri")
print(mausteet)
['basilika', 'oregano', 'rakuuna', 'curry']

HUOM! Remove-metodi poistaa listalta vain ensimmäisen parametrin mukaisen alkion. Jos listalla olisi toinen mutteri, se jäisi sinne. Jos epäilemme, että listalla on muttereita enemmänkin, ja haluamme poistaa ne kaikki, niin silloin voimme käyttää for-silmukkaa ja käydä mausteet-listaa läpi alkio alkiolta ja poistaa mutterit sitä mukaa listalta.

mausteet = ["basilika", "oregano", "mutteri", "rakuuna", "mutteri", "curry", "mutteri", "mutteri"]

for alkio in mausteet:
----if "mutteri" in mausteet:
--------mausteet.remove("mutteri")

print(mausteet)
['basilika', 'oregano', 'rakuuna', 'curry']

Kun haluamme poistaa alkion tietystä paikasta, voimme käyttää pop-metodia. Meidän ei siis tarvitse tietää alkiota, ainoastaan sen paikka listassa, esim. nimet[2], eli haluamme poistaa nimet-listalta alkion paikasta 2, ja kukas sitten joutuu leikistä pois. Katsotaan…

nimet = ["Ana", "Carlos", "Jorge", "Eva", "Pedro"]
nimet.pop(2)
print(nimet)
['Ana', 'Carlos', 'Eva', 'Pedro']

¡Adiós, Jorge! 😀
Kun Jorge on poistettu listalta, sen jälkeen tulevien paikat siirtyvät yhden askeleen eteenpäin. Evan paikka muuttuu siis 3:sta 2:ksi ja Pedron 4:stä 3:ksi.

Jos kuitenkin haluamme säilyttää Jorgen varalla, voimme palauttaa hänet omaan muuttujaan (tässä esimerkiksi varalla-nimiseen).

nimet = ["Ana", "Carlos", "Jorge", "Eva", "Pedro"]
varalla = nimet.pop(2)
print(nimet)
['Ana', 'Carlos', 'Eva', 'Pedro']
print(varalla)
Jorge

Listan alkion korvaaminen toisella alkiolla

Alkion voi poistaa myös siten, että korvaa sen jollain toisella alkiolla.

nimet = ["Ana", "Carlos", "Jorge", "Eva", "Pedro"]
nimet[2] = "Javier"
print(nimet)
['Ana', 'Carlos', 'Javier', 'Eva', 'Pedro']

Eli Javier pääsi kentälle Jorgen tilalle, ja Jorge joutui filttiketjuun. 😀


Tässä toinen Python-listoja käsittelevä artikkeli. Jos löysit virheitä tai muuta kommentoitavaa, heitä minua sähköpostiviestillä. 😀


PS. For-silmukssa olen käyttänyt sisennykseen valkoisia tavuviivoja, jotka eivät kuulu koodiin, vaan siinä kuuluisi olla pelkkä sisennys. Span class -sisennys ei suostu toimimaan  WordPressissä, ainakaan minulla, joten on tyydyttävä tällaiseen kepuliratkaisuun.  😉

Python: listojen käsittelyä 1

Tässä artikkelissa käydään läpi Pythonin listojen peruskäsittelyyn liittyvää tilannetta eli alkioiden lisäämistä listaan. Pythonissa listoihin voi tallentaa erilaista tietoa, kuten kokonais- ja liukulukuja, merkkijonoja ja tupleja sekä sanakirjoja. Listan alkioina voi olla myös muita listoja. Listan alkiot tallennetaan hakasulkujen [ ] sisään.
Esimerkkejä:
kokonaislukuja = [1, 5, 9, 205, 4]
liukulukuja = [1.34, 2.01, 75.3, 23.55]
merkkijonoja = ["mekko", "hame", "housut", "hattu", "vaatteita arkeen"]
tuplelista = [(1 , 4), (1.45, 7.5), (90, 54.3)]
sanakirjalista = [{1: "kuusi"}, {2: "koivu"}, {3: "saarni"}]
listalista = [[1, 2, 5], [3, 4, 6], [21, 3, 5]]
sekalista = ["terve taas", 3, [3, 6]]

Pythonin listaan voi lisätä uusia alkiota, listasta voi poistaa alkiota, ja listan alkioita voi järjestellä eri järjestykseen. Lista on siis varsin joustava väline tiedon käsittelyyn.

Alkion lisääminen listaan viimeiseksi

Alkioita voi lisätä listaan eri tavoin. Jos haluamme lisätä alkion listan loppuun, se käy append-metodilla. Esimerkissä listan viimeiseksi lisätään luku 13.

lista = [2, 5, 9, 11]
lista.append(13)
print(lista)
[2, 5, 9, 11, 13]

Toinen vähemmän käytetty tapa toimii samalla tavoin. HUOM! lista += 17 ei toimi, vaan tässä tarvitaan nuo hakasulut lisättävän alkion ympärille.

lista = [3, 6, 8, 10]
lista += [17]
print(lista)
[3, 6, 8, 10, 17]

Alkion lisääminen tiettyyn paikkaan listalla

Koska listan alkiot sijaitsevat tietyssä paikassa listalla, uusia alkioita voi sijoittaa listalla myös tiettyihin paikkoihin. insert-metodilla voidaan sijoittaa uudet alkiot halutuille paikoille listassa. Paikat listalla alkavat nollasta (0, 1, 2, 3, 4…). lista[0] tarkoittaa listan 1. paikkaa. Listan paikat häntäpäästä luettuna ovat lista[-1], lista[-2] jne.
Esimerkissä lista.insert(2, 7) sijoitetaan listassa paikalle 2 uusi luku 7, jolloin siinä paikassa oleva 8 siirtyy seuraavalle paikalle, samoin kaikki sen jälkeen tulevat alkiot siirtyvät yhden paikan verran eteenpäin.

lista = [5, 6, 8, 9]
print(lista[2])
8
lista.insert(2, 7)
print(lista[2])
7
print(lista)
[5, 6, 7, 8, 9]

Alkion lisääminen tyhjään listaan

Sekä append- että insert-metodia voi käyttää tässäkin, kun halutaan lisätä yksittäisiä alkioita listaan.

lista = []
print(lista)
[]
lista.append("Python")
lista.append("kivaa.")
print(lista)
['Python', 'kivaa.']
lista.insert(1, "on")
print(lista)
['Python', 'on', 'kivaa.']

Joskus voi tulla eteen sellainen erikoistilanne, että tyhjään listaan täytyy lisätä sama alkio monta kertaa. Tässä pääsee kaikkein helpoimmalla näin. Esimerkissä haluamme lisätä tyhjään listaan 10 kpl kakkosia. Lista ja alkiot luodaan yhtä aikaa yhdellä rivillä.

lista = [2] * 10
print(lista)
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

Lopuksi esimerkki siitä, miten voidaan pyytää käyttäjää lisäämään alkioita tyhjään listaan. Tätä toki voi käyttää myös silloin, kun listalla on jo alkioita. Käytetään tässä kätevää for-silmukkaa, jonka avulla käyttäjää pyydetään kolme kertaa syöttämään tyhjälle listalle jonkin alkion.
Koodi voisi näyttää esimerkiksi tältä:

lista = []
for syote in range(3):
----syote = input("Syötä mitä tahansa: ")
----lista.append(syote)
print(lista)

Tulostus voisi näyttää tältä:

Syötä mitä tahansa: 56
Syötä mitä tahansa: nappi
Syötä mitä tahansa: 3.14
['56', 'nappi', '3.14']

HUOM! Listan alkiot ovat tässä esimerkissä kaikki merkkijonoja, myös luvut, sillä inputissa ei määritelty alkioiden tyyppiä.

Alkion lisääminen uuteen listaan

Monesti on järkevää säilyttää alkuperäinen lista koskemattomana ja luoda uusi samanlainen lista, johon sitten lisätään tarvittavat uudet alkiot. Näin meillä on kaksi listaa, emmekä menetä alkuperäisen listan tietoja, jos niitä joskus tarvitaan. Tähän tilanteeseen on tarjolla eri tapoja, joista tässä kaksi.

Ensimmäisessä esimerkissä luodaan uusi tyhjä lista. Tämän jälkeen käydään for-silmukan avulla vanhan listan alkiot läpi – alkio alkiolta – ja lisätään append-metodilla samoin tein uuteen listaan. For-silmukan jälkeen lisätään uuteen listaan vielä yksi alkio viimeiseksi.

lista = [1, 2, 3, 4]
uusi = []

for alkio in lista:
----uusi.append(alkio)
uusi.append("listassa on neljä lukua")

print(uusi)
[1, 2, 3, 4, 'listassa on neljä lukua']
print(lista)
[1, 2, 3, 4]

Toisessa tapauksessa käytetään lyhyempää listan kopiointitapaa uusi = lista[:], jossa luodaan vanhasta listasta täydellinen kopio uuteen.

lista = [2, 4, 6]
uusi = lista[:]

uusi.append("listassa on kolme parillista lukua")

print(uusi)
[2, 4, 6, 'listassa on kolme parillista lukua']
print(lista)
[2, 4, 6]

Molemmissa tapauksissa alkuperäinen lista jää koskemattomaksi.

Kahden listan yhdistäminen: extend

Jos täytyy yhdistää kaksi listaa yhdeksi, tällöin apuun tulee extend-metodi. Alla olevassa esimerkissä lista2 yhdistetään lista1:een.

lista1 = [1, 2, 3, 4, 5]
lista2 = [6, 7, 8, 9, 10]
lista1.extend(lista2)
print(lista1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


Tässä ensimmäinen Python-listoja käsittelevä artikkeli. Jos jäit jotain kaipaamaan tai jos jotain virheellistä olen tässä höpötellyt, niin pistä tulemaan viestiä. 😀
25.8.2020 Päivitin tekstiä extend-metodilla (Kahden listan yhdistäminen).


PS. Koodissa tarvittavissa sisennyksissä käytin ns. “köyhän naisen menetelmää”, eli taustan värisiä (valkoisia) tavuviivoja, joiden avulla sain siirrettyä sisennettävän rivin suurin piirtein oikealle kohdalle. WordPress ei tarjoa tällaiseen tapaukseen helppoa tapaa, jolla yhden rivin saisi heittäen sisennettyä. Joten jos kopioit koodeja suoraan tältä sivulta, kannattaa tavuviivojen kohdalle tehdä oikeoppinen sisennys Python-ohjelmassa, muuten koodi ei toimi. 😀

Python: tulostuksen muotoilu

Python-ohjelmoinnin peruskurssi Helsingin avoimessa yliopistossa on takanapäin, ja ajattelin kirjoitella muutamia tietoiskun kaltaisia artikkeleja Python-ohjelmointikielestä itseäni ja asiasta kiinnostuneita varten. 😀 Tämä on ensimmäinen, ja käsittelee tulostuksen muotoilun perusjuttuja.

Pythonissa on eri tapoja, joilla tulostuksen ulkonäköä voi muotoilla. Riippuen tapauksesta voi valita itselleen mieluisimman tai helpoimman.

Yhden rivin tulostus

Tämä on se kaikkein helpoin tapaus, jossa ei tarvita mitään sen kummempaa, ja monissa tapauksissa tämä riittää, eli ei tarvita kuin print-komento.

print("Huomenta!")
Huomenta!

print("Huomenta! Mitä kuuluu? Kuinka voit tänään?")
Huomenta! Mitä kuuluu? Kuinka voit tänään?

Kahden tai useamman rivin tulostus

Tähän on kaksikin mahdollisuutta. Ensimmäinen: print-komennot voi laittaa alekkain, jolloin jokainen rivi tulostuu omalle rivilleen. Tyhjän rivin voi tulostaa komennolla print().

print("Huomenta!")
print("Mitä kuuluu?")
print()
print("Ihan hyvää.")
Huomenta!
Mitä kuuluu?

Ihan hyvää.

Toisessa vaihtoehdossa voidaan käyttää yhtä print-komentoa ja ilmaista rivinvaihdot \n-merkillä ilman välilyöntejä. Ja jos haluaa tyhjän rivin väliin, niin \n\n tuo tähän ratkaisun.

print("Huomenta!\nMitä kuuluu?\nKuinka voit tänään?")
Huomenta!
Mitä kuuluu?

Kuinka voit tänään?

Tulostus muuttujien kanssa

Pelkän muuttujan tulostaminen käy myös helposti.

nimi = "Seija"
print(nimi)
Seija

Kun tulostuksessa on muuttujia ja merkkijonoja, tarvitaan muita ratkaisuja.

Tulostus pilkkujen kanssa

Muuttujat ja merkkijonot voidaan tulostaa samalla print-komennolla, kun ne yhdistetään pilkulla.

nimi = "Helmi"
print(nimi, "jäi eilen eläkkeelle.")
Helmi jäi eilen eläkkeelle.

nimi = "Hannu"
ika = 60
print(nimi, "täyttää maanantaina", ika, "vuotta.")
Hannu täyttää maanantaina 60 vuotta.

Pilkku luo automaattisesti välilyönnin muuttujan ja merkkijonon väliin, joten koodaajan ei tarvitse välilyöntiä napauttaa, ellei halua tehdä koodista luettavampaa, kuten yllä. Sellaisissa tilanteissa, joissa muuttuja halutaan suomen kielioppisääntöjen mukaan liittää ilman välilyöntiä merkkijonoon, pilkku-muotoilu ei käy, kuten tilanteessa 60-vuotias, jossa 60 olisi muuttujan arvo.

Tulostus käyttäen merkkiä +

Kun tulostuksessa yhdistetään muuttujia ja merkkijonoja +-merkillä, täytyy koodaajan muistaa lisätä välilyönnit lainausmerkkien sisään, joko alkuun tai loppuun tai molempiin, riippuen tilanteesta. +-merkki ei luo välejä, kuten pilkku tekee. Alla olevasta esimerkistä näkee, milloin koodaajan täytyy laittaa välilyönti ja milloin se on syytä jättää pois. Esimerkiksi ”n isoäiti”-kohdassa ennen n-kirjainta ei laiteta välilyöntiä, koska sillä ilmaistaan nimi1:n eli Seija-merkkijonon genetiivimuotoa.

nimi1 = "Seija"
nimi2 = "Helmi"
print(nimi1 + " pääsi yliopistoon opiskelemaan. " + nimi2 + " on " + nimi1 + "n isoäiti.")
Seija pääsi yliopistoon opiskelemaan. Helmi on Seijan isoäiti.

+-merkin käytössä on se ongelma tai muistettava asia, että jos muuttujan arvo on jokin muu kuin merkkijono, kuten esimerkiksi kokonaisluku tai liukuluku, tämä täytyy muuttaa merkkijonoksi: str(muuttuja).

nimi = "Veikko"
ika = 73
print(nimi + " on " + str(ika) + "-vuotias.")
Veikko on 73-vuotias.

Tulostus f-merkkijonolla

Äkkiseltään f-muotoilu saattaa näyttää kaikista hankalimmalta tulostuksen muotoilulta, mutta loppupeleissä se ehkä onkin muuttujien, numeroiden ja merkkijonojen yhteistulostuksissa kaikkein vaivattomin, kunhan on ensin opetellut aaltosulkujen käytön. f-muotoilussa muuttuja laitetaan aaltosulkujen sisään {muuttuja} ja koko tulostettava rötlä lainausmerkkien väliin ja ensimmäisen lainausmerkin eteen kirjan f. Muuten voi kirjoittaa ihan normaalisti napauttaen normaalit välilyönnit tarvittaessa.

nimi1 = "Seija"
nimi2 = "Helmi"
print(f"{nimi1} pääsi yliopistoon opiskelemaan. {nimi2} on {nimi1}n isoäiti.")
Seija pääsi yliopistoon opiskelemaan. Helmi on Seijan isoäiti.

Tässäkin tulostuksen muodossa on pieni mutta, kuinkas muuten. 😉 Joissakin tilanteissa voi olla, että muuttujassa on lainausmerkit; tällöin tulee sisäkkäisten lainausmerkkien ongelma eikä tulostus toimi. Tähän on helppo ratkaisu: laittaa ne sisemmät lainausmerkit yksinkertaisina ’ ’, niin ongelma poistuu.

f-muotoilussa voidaan tulostusta muotoilla myös monipuolisemmin; sillä voi tehdä vaikkapa taulukoiden näköisiä ratkaisuja, mutta se on sitten jo toisen artikkelin aihe.

Pieni erikoistapaus liukuluvun muotoilusta tähän loppuun. Jos haluamme tulostaa liukuluvun hieman lyhyemmällä rimpsulla, voimme käyttää f-muotoilua.

pii = 3.14159265358979323846
luku = 55.1234567891
print(f"Pii on {pii:.4f} ja luku on {luku:.2f}.")
Pii on 3.1416 ja luku on 55.12.

Yllä olevassa esimerkissä, kohdissa .2f ja .4f, kirjain f tarkoittaa liukulukua (float). Ja kuten näkyy, piin tulostuksessa tapahtui myös pyöristys ylöspäin.

Tässä ensimmäinen Python-pläjäys. Jos jäit jotain kaipaamaan tai jotain virheellistä olen höpötellyt, niin pistä viestiä.