Ponavljanje
U prošlom članku smo radili na osnovnom programu koji baca kockice umjesto nas. Prije nego što krenemo s novim zadatkom, idemo se prisjetiti koji nam je bio posljednji zadatak iz prošlog članka i vidjeti kako ga napraviti.
Možete li sada dodati da se na početku, uz broj kockica, upiše i broj igrača i da se onda kockice bace za sve igrače? Mala pomoć, opet ćemo morati koristiti for petlju, ali pitanje je gdje i kako.
Slijedi rješenje…
Ne čini se baš tako jednostavno, zar ne? 🙂
Idemo zajedno proći neke dijelove pa ćemo vidjeti da zapravo nije strašno.
from random import randint
najmanja_vrijednost = 1 # najmanje vrijednost na kockici
najveca_vrijednost = 6 # najveca vrijednost na kockici
bacaj = "da" # zelimo li baciti
broj_igraca = int(input("Unesi broj igraca:"))
broj_kockica = int(input("Unesi broj kockica potrebnih za igru:"))
Prvo, učitamo funkciju randint iz Pythona. To je gotova funkcija koja nam daje nasumičan broj između dvije vrijednosti koje joj pošaljemo. Zatim, definiramo varijable na temelju najmanje i najveće moguće vrijednosti koje se mogu dobiti na kockici. Osim toga, imamo i varijablu koja nam prati trebamo li bacati kockicu i nju na početku uvijek stavimo na da. Na kraju, ostaje nam pitati korisnika da unese broj igrača koji će sudjelovati u igri i broj kockica potrebnih za igru.
Prije nego krenemo dalje, idemo razmisliti i pokušati neke sitnice u gotovom programu.
Što bi se dogodilo ako bismo staviti varijablu bacaj=”ne” na početku?
Što bi se dogodilo kada bismo umjesto broja igrača ili kockica upisali neko slovo? Bi li došlo do greške?
Sada dolazimo do najtežeg dijela, ali idemo polako i vidjet ćete da nije tako strašno kako se čini na prvu. Kada imamo više for petlji i k tome još i while petlje, najbolje je krenuti od vanjske i dobro razumjeti što ona radi.
# Za svakog igraca u igri...
for igrac in range(1, broj_igraca + 1):
# Bacanje kockica
# Igrac je zavrsio s bacanjem, idemo na sljedeceg.
print ("Igrac " + str(igrac) + " je zavrsio s bacanjem.")
bacaj = "da" # ponovno zelimo vratiti na da tako da sljedeci igrac moze bacati
Nama je vanjska petlja ona koja ide po igračima. Za svakog igrača bacamo kockice dok god on ne kaže da više ne želi, i onda kažemo da je igrač završio s bacanjem, a varijablu bacaj postavljamo na da kako bi nam sljedeći igrač mogao baciti kockice. Možete vidjeti da smo cijeli jedan dio koda zamijenili s komentarom #Bacanje kockica, to nam pomaže da bolje vidimo što se događa u kodu i razumijemo for petlju koja ide po igračima.
Zašto u for petlji stavimo range(1, broj_igraca + 1) ? Kako bi program radio ako stavimo samo range(broj_igraca) ?
Zadnji korak nam je umjesto komentara ubaciti pravi kod koji će bacati kockice. To smo radili prošli puta i možete se podsjetiti u prošlom članku ako se ne sjećate kako smo došli do rješenja. Naravno, ako imate kakvih pitanja, uvijek se možete javiti pa ćemo uskočiti i pomoći. 🙂
Macao
Sada smo spremni za programiranje naše prve igre s kockicama. Igra se zove Macao i potječe iz grada Macao u Kini! Grad je poznat po turizmu i kockanju, a bio je kolonija Portugala sve do 1999. godine.
Pravila
Igra se igra s jednom kockicom, a može igrati proizvoljan broj igrača. Međutim, najčešće igra između 3 i 6 igrača pa ćemo tako i mi programirati našu igru.
Svaki igrač baca kockicu koliko god puta želi i cilj je da zbroj svih bacanja bude što bliži broju 9. Igrač sam odlučuje kada želi stati s bacanjima. Ako zbroj bude veći od 9, igrač ispada iz igre, a ako bude točno 9 odmah pobjeđuje (postoje i druge verzije igre, ali mi ćemo raditi verziju gdje broj 9 odmah pobjeđuje).
Sada dolazimo do najtežeg dijela igre. U slučaju da na kraju kruga više igrača ima isti zbroj, ti igrači nastavljaju s bacanjem i opet pokušavaju doći što bliže broju 9. S obzirom da već imamo mnogo posla oko ove igre, malo ćemo promijeniti pravila da nam bude lakše za početak. Nama će pravilo biti da, ako više igrača ima isti broj na kraju kruga, pobjeđuje onaj koji je prvi dobio taj broj.
Kao što ćete vidjeti u ovoj jednostavnoj igri, kada radimo na ovakvim programima, morat ćemo paziti i razmišljati o mnogo stvari.
Program
U nastavku se nalazi kostur našeg programa. Sastoji od osam zadataka koji se na prvu čine izmješani, ali vidjet ćete zašto je tako. Dodatno, napisane su funkcije s komentarima u kojima se nalaze najvažnije informacije o njima – ulazni argumenti, izlaz i što funkcija radi. Znak “”” tekst””” u Pythonu označava komentar koji ide kroz nekoliko linija. Znači da na početku stavimo “”” i dok god ponovno ne napišemo “”” sve se broji kao komentar. Za početak, pročitajte sve što sada piše u kodu redom i pokušajte razmisliti kako bi program izgledao. Nakon što vidite kako izgleda kostur programa, krenut ćemo na prvi zadatak.
Svaki zadatak ćemo rješavati ispod njegovog komentara u prozoru ispod. Na primjer, ako rješavamo 2. zadatak, pronađemo gdje se nalazi u kodu i odmah ispod komentara krenemo s rješavanjem.
Zadatak 1.
Pronađite gdje se u kodu nalazi komentar s 1. zadatkom i razmislite kako biste to mogli napraviti. Jedno od mogućih rješenja je koristeći while petlju. Za one koji ne znaju što je while petlja, pokazat ćemo na jednostavnom primjeru.
Na početku, napravimo varijablu broj koju postavimo na 1. Ako doslovno prevedemo while s engleskog na hrvatski, to znači dok. Dok je broj manji od 5, printaj mi broj i povećaj ga za 1. Pokušajte kopirati kod na code.stemalica pa testirajte. To znači da uz while imamo neki uvjet i dok god je taj uvjet zadovoljen, tj. dok god je istinit, sve što se nalazi u našoj while petlji će se izvršavati.
broj = 1
while broj < 5:
print(broj)
broj = broj + 1
U našem zadatku, broj igrača mora biti između 3 i 6. Dok god je broj_igraca manji od 3 ili veći od 6, moramo pitati korisnika da opet unese broj. Uvjet nam se sastoji od dva dijela – broj_igraca < 3 ILI broj_igraca > 6. Pokušajte sami rješiti, a ako vam bude trebala pomoć, otvorite POMOĆ ispod ovog teksta. Nakon što napravite prvi zadatak, testirajte! Pokušaje upisivati različite brojeve da vidite radi li vaš program kako treba.
while broj_igraca < 3 or broj_igraca > 6:
broj_igraca = int(input("Neispravan broj igraca. Unesi novi broj igraca:"))
Zadatak 2.
Ponovno, pronađite gdje se nalazi komentar s drugim zadatkom i ispod njega pišite rješenje. Moramo napraviti novu listu koja će sadržavati rezultate svih igrača. Kolika je duljina liste?
rezultati_igraca = [0] * broj_igraca
Zadatak 3.
Treći zadatak već djelomično znamo jer smo u prošlom članku i u ponavljanju ovog članka radili na programu koji baca kockice. Razlika je što sada bacamo jednu kockicu i moramo zbrajati rezultate svakog bacanja pa na kraju vratiti zbroj svih bacanja.
Kako početi? Uvijek od jednostavnijeg zadatka. Prvo, idemo napraviti kod koji će bacati kockicu dok igrač to želi i svaki puta povećati zbroj rezultata za broj koji smo dobili. Kada igrač završi s bacanjem, potrebno je ispisati njegov zbroj rezultata i vratiti iz funkcije zbroj_rezultata kao što stoji u opisu funkcije.
Drugi dio naše funkcije koji ćemo dodati je provjera koliki je trenutni zbroj_rezultata nakon svakog bacanja. Ako igrač nakon jednog od bacanja ima zbroj veći ili jednak 9, znači da je igra za njega gotova i nema više pravo na bacanje. To znači da nekako moramo izaći iz while petlje ako se to dogodi.
Rješenje riječima je: “Ako je zbroj_rezultata veći ili jednak 9, izađi iz petlje.” Za izlaženje iz petlje se koristi naredba break. Ako ju niste do sada koristili, slobodno pogledajte u pomoć za drugi dio i vidjet ćete da je zapravo vrlo jednostavno.
Kada završite s ovim zadatkom, testirajte kako radi funkcija. Krenite odmah na 4. zadatak koji će nam riješiti poziv funkcije preko kojeg ćemo testirati je li sve u redu.
bacaj = "da" # dok god zelimo bacati, mora biti jednako da
zbroj_rezultata = 0 # zbroj rezultata je 0 u pocetku
print ("Igrac " + str(igrac) + " baca...")
# Dok zelimo dalje bacati
while bacaj == "da":
rezultat_bacanja = randint(1, 6) # rezultat s kockice
zbroj_rezultata = zbroj_rezultata + rezultat_bacanja # dodamo novi rezultat na trenutni zbroj
print ("Dobio je " + str(rezultat_bacanja) + " i zbroj je sada " + str(zbroj_rezultata))
bacaj = input("Hoćemo li ponovno bacati?") # pitamo hoce li igrac opet bacati
# Kada igrac zavrsi s bacanjem, ispisemo koliki mu je zbroj i vracamo zbroj_rezultata
print ("Igrac " + str(igrac) + " je zavrsio s bacanjem i ima zbroj " + str(zbroj_rezultata))
return zbroj_rezultata
print ("Dobio je " + str(rezultat_bacanja) + " i zbroj je sada " + str(zbroj_rezultata))
if(zbroj_rezultata >= 9):
break
bacaj = input("Hoćemo li ponovno bacati?")
Zadatak 4.
Ispod komentara za 4. zadatak, pokušajte napisati rješenje. Potrebno je samo pozvati funkciju i poslati joj neki broj, a rezultat spremiti u novu varijablu.
zbroj_igraca = bacanje_kockice(igrac)
Zadatak 5.
Ako želimo da se za svakog igrača pozove funkcija bacanja kockice, pomoću čega bismo to napravili? Tako je, pomoću for petlje. Ponovno, pišemo rješenje odmah ispod komentara u kojem je opisan 5. zadatak. Pokušajte sami, a ako ne uspijete, imate pomoć.
# Zadatak 5. Dodaj bacanje kockice za svakog igraca - od prvog do zadnjeg.
for igrac in range(1, broj_igraca + 1):
# Zadatak 4. Potrebno je pozvati funkciju bacanje_kockice i rezultat spremiti u novu varijablu zbroj_igraca.
zbroj_igraca = bacanje_kockice(igrac)
Budući da smo već puno toga napravili i sigurno ste se umorili, ovdje ćemo stati s člankom pa ćemo nastaviti s igrom u sljedećem. Ostalo nam je još pronaći pobjednika.
Ako imate bilo kakvih pitanja, slobodno ostavite u komentarima ili se javite preko kontaktnog obrasca.