Reimplementarea unui joc clasic, într-o manieră neclasică. Dacă deschideai jocul ăsta pe Windows XP pentru că-ți pica netu' și nu mai aveai cum să joci CS 1.6 cu prietenii, de data asta s-ar putea să-ți reziliezi abonamentul la Digi pentru că-ți vei da seama că e singurul joc și prieten de care ai nevoie.
Nu ești un simplu individ care încearcă să descopere minele de pe tablă. Acum, lupți împotrivă unui mediu ostil — jocul ăsta nu vrea să câștigi. Folosește-ți abilitățile pentru a învinge.
- Reimplementarea jocului original
- Dificultate personalizată: număr de mine, dimensiune, etc.
- Niveluri de dificultate prestabilite
- Leaderboard cu scorurile obținute
- Salvarea și vizualizarea în timp real a gameplay-urilor precedente
- Dificultăți suplimentare
- Celule care necesită mai multe click-uri (sau un anumit CPM atins pentru o durată de timp) pentru a fi descoperite
- Din momentul în care poziția unei mine poate fi dedusă, jucătorul are un timp determinat pentru a o marca, altfel jocul este pierdut
- Pătratele deja descoperite pot redeveni ascunse
- Stegulețele plasate pot dispărea
- Fereastra jocului devine oglindită, rotită, sau începe să se mute la întâmplare pe ecran
- Luminozitatea ferestrei scade substanțial, îngreunând vizibilitatea jocului
- Câteva cifre sunt corupte pentru un timp determinat și cifrele indicate nu mai pot fi citite
- Ultimele de mai sus au loc când jocul se apropie de final, când nu există progres din partea jucătorului, dar și la întâmplare
- Dacă nu există progres din partea jucătorului, timpul începe să se scurgă mai repede (doar în modul Contra-timp)
- Abilități ajutătoare
- Anulează toate efectele de mai sus pentru un timp determinat
- Descoperă un pătrat ales fără a muri, chiar dacă acolo se află o mină (NU ai două vieți în sens global)
- Descoperă pozițiile tuturor minelor pentru un timp foarte scurt
- Îngheață contorul pentru un timp nedeterminat, dar nu mai ai voie să interacționezi cu tabla (doar în modul Contra-timp)
- Crește dimensiunea zonei pe care o poți vedea pentru un timp determinat (doar în modul Telescop)
- Moduri de joc
- Clasic
- Contra-timp: timp limită în care să rezolvi jocul
- Telescop: poți vedea, permanent, doar o zonă de 3x3, pe care o poți naviga
- Tutorial
Și altele, în funcție de ideile ce-or mai veni pe parcurs.
- Nume proiect (poate fi schimbat ulterior)
- Scurtă descriere a temei alese, ce v-ați propus să implementați
- definirea a minim 3-4 clase folosind compunere cu clasele definite de voi; moștenirile nu se iau în considerare aici
- constructori de inițializare cu parametri pentru fiecare clasă
- pentru o aceeași (singură) clasă: constructor de copiere,
operator=de copiere, destructor
-
operator<<pentru toate clasele pentru afișare (std::ostream) folosind compunere de apeluri cuoperator<< - cât mai multe
const(unde este cazul) și funcțiiprivate - implementarea a minim 3 funcții membru publice pentru funcționalități netriviale specifice temei alese, dintre care cel puțin 1-2 funcții mai complexe
- nu doar citiri/afișări sau adăugat/șters elemente într-un/dintr-un vector
- scenariu de utilizare cu sens a claselor definite:
- crearea de obiecte și apelarea tuturor funcțiilor membru publice în main
- vor fi adăugate în fișierul
tastatura.txtDOAR exemple de date de intrare de la tastatură (dacă există); dacă aveți nevoie de date din fișiere, creați alte fișiere separat
- minim 52-60% din codul propriu să fie C++,
.gitattributesconfigurat corect - tag de
git: de exempluv0.1 - serviciu de integrare continuă (CI) cu toate bifele; exemplu: GitHub Actions
- code review #1 2 proiecte
- separarea codului din clase în
.h(sau.hpp) și.cpp - moșteniri:
- minim o clasă de bază și 3 clase derivate din aceeași ierarhie; cele 3 derivate moștenesc aceeași clasă de bază
- ierarhia trebuie să fie cu bază proprie, nu derivată dintr-o clasă predefinită
- funcții virtuale (pure) apelate prin pointeri de bază din clasa care conține atributul de tip pointer de bază
- minim o funcție virtuală va fi specifică temei (i.e. nu simple citiri/afișări sau preluate din biblioteci i.e. draw/update/render)
- constructori virtuali (clone): sunt necesari, dar nu se consideră funcții specifice temei
- afișare virtuală, interfață non-virtuală
- apelarea constructorului din clasa de bază din constructori din derivate
- clasă cu atribut de tip pointer la o clasă de bază cu derivate; aici apelați funcțiile virtuale prin pointer de bază, eventual prin interfața non-virtuală din bază
- suprascris cc/op= pentru copieri/atribuiri corecte, copy and swap
-
dynamic_cast/std::dynamic_pointer_castpentru downcast cu sens - smart pointers (recomandat, opțional)
- excepții
- ierarhie proprie cu baza
std::exceptionsau derivată dinstd::exception; minim 3 clase pentru erori specifice distincte- clasele de excepții trebuie să trateze categorii de erori distincte (exemplu de erori echivalente: citire fișiere cu diverse extensii)
- utilizare cu sens: de exemplu,
throwîn constructor (sau funcție care întoarce un obiect),try/catchînmain - această ierarhie va fi complet independentă de ierarhia cu funcții virtuale
- ierarhie proprie cu baza
- funcții și atribute
static - STL
- cât mai multe
const - funcții de nivel înalt, de eliminat cât mai mulți getters/setters/funcții low-level
- minim 75-78% din codul propriu să fie C++
- la sfârșit: commit separat cu adăugarea unei noi clase derivate fără a modifica restul codului, pe lângă cele 3 derivate deja adăugate din aceeași ierarhie
- noua derivată nu poate fi una existentă care a fost ștearsă și adăugată din nou
- noua derivată va fi integrată în codul existent (adică va fi folosită, nu adăugată doar ca să fie)
- tag de
gitpe commit cu toate bifele: de exempluv0.2 - code review #2 2 proiecte
- 2 șabloane de proiectare (design patterns)
- o clasă șablon cu sens; minim 2 instanțieri
- preferabil și o funcție șablon (template) cu sens; minim 2 instanțieri
- minim 80-90% din codul propriu să fie C++
- tag de
gitpe commit cu toate bifele: de exempluv0.3sauv1.0 - code review #3 2 proiecte
Proiectul este configurat cu CMake.
Instrucțiuni pentru terminal:
- Biblioteci necesare pe Linux (ar trebui să meargă pe sisteme bazate pe Debian/Arch/Fedora/OpenSUSE, necesită
sudo)
bash ./scripts/install-sfml-deps.shDacă lipsesc și alte biblioteci, ștergeți folder-ul de build de la pasul 1 și reconfigurați proiectul după ce ați instalat ce lipsea.
- Pasul de configurare
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
# sau ./scripts/cmake.sh configureSau pe Windows cu GCC folosind Git Bash:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -G Ninja
# sau ./scripts/cmake.sh configure -g NinjaPentru a configura cu ASan, avem opțiunea -DUSE_ASAN=ON (nu merge pe Windows cu GCC):
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DUSE_ASAN=ON
# sau ./scripts/cmake.sh configure -e "-DUSE_ASAN=ON"La acest pas putem cere să generăm fișiere de proiect pentru diverse medii de lucru.
- Pasul de compilare
cmake --build build --config Debug --parallel 6
# sau ./scripts/cmake.sh buildCu opțiunea parallel specificăm numărul de fișiere compilate în paralel.
- Pasul de instalare (opțional)
cmake --install build --config Debug --prefix install_dir
# sau ./scripts/cmake.sh installVezi și scripts/cmake.sh.
Observație: folderele build/ și install_dir/ sunt adăugate în fișierul .gitignore deoarece
conțin fișiere generate și nu ne ajută să le versionăm.
Există mai multe variante:
- Din directorul de build (implicit
build). Executabilul se află la locația./build/oopdupă ce a fost rulat pasul de compilare al proiectului (./scripts/cmake.sh build- pasul 2 de mai sus).
./build/oop- Din directorul
install_dir. Executabilul se află la locația./install_dir/bin/oopdupă ce a fost rulat pasul de instalare (./scripts/cmake.sh install- pasul 3 de mai sus).
./install_dir/bin/oop- Rularea programului folosind Valgrind se poate face executând script-ul
./scripts/run_valgrind.shdin rădăcina proiectului. Pe Windows acest script se poate rula folosind WSL (Windows Subsystem for Linux). Valgrind se poate rula în modul interactiv folosind:RUN_INTERACTIVE=true ./scripts/run_valgrind.sh
Implicit, nu se rulează interactiv, iar datele pentru std::cin sunt preluate din fișierul tastatura.txt.
RUN_INTERACTIVE=true ./scripts/run_valgrind.sh
# sau
./scripts/run_valgrind.sh- Pentru a rula executabilul folosind ASan, este nevoie ca la pasul de configurare (vezi mai sus) să fie activat acest sanitizer. Ar trebui să meargă pe macOS și Linux. Pentru Windows, ar merge doar cu MSVC (nerecomandat).
Comanda este aceeași ca la pasul 1 sau 2. Nu merge combinat cu Valgrind.
./build/oop
# sau
./install_dir/bin/oopThe project is licensed under AGPLv3.
The template repository itself is licensed under Unlicense.
- SFML (Zlib)
- TGUI
- TGUI Dark Theme