Obvezna naloga

Sprogramiraj (preprost) Človek ne jezi se. Igrali ga bosta dve igralki, Ana in Berta. Obe začneta na polju 1. Nato izmenično mečeta kocko, na kateri so številke od 1 do 6. Zmaga tista, ki prva pride do polja 30 ali čez.

Začne vedno Ana. Ko ena od njiju zmaga, druga ne meče več.

Program naj v vsakem koraku izpiše, katera je vrgla koliko in na katerem polju se je znašla. To dvoje je obvezno (in glej, da bo pravilno). Izpit naj bo videti tako (le da z drugimi številkami):

Ana vrže 5 in je na polju 6
Berta vrže 5 in je na polju 6
Ana vrže 4 in je na polju 10
Berta vrže 4 in je na polju 10
Ana vrže 4 in je na polju 14
Berta vrže 5 in je na polju 15
Ana vrže 6 in je na polju 20
Berta vrže 2 in je na polju 17
Ana vrže 6 in je na polju 26
Berta vrže 2 in je na polju 19
Ana vrže 1 in je na polju 27
Berta vrže 3 in je na polju 22
Ana vrže 4 in je na polju 31
Ana je zmagala

Za metanje kocke uporabljaj klic randint(1, 6), ki vrne celo naključno število med 1 in 6. Da boš lahko klical to funkcijo, na začetek programa napiši from random import *.

Rešitev

Potrebovali bomo dve spremenljivki, ana in berta, ki bosta povedali, na katerem polju je katera od igralk. Slovenščina zapoveduje velike začetnice imen, Python male. Ubogali bomo Python.

Sledila bo zanka, v kateri bo tekla igra. Igra teče, do takrat ko ena od igralk doseže polje 30 ali več, ali, z drugimi besedami dokler sta obe na polju pred tridesetim. Tako torej začnemo z

from random import randint

ana = 1
berta = 1

while ana < 30 and berta < 30:
   ... in tule pride igra

Kaj pa se dogaja v igri? Najprej vrže Ana. Njen met shranimo v spremenljivko met, povečamo ana za met in povemo, koliko je vrgla in kam je prišla.

met = randint(1, 6)
ana += met
print("Ana vrže", met, "in je na polju", ana)

Če je s tem zmagala, je zmagala.

if ana >= 30:
    print("Ana je zmagala")

Sicer ponovimo isto še z Berto.

else:
    met = randint(1, 6)
    berta += met
    print("Berta vrže", met, "in je na polju", berta)
    if berta >= 30:
        print("Berta je zmagala")

In to je to. Celoten program je torej

from random import randint

ana = 1
berta = 1

while ana < 30 and berta < 30:
    met = randint(1, 6)
    ana += met
    print("Ana vrže", met, "in je na polju", ana)

    if ana >= 30:
        print("Ana je zmagala")
    else:
        met = randint(1, 6)
        berta += met
        print("Berta vrže", met, "in je na polju", berta)
        if berta >= 30:
            print("Berta je zmagala")

Dodatna naloga

Dopolni igro: če katera od igralk vrže 6, meče ponovno. Če ponovno vrže 6, meče ponovno ... in tako, kolikorkrat ji uspe vreči 6.

Poleg tega dodaj "žretje": če Ana pride na polje, na katerem stoji Berta, gre Berta nazaj na polje 1. In obratno, seveda.

Izpis naj bo takšen:

Ana vrže 1 in je na polju 2
Berta vrže 6 in je na polju 7
Berta vrže 1 in je na polju 8
Ana vrže 1 in je na polju 3
Berta vrže 3 in je na polju 11
Ana vrže 6 in je na polju 9
Ana vrže 5 in je na polju 14
Berta vrže 3 in je na polju 14
Ana gre na začetek
Ana vrže 3 in je na polju 4
Berta vrže 5 in je na polju 19
Ana vrže 2 in je na polju 6
Berta vrže 5 in je na polju 24
Ana vrže 2 in je na polju 8
Berta vrže 5 in je na polju 29
Ana vrže 3 in je na polju 11
Berta vrže 1 in je na polju 30
Berta je zmagala

Rešitev

Metanje moramo zapreti v zanko:

while met == 6 and ana < 30:
    met = randint(1, 6)
    ana += met
    print("Ana vrže", met, "in je na polju", ana)

Dokler je met enak 6 in Ana še ni prišla do polja 30, ponavljamo met. Prvi met lahko napišemo pred zanko:

met = randint(1, 6)
ana += met
print("Ana vrže", met, "in je na polju", ana)
while met == 6 and ana < 30:
    met = randint(1, 6)
    ana += met
    print("Ana vrže", met, "in je na polju", ana)

ali pa, bolj zvito, se delamo, kot da je pred metanjem vrgla 6, ki pa je nikjer ne prištejemo.

met = 6
while met == 6 and ana < 30:
    met = randint(1, 6)
    ana += met
    print("Ana vrže", met, "in je na polju", ana)

Znotraj zanke poskrbimo še za požiranje Berte:

    if ana == berta:
        print("Berta gre na začetek")
        berta = 1

Natančno isto nato ponovimo še za Berto. Celoten program je torej:

from random import randint

ana = 1
berta = 1

while ana < 30 and berta < 30:
    met = 6
    while met == 6 and ana < 30:
        met = randint(1, 6)
        ana += met
        print("Ana vrže", met, "in je na polju", ana)
        if ana == berta:
            print("Berta gre na začetek")
            berta = 1

    if ana >= 30:
        print("Ana je zmagala")
    else:
        met = 6
        while met == 6 and berta < 30:
            met = randint(1, 6)
            berta += met
            print("Berta vrže", met, "in je na polju", berta)
            if ana == berta:
                print("Ana gre na začetek")
                ana = 1
    if berta >= 30:
        print("Berta je zmagala")

Na predavanjih...

... pa smo sprogramirali še nekoliko drugačno rešitev, ki omogoča še kar preprosto dodajanje novih igralk.

from random import *

ana = berta = cilka = 1
trenutna = "Ana"

while ana < 30 and berta < 30 and cilka < 30:
    met = randint(1, 6)

    if trenutna == "Ana":
        ana += met
        polje = ana
        naslednja = "Berta"
    elif trenutna == "Berta":
        berta += met
        polje = berta
        naslednja = "Cilka"
    elif trenutna == "Cilka":
        cilka += met
        polje = cilka
        naslednja = "Ana"

    print(trenutna, "je vrgla", met, "in je na polju", polje)
    if polje >= 30:
        print(trenutna, "je zmagala")
    if met != 6:
        trenutna = naslednja

trenutna je ime igralke, ki je trenutno na potezi. V začetku zanke vržemo kocko. Nato preverimo, kateri igralki je to potrebno prišteti, ji prištejemo, si zapišemo polje, na katerem je (da bomo to lahko kasneje izpisali) in v naslednja shranimo, kdo bo naslednja igralka. Po tem izpišemo ime igralke, koliko je vrgla in kje je. Povemo, ali je zmagala in - če ni vrgla šestice - nadaljujemo z igralko, ki je naslednja.

Ta rešitev še ni ravno idealna: z dodajanjem novih igralk se daljša seznam if-ov in pogoj v while-u. Poleg tega nismo uredili žretja.

Kako bi napisali program, ki se ne bi daljšal z dodajanjem igralcev? Uporabiti bi morali sezname - natančno to, kar se učimo v naslednjem tednu po tej nalogi.

Čisto dodatna naloga

Ta je za tiste, za katere je običajna dodatna naloga prelahka. Delate jo v lastno veselje in ni potrebna za končno oceno 10. Če oddate rešitev takšne naloge, glejte, da bo pravilno delovalo tudi vse, kar zahtevata obvezna in dodatna naloga.

  • Igra naj šest igralk (Ana, Berta, Cilka, Dani, Ema in Fanči). Izpisi pa naj bodo takšni kot prej (le z več imeni).
  • Kdo meče prvi, naj določi žreb (naključno izberi eno od njih).
  • Igralka ne more zapustiti polja 1, dokler ne vrže šestice. Ko vrže 6, meče ponovno in se premakne za toliko polj, kolikor vrže.
  • Igralka ne sme prečkati polja 30. Če je na polju 28 in vrže več ko 2, se ne premakne.
Zadnja sprememba: nedelja, 2. september 2018, 12.25