Arcade-pelien ohjelmointi
Pythonilla ja PygamellaChapter 6: Takaisin silmukoiden pariin
Peleissä tarvitaan monimutkaisia silmukoita. Tässä kappaleessa voit haastaa itsesi ja oppia "silmukoiden mestariksi". Hallitsemalla tämän kappaleen asiat voitkin tunnustaa olevasi silmukoiden asiantuntija.
Jos sinusta tuntuu, että 'asiantuntija' on liian vaativa tavoite, niin vähimmäisvaatimuksena kuitenkin on se, että ymmärrät ja osaat ratkaista kahdeksan ensimmäistä probleemaa tästä kappaleesta.
Sivulla ovat vastaukset videoina ja koodit selitettynä (tosin englannin kielisinä. Voit tutkia sivun esimerkkikoodien toiminnan klikkaamalla 'Step' -painiketta.
6.1 Print lause ja End merkit
Oletuksena print lauseen tulostus tekee carriage return eli rivinvaihdon uudelle riville. Pääsääntöisesti tämä toiminta sopii tulostukseen, mutta jos haluammekin yhdistää tulostuslauseiden tulosteen samalle riville, pitää käyttää lopetusmerkkiä, eli end characteria. Tässä muutama esimerkki, joka havainnollistaa ongelmaa:
print("Pink") print("Octopus")
...nämä tulostavat:
Pink Octopus
Jos siis haluamme kirjoittaa koodin, jolla tulostus saadaan samalle riville, pitää käyttää tulostuslauseessa end characteria. Esimerkiksi:
print("Pink", end="") print("Octopus")
..nyt tulostuu näin:
PinkOctopus
Ja lisätään vielä välilyönti tyhjänä merkkijonona:
print("Pink", end=" ") print("Octopus")
..nyt tulostuu välilyönnin kanssa:
Pink Octopus
Tässä toinen esimerkki:
i = 0 print(i, end=" ") i = 1 print(i, end=" ")
Tämä tulostaa nollan ja ykkösen:
0 1
6.2 Lisäoppia silmukoista
- Kokeilepa kirjoittaa ohjelma, joka tulostaa kymmenen asteriskia (*) peräkkäin, siis näin:
* * * * * * * * * *
Tee ohjelma käyttämällä for silmukkarakennetta. Helpointahan olisi kirjoittaa yksi print lause, jossa on merkkijonossa kymmenen asteriskia, mutta tämä ei siis keplaa ratkaisuksi. Tähän riittää kaksi riviä koodia. Ensinnäkin for silmukka, jossa on print lause.
Voit verrata ratkaisuasi seuraavaan vastausmalliin:
ProgramArcadeGames.com/chapters/06_back_to_looping/problem_1.php - Kirjoita seuraavaksi ohjelma, joka tulostaa:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Tässä ongelma on samanlainen, mutta tulostettavien merkkien määrä on 5 tai 20. Muuta ohjelmaasi niin, että saat tulostettua for silmukoilla esimerkin mukaiset asteriskit.
Seuraavasta linkistä voit verrata ratkaisuasi mallivastaukseen:
ProgramArcadeGames.com/chapters/06_back_to_looping/problem_2.php - Käyttämällä kahta for silmukkaa, saat konstruoitua seuraavan ratkaisun.
For-silmukoiden tulee olla sisäkkäisiä, jolloin saat tulostumaan mallin mukaisesti
10x10 tähtikuvion:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Probleemassa 1 generoitiin asteriskirivi toistamalla silmukkaa kymmenen kertaa. Tässä tuota silmukkaa pitää toistaa toisessa (ulommaisessa) silmukassa kymmenen kertaa, jolloin haluttu tulos saadaan aikaan. älä katsoa ratkaisua ennen kuin olet 'punnertanut' tehtävän kanssa ainakin 10 minuuttia.
Tästä linkistä voit tarkistaa vastauksen:
ProgramArcadeGames.com/chapters/06_back_to_looping/10x10box.php - Nyt voit koodata toisen samantyyppisen ohjelman, jossa sisäkkäisillä for silmukoilla tulostetaan
5x10 tähtikuvio oheisen mallin mukaisesti:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Tämän probleeman ratkaisu on lähes samanlainen kuin edellisenkin. Huomaat varmasti, miten parametrin arvo vaikuttaa range funktion toimintaan.
Ja tässä on malliratkaisu, johon voit verrata omaa ratkaisuasi:
ProgramArcadeGames.com/chapters/06_back_to_looping/problem_4.php - Koodaa seuraavaksi for silmukoilla (joissa yksi on sisäkkäinen) ohjelma, joka saa aikaiseksi oheisen mallin
mukaisen tulostuksen. Tässä tähtikuvion koko on 20x5:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Tässä ratkaisu on samanlainen kuin probleemassa 3 ja 4, mutta range funktion parametrien arvo on erilainen.
Tässä olisi ratkaisumalli myös tähän tehtävään:
ProgramArcadeGames.com/chapters/06_back_to_looping/problem_5.php - Kirjoita seuraavaksi ohjelma, joka tulostaa seuraavaa:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
Käytä kahta sisäkkäistä silmukkaa. älä siis 'oikaise' kirjoittamalla helpompaa tapaa käyttäen:
print("0 1 2 3 4 5 6 7 8 9")
Vihje: Kirjoita ensin silmukka, jolla saat tulostettua ensimmäisen rivin. Sisällytä tämä ulompaan silmukkaan, joka toistaa tulostuksen kymmenen kertaa. Käytä tässä joko i tai j 'juoksevaa' muuttujaa (tai molempia). Tämä ja seuraava esimerkki valaisevat, miten nämä indeksi muuttujat toimivat.
Mieti ja kokeile konstruoida ratkaisusi ainakin kymmenen minuuttia ennen kuin katsot ratkaisun. Algoritmin (ohjelman) ymmärtäminen on tässä paljon tärkeämpää kuin itse ratkaisun löytyminen.
ProgramArcadeGames.com/chapters/06_back_to_looping/number_square_answer.php - Muuta ohjelmaa sellaiseksi, että nyt saataisiinkin tulostumaan seuraavaa:
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9
Ja tässä ratkaisu:
ProgramArcadeGames.com/chapters/06_back_to_looping/problem_7.php - Seuraava probleemasi on saada tulostumaan lukujonoja seuraavalla tavalla:
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9
Vihje: Tämä on samanlainen kuin probleema 6, mutta nyt sisemmän silmukan toistokerrat ovat erilaiset jokaisella kerralla. älä siis käytä range(10), vaan nyt tarvitaan parametriksi muuttuja, jonka arvoa kasvatetaan toistojen edetessä.
älä tässäkään tehtävässä päästä itseäsi helpolla, vaan yritä löytää ratkaisu. Vertaa omaa ratkaisuasi malliratkaisuun:
ProgramArcadeGames.com/chapters/06_back_to_looping/top_right_triangle.phpVarmista, että osaat ratkaista edellä olleet probleemat. Nämä ovat työläitä, mutta jatkossa säästyt monelta murheelta hallitsemalla silmukat.
-
Osaatko ratkaista seuraavan tulostusongelman:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0
Tämä on melko haastava, mutta ei mahdoton. Vihje: Tässä pitää olla kaksi silmukkaa ulomman silmukan sisällä. Näillä kontrolloidaan kunkin rivin tulostumista. Ensin silmukka tulostaa välilyöntejä ja sitten toinen silmukka tulostaa numeroita. Laita jokaisen rivin tulostaminen silmukkaan. Aluksi voit hahmotella ratkaisua helpommalla ohjelmalla, jossa on vain yksi sisäkkäinen silmukka ja joka tulostaa seuraavaa:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0
Kun saat tuon helpomman version toimimaan, lisää vielä yksi silmukka ulomman silmukan sisään ennen siinä olevaa ensimmäistä sisäsilmukkaa. Käytä tätä uutta sisäsilmukkaa välilyöntien tulostamiseen kunkin rivin alkuun.
Yritä tehdä oma ratkaisusi, äläkä luovuta helpolla. Kun saat oman ohjelmasi tehtyä, voit katsoa malliratkaisun:
ProgramArcadeGames.com/chapters/06_back_to_looping/bottom_left_triangle.php - Kirjoita seuraavaksi ohjelma, joka tulostaa numeroita mallin mukaan.
(Asettelu on haastavaa.):
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
Vihje: Käytä apuna probleeman 1 ratkaisua tulostamiseen. Ensimmäisessä kehitysvaiheessa voisi tulostua:
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27 0 4 8 12 16 20 24 28 32 36 0 5 10 15 20 25 30 35 40 45 0 6 12 18 24 30 36 42 48 54 0 7 14 21 28 35 42 49 56 63 0 8 16 24 32 40 48 56 64 72 0 9 18 27 36 45 54 63 72 81
Muutetaan seuraavaksi koodia niin, että tulostuu:
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
Lopulliseen tulostusasuun päästäksesi, lisää if lause tulostaaksesi välilyönti, jos tulostettava luku on vähemmän kuin 10.
Tee ensin oma ratkaisusi valmiiksi ja voit sitten katsoa malliratkaisun tästä:
ProgramArcadeGames.com/chapters/06_back_to_looping/multiplication_table.php - Seuraava probleemasi on kirjoittaa koodi, joka tulostaa seuraavaa:
1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
Vihje: kirjoita ensin ohjelma, joka tulostaa:
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9
Seuraavaksi muuta koodia niin, että se tulostaa:
1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
Ja lopulliseen versioon pitääkin vain lisätä välilyöntien tulostuminen rivin alkuun.
Omaa ratkaisuasi voit verrata malliratkaisuun:
ProgramArcadeGames.com/chapters/06_back_to_looping/top_triangle.php - Seuraavaksi saat koodata vaativamman tulostusohjelman:
1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1
Tällainen saadaan aikaiseksi yhdistämällä probleemien 11 ja 9 ratkaisut.
älä luovuta heti. Yritä saada aikaiseksi oma ratkaisusi ja katso vasta sitten malliratkaisu:
ProgramArcadeGames.com/chapters/06_back_to_looping/three_quarters.php - Osaatko koodata ohjelman, joka saa aikaan seuraavan tulostuksen:
1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 3 2 1 1 2 3 2 1 1 2 1 1
Pohdi ja kokeile ratkaista tehtävä ja vasta sitten voit katsoa ratkaisumallin:
ProgramArcadeGames.com/chapters/06_back_to_looping/full_diamond.php
6.3 Review
6.3.1 Multiple Choice Quiz
Klikkaa tästä monivalintatehtävään.
6.3.2 Short Answer Worksheet
Klikkaa tästä kappaleen kertaustehtäviin.
6.3.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