Arcade-pelien ohjelmointi
Pythonilla ja Pygamella

Chapter 6: Takaisin silmukoiden pariin

fig.nested_loops

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

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

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

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

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

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

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

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

  8. 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.php

    Varmista, että osaat ratkaista edellä olleet probleemat. Nämä ovat työläitä, mutta jatkossa säästyt monelta murheelta hallitsemalla silmukat.

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

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

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

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

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