diff --git a/ACTIVE_TAG_FILES.txt b/ACTIVE_TAG_FILES.txt deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md index b7e92e7..1f63c27 100644 --- a/README.md +++ b/README.md @@ -160,3 +160,7 @@ Points are accumulated as follows: ### Part 3. Bonus. Level mechanics Add level mechanics to the game. Each time a player earns 600 points, the level increases by 1. Increasing the level increases the speed at which the pieces move. The maximum number of levels is 10. + +___ + +Your project will require a code review — don't forget to check out the instructions for conducting and completing a code review on the provided [link](https://applicant.21-school.ru/code_review). diff --git a/README_RUS.md b/README_RUS.md index 66cc823..c15fd37 100644 --- a/README_RUS.md +++ b/README_RUS.md @@ -160,3 +160,7 @@ BrickGame — популярная портативная консоль 90-ых ### Часть 3. Дополнительно. Механика уровней Добавь в игру механику уровней. Каждый раз, когда игрок набирает 600 очков, уровень увеличивается на 1. Повышение уровня увеличивает скорость движения фигур. Максимальное количество уровней — 10. + +___ + +На проекте тебе предстоит пройти код-ревью проверку — не забудь изучить инструкцию для прохождения и проведения код-ревью по [ссылке](https://applicant.21-school.ru/code_review). \ No newline at end of file diff --git a/README_UZB.md b/README_UZB.md index 444b1c9..f6de73a 100644 --- a/README_UZB.md +++ b/README_UZB.md @@ -160,3 +160,7 @@ Ochkolarni hisoblash quyidagi tarzda amalga oshiriladi: ### 3-qism. Qo'shimcha. Darajalar mexanikasi O'yinga darajadagi mexanikani qo'shing. Har safar o'yinchi 600 ochko to'plaganida, daraja 1 ga oshadi. Darajani oshirish shakllar tezligini oshiradi. Maksimal darajalar soni – 10. + +___ + +Loyihada siz kod-revyu tekshiruvidan o‘tishingiz talab etiladi — jarayon va qoidalar bilan [havola](https://applicant.21-school.ru/code_review) orqali tanishib chiqishni unutmang. \ No newline at end of file diff --git a/materials/7 principles of structural programming UZB.md b/materials/7 principles of structural programming UZB.md new file mode 100644 index 0000000..1aaa77e --- /dev/null +++ b/materials/7 principles of structural programming UZB.md @@ -0,0 +1,18 @@ +# STRUKTURALI DASTURLASH TAMOYILLARI + +Strukturali dasturlashning shakllanishi va rivojlanishi Edsger Deykstra nomi bilan bog’liq. +* 1-tamoyil: goto operatoridan foydalanishdan saqlaning. +* 2-tamoyil. Har qanday dastur uchta asosiy boshqaruv tuzilmasidan qurilgan: ketma-ketlik, tarmoqlash, davr. +* 3-tamoyil. Dasturda asosiy boshqaruv tuzilmalari bir-birining ichiga har qanday usulda joylashtirilishi mumkin. Operatsiyalar bajarilishining ketma-ketligini nazorat qilishning boshqa hech qanday vositalari yo’q. +* 4-tamoyil. Takroriy dastur fragmentlari quyi dasturlar (protseduralar va funksiyalar) sifatida formatlanishi mumkin. Xuddi shu tarzda (subprogrammalar ko’rinishida) dasturning mantiqiy integral bo’laklarini hatto ular takrorlanmasa ham tartibga solish mumkin. +* 5-tamoyil. Har bir mantiqiy to'liq ko'rsatmalar guruhi blok sifatida ishlab chiqilishi kerak. Bloklar tuzilgan dasturlashning asosidir. +* 6-tamoyil. Barcha sanab o’tilgan tuzilmalar bitta kirish va bitta chiqishga ega bo’lishi kerak. +* 7-tamoyil. Dasturni ishlab chiqish bosqichma-bosqich, “yuqoridan pastga” usuli yordamida amalga oshiriladi. + +Yuqoridagi printsiplarga xulosalar va qo’shimchalar: + +1. Global o’zgaruvchilardan foydalanishni taqiqlash +2. Bittadan ortiq funktsiyadan chiqish mumkin emas. Istisno - bu funktsiya argumentlarini dastlabki tekshirish. +3. Davrdan bir martadan ortiq chiqish mumkin emas - bu shart yoki break kalit so’zi bo’lishi mumkin +4. Har qanday bloklarning uyasi 4 dan oshmasligi kerak. +5. Funksiyalar hajmi satrlar bilan chegaralangan va 40-50 qatorni tashkil qiladi. diff --git a/materials/instructions_for_testing_uzb.md b/materials/instructions_for_testing_uzb.md new file mode 100644 index 0000000..3c5aaef --- /dev/null +++ b/materials/instructions_for_testing_uzb.md @@ -0,0 +1,72 @@ +# Sinovlarni ishga tushirish bo’yicha ko’rsatmalar + +To’g’ri chiqish ma’lumotlarini sinovdan o’tkazishga qo’shimcha ravishda, ushbu avtotest tizimi dasturing va uning manba kodini quyidagi bandlar bo’yicha tekshiradi: + +* **Uslubiy testlar.** Kodingning go’zalligi standartlarga naqadar mos kelishini tekshirish uchun sen clang-format utiliti yordamida dasturidan foydalanib kodingni sinab ko’rishing mumkin. ```materials/linters``` papkasida uslub testi uchun kerakli sozlamalarni o’z ichiga olgan ```.clang-format``` fayli mavjud. Ushbu konfiguratsiya fayli o’z ta’sirini direktoriyada yoki pastroqdagi direktoriyalarda joylashgan barcha fayllarga qo’llaydi. Shuning uchun, ushbu sozlamalar asosiy koding bo’lgan fayllaringga qo’llanilishi uchun. + ```clang-format``` ```src``` papkasiga nusxala. \ + \ + Uslubni tekshirish uchun quyidagi buyruqni bajar: \ + ```clang-format -n src/sourcefile_name.c``` + + _clang-format_ yuklab olish uchun terminalga quyidagi buyruqlardan birini kirit: \ + ```brew install clang-format``` \ + yoki, agar senda root huquqlari bo’lsa (Ubuntu / Linux Mint / Debian uchun) \ + ```sudo apt install clang-format``` + + Kerakli clang-format versiyasi: \ + **Mac** 18.1.6 \ + **Linux** 18.1.3 + + Google Style: https://google.github.io/styleguide/cppguide.html + +* **Xotiraning to'g'ri ishlashini sinash.** C dasturlarini yozishda xotiraning oqishiga e'tibor berish juda muhimdir. Buning uchun Unix-ga o'xshash operatsion tizimlarda ko'pincha _valgrind_ utilitasi qo'llaniladi. Biroq, OS X da _valgrind_ qo’llab-quvvatlashda muammolar mavjud, shuning uchun uning o’rniga _leaks_ utilitasidan foydalanish mumkin. + + Hozir ushbu utilitalar ishlash mexanizmini ko’rib chiqmaymiz - agar qiziq bo’lda, Googleda o'qishing mumkin. + +**_LEAKS_** + + Ushbu yordamchi dastur yordamida bajariladigan faylni ishga tushirish uchun terminalga kirit: + ```leaks -atExit -- ./main.out | grep LEAK:``` + + ```| grep LEAK:``` buyrug’iga e’tibor ber. Biz uni qisqa chiqish uchun ishlatamiz, shunda biz agar mavjud bo'lsa faqat oqishlar bo’lgan chiziqlarni ko'rishimiz mumkin. Agar sen butun chiqarishni ko’rishni istasang, shunchaki bu buyruqni o’chirib tashla. + + _leaks_ yordamida bajariladigan faylni ishga tushirishda, xatolik to’g’risidagi xabar paydo bo’lishi mumkin: + > dyld: could not load inserted library ‘/usr/local/lib/libLeaksAtExit.dylib’ because image not found + + _leaks_ kutubxonani topa olmaganligi sababli xatolik yuzaga keladi _libLeaksAtExit.dylib_. \ + Bunday holda quyidagi buyruqlarni kiritish kerak: + ```sh + cd /usr/local/lib + sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/lib/libLeaksAtExit.dylib + ``` + + _Qo’shimcha:_ \ + Xotirada oqish borligi maʼlum boʻlgan funksiyalardagi oqib chiqishlarni filtrlash uchun leaks utilitasining ```-exclude``` bayrogʻidan foydalan. Bu bayroq _leaks_ tomonidan berilayotgan ma’lumotlarning oqishini kamaytirish imkonini beradi. + +**_VALGRIND_** + + _valgrind_ kompyuterga o’rnatish uchun quyidagi buyruqlardan birini kirit: \ + ```brew install valgrind``` \ + yoki, agar sizda ildiz huquqlari bo'lsa (Ubuntu / Linux Mint / Debian uchun) \ + ```sudo apt install valgrind``` \ + Ushbu utilita yordamida bajariladigan faylni ishga tushirish uchun terminalga kirit: \ + ```valgrind --tool=memcheck --leak-check=yes ./main.out``` + + OS X da _valgrind_ foydalanish tavsiya etilmaydi, buning o’rniga _leaks_ ishlatish yaxshiroqdir + +* **Qo‘shimcha xotiraning to’g’ri ishlashini tekshirish.** Yana bir variant sifatida xotirani qayta ishlashning to'g'riligini tekshirish va xotira oqishini kuzatish - ```gcc``` ichiga o'rnatilgan AddressSanitizer utilitalaridan foydalanish. Shu o’rinda ta’kidlab o’tamizki, uni leaks yoki ```valgrind``` alohida ishlatish kerak, chunki u kompilyatsiyadan keyin avtomatik ravishda binary faylga o’rnatiladi va ushbu utilitalar bilan mos kelmasligi mumkin. + +Uni kompilyatsiyalash paytida ishlatish uchun ```-fsanitize=address``` bayrog'ini belgilaymiz. + +**Masalan:** + +```gcc -o main main.c -fsanitize=address ``` + +Va yig’ilgan dasturni odatdagi tarzda ishga tushiramiz. Bunday holda, xotira bilan bog’liq xatolar mavjud bo’lsa, ular konsolda ko’rsatiladi. + +```-fsanitize=address``` bayrog'idan tashqari quyidagi bayroqlardan ham foydalanish mumkin: +* ```-fsanitize=leak``` - xotira oqishini kuzatish uchun. Shuningdek, qo’shimcha ravishda leaks yoki valgrind yordamida oqishlarni tekshirishni ham unutma. +* ```-fsanitize=undefined``` - aniqlanmagan dastur harakati joylarini aniqlash uchun (masalan, massiv chegarasidan tashqariga chiqish yoki int’ni haddan tashqari to’lishi). +* ```-fsanitize=unreachable``` - erishib bo'lmaydigan dastur nuqtalarini aniqlash uchun. + +Yanada ko’proq bayroqlarni gcc va AddressSanitizer hujjatlarida topishing mumkin. diff --git a/materials/library-specification_UZB.md b/materials/library-specification_UZB.md new file mode 100644 index 0000000..2b5f4b3 --- /dev/null +++ b/materials/library-specification_UZB.md @@ -0,0 +1,40 @@ +# BrickGame o’yinlar to’plamidan o’yin kutubxonasi uchun spetsifikatsiya + +Bu vazifa BrickGame seriyasidagi birinchi vazifadir. Hammasi bo’lib to’rtta loyiha bo’ladi, ularning har biri o’z o’yini va o’z texnologiyalariga ega. Ammo yangi loyihalarni ishlab chiqishdan tashqari, eski o’yinlarni qo’llab-quvvatlash va eski loyihalarga yangi o’yinlarni qo’llab-quvvatlash kerak bo’ladi. Bu safar interfeys konsol bo’ladi, keyingi safar desktop bo’ladi va hokazo. Eski va yangi o’yinlarni qo’llab-quvvatlash uchun kelajakda topshiriligan loyihalarni qayta yozishga to’g’ri kelmasligi uchun API interfeyslari va kutubxonalari qanday tuzilganligini oldindan hal qilish kerak. + +O’yin maydoni o’nga yigirma hajmidagi matritsa sifatida ifodalanadi. Matritsaning har bir elementi o’yin maydonining “pikseliga” to’g’ri keladi va ikkita holatdan birida bo’lishi mumkin: bo’sh va to’ldirilgan. O’yin maydoniga qo’shimcha ravishda, har bir o’yinda qo’shimcha ma’lumotlar mavjud bo’lib, ular o’yin maydonining o’ng tomonidagi yon panelda ko’rsatiladi. O’yin davomida ishlatilmaydigan qo’shimcha ma’lumotlar uchun joy egalari ko’rsatilishi kerak. + +Har bir o’yin kutubxonasida foydalanuvchi ma’lumotlarini qabul qiladigan funksiya bo’lishi kerak. Konsolda sakkizta jismoniy tugma mavjud: o’yinni boshlash, to’xtatib turish, o’yinni tugatish, harakat va to’rtta strelka. + +`userInput` funksiyasi kirish sifatida foydalanuvchi `action` harakatini va klavishni bosib ushlab turish uchun javob beradigan qo’shimcha `hold` parametrni oladi. + +`updateCurrentState` funksiyasi interfeysda ko’rsatish uchun ma’lumotlarni olish uchun mo’ljallangan. U o’yinning joriy holati haqida ma’lumotni o’z ichiga olgan tuzilmani qaytaradi. Masalan, tetris uchun taymerning tugashi shaklning bir qator pastga siljishiga olib keladi. Interfeysni yangilab turish uchun ushbu funktsiyani interfeysdan ma’lum vaqt oralig’ida chaqirish kerak. + +```c +typedef enum { + Start, + Pause, + Terminate, + Left, + Right, + Up, + Down, + Action +} UserAction_t; + +typedef struct { + int **field; + int **next; + int score; + int high_score; + int level; + int speed; + int pause; +} GameInfo_t; + +void userInput(UserAction_t action, bool hold); + +GameInfo_t updateCurrentState(); +``` + +E’tibor bering, `GameInfo_t` o’yinining joriy holati haqidagi ma’lumot o’yin kutubxonasi ichida statistik obyekt bilan ifodalanishi mumkin. \ No newline at end of file