Programmeerimine keeles C++
Praktikum 6: Programmeerimisharjutus – Bingo Loto
Üldised tingimused
Tähtis! Loe läbi ülesannete vormistamise tingimused aine veebilehelt! Ülesandeid esitatakse läbi aine veebilehel asuva vormi. E-posti teel lahendusi vastu ei võeta. Küsimustega pöörduda aine listi või praktikumijuhendaja poole.
Lahendamiseks on aega 14 päeva.
Tähtaeg: 01.05.2022 23:59:59
Üldised nõuded
Selle praktikumi tööna peate arendama programmi, millega saaks mängida Bingo Lotot. Ülesanded on nähtavad allpool, aga erinev teistest praksidest on see, et aluskoodi olemas ei ole. Kasutage eelnevate praktikumide kaustastruktuure ning täiendage Makefile vastavalt. Kui kasutate Qt'd, siis kasutage Qt projektistruktuuri.
Lahenduskäik jääb täielikult Teie otsustada. Võite kasutada kõike, mida olete õppinud, ja saate veel vabadest materjalidest juurde õppida. Kirjutage ülesande kirjeldusele vastav programm, kasutades programmeerimiskeelt C++. Kui kasutate lisaraamistikke, siis paigutage nad programmikoodiga kaasa, et ka juhendajal oleks võimalik Teie programmi oma arvutis jooksutada.
Märkus: Arendusel pidage meeles häid arendustavasid, mida oleme õppinud (kommentaarid, mäluhaldus, negatiivsuse kontrollid). Kuna igaüks lahendab ülesande erinevalt ja omamoodi, siis hindame lahendusi ka veidike üldisemalt.
Näide pseudokoodist testrakenduses:
Bingo bingopilet = {}; // Luuakse uus Bingo objekt ning genereeritakse 5x5 korrektne mängulaud. bingopilet.loosiNumbrid(); // Genereeritakse võidunumbrid vastavale piletile. std::cout << "Võidunumbrid: " << bingopilet.voiduNumbrid() << std::endl; // Kuvatakse võidunumbrid std::cout << bingopilet << std::endl; // Kuvatakse mängulaud (ostream) std::cout << "Nurkademäng: " << bingopilet.nurkadeMang() << std::endl; // Kas nurkademäng? (T/F) std::cout << "Diagonaalidemäng: " << bingopilet.diagonaalideMang() << std::endl; // Kas diagonaalidemäng? (T/F) std::cout << "Täismäng: " << bingopilet.taisMang() << std::endl; // Kas täismäng? (T/F)
Märkus: Esitamisel looge testrakendus või taaskasutage eelmiste praktikumide oma ja demoge eelnevat funktsionaalsust. Funktsiooninimesid, kuvamisjärjekorda ja strateegiat võite kõike muuta, tähtis on, et sisu jõuaks kasutajani. Qt puhul panen programmi käima ja graafiline liides võiks olla kasutajasõbralik.
Ülesanne 1 – Üldine struktuur (2 punkti)
Looge andmestruktuur (näiteks class Bingo
), mis hoiab ühte Bingo piletit. Klass peaks hoidma igasuguseid muutujaid (mängulaud, võidunumbrid, abimuutujad, suurus jne) ja vajaminevaid funktsioone (konstruktor/destruktor/ostream). Bingo mängulaud peab olema väljundvoogu prinditav või muud moodi kuvatav (Qt's aken).
Looge testrakendus, milles saate testida Bingo funktsionaalsuse toimimist ja lõpus ka programmi tööd demoda. Testrakenduse võiks ehitada ja käivitada käsk make test
nagu eelmistes praksides. Qt puhul pole testrakendus vajalik.
Märkus: Mängulaua suuruseks võime fikseerida 5x5 ruutmaatriksi.
Ülesanne 2 – Mängulaua genereerimine (3 punkti)
Koostada funktsioon genereeriManguLaud
, mis võiks võtta argumendiks näiteks laua suuruse (5) ning looks 5x5 ruutmaatriksi, milles iga element on täisarv lõigust 1 – 75, ning hoiustab selle Bingo klassi. Kõik vastavalt Bingo Loto reeglitele. Seda funktsiooni saate konstruktoris kasutada. Seega kui Bingo klass luuakse, genereerib konstruktor automaatselt korrektse 5x5 Bingo Loto väljaku ning hoiustab selle Bingo klassi.
Et tegu oleks korrektse Bingo Loto mänguväljaga, peavad vasakpoolseimas veerus olevad arvud kuuluma lõiku 1 – 15, järgmises veerus olevad arvud lõiku 16 – 30 ja nii edasi, kuni viimases veerus on ainult arvud lõigust 61 – 75. Lihtsuse mõttes võib ülesandes eeldada, et kõik antud tabeli arvud on unikaalsed ehk ükski arv ei esine tabelis rohkem kui üks kord. Huvi korral proovige kontrollida ka arvude unikaalsust, et ei peetaks korrektseks tabelit, mis on muidu reeglitele vastav, aga milles on kaks ühesugust arvu.
Näited õigest ja valest Bingo tabelist (Python):
>>> on_bingo_tabel([[1, 30, 34, 55, 75], [10, 16, 40, 50, 67], [5, 20, 38, 48, 61], [4, 26, 43, 49, 70], [15, 17, 33, 51, 66]]) True >>> on_bingo_tabel([[1, 30, 34, 55, 76], [10, 16, 40, 50, 67], [5, 20, 38, 48, 61], [4, 26, 43, 49, 70], [15, 17, 33, 51, 66]]) False
Lahendamisel võite vajadusel inspiratsiooni ammutada abistavast videost.
Ülesanne 3 – Võidunumbrite loosimine (2 punkti)
Luua Bingo klassile funktsionaalsus loosida välja võidunumbrid funktsiooniväljakutsega. Näiteks funktsioon bingolaud.loosiNumbrid()
genereerib ning hoiustab võidunumbrid sobivasse andmestruktuuri. Võidunumbreid peaks olema võimalik jällegi kasutajale kuvada.
Õigeid Bingo Loto reegleid numbrite loosimisel me siin järgida ei saa, seega loosime numbrid järgnevalt:
Genereerige pseudojuhust kasutades 35 võidunumbrit vahemikus 1–75
Ülesanne 4 – Kas oleme võitnud? (3 punkti)
Nüüd on olemas kõik eeldused selleks, et luua kolm funktsiooni:
- bool nurkadeMang() – kontrollib, kas pilet võitis nurkademängu;
- bool diagonaalideMang() – kontrollib, kas pilet võitis diagonaalidemängu;
- bool taisMang() – kontrollib, kas pilet võitis täismängu.
Funktsioonid tagastavad tõeväärtuse vastavalt sellele, kas eelnevalt juhuslikult loositud võidunumbrid täitsid mänguväljal nurkade-, diagonaalide- või täismängu.
Lisaülesanne 5 – Lotokolmapäev (1 lisapunkt)
Hetkel „elab” iga Bingo Loto pilet oma elu. Tegelikult genereeritakse Bingo Lotos ju ühed võidunumbrid tuhandete piletite peale. Looge klassihierarhia, kus Bingo Loto peaklass hõlmab hoopis tervet mängu, millel on sarnaselt eelnevale ülesandele üks või mitu Bingo piletit. Looge peaklassi meetodid, mis võimaldavad mängule genereerida näiteks 100 piletit, ja meetodid, mis suudavad kontrollida, kas nende piletite seas oli võitjaid.
Vihjeid
- C++ pseudojuhuslikkus – https://www.cplusplus.com/reference/cstdlib/rand/
- Looge abifunktsioon, mis tagastab unikaalse arvujada mingis vahemikus (a,b) suurusega c.