Skip to content

Instantly share code, notes, and snippets.

@ivanassen
Last active February 5, 2023 12:43
Show Gist options
  • Save ivanassen/2d4b42e23d7397c57bec905027ce55fe to your computer and use it in GitHub Desktop.
Save ivanassen/2d4b42e23d7397c57bec905027ce55fe to your computer and use it in GitHub Desktop.
C++ projects @ home

Ето няколко идеи за неща, с които да упражняваш уменията си в С++:

  • Advent of Code https://adventofcode.com/

    • Ежегоден комплект от 25 задачи, по една за всеки ден на декември преди Коледа, с нарастваща трудност. Обикновено са тематично свързани, така че има смисъл да се правят подред. Направи първите 10-ина от тази година; ако ти станат твърде трудни, иди да направиш първите 10-ина от минали години. Опитай се да правиш решения, които не просто достигат верния резултат, а са оптимални в някакъв смисъл - сложност на алгоритъма, памет, време за изпълнение, дори количество на кода. Опитай се да пишеш, като че ли ще показваш резултата на интервю за работа - почиствай коментари и временно махнати редове, оформяй добре, измисляй логични и консистентни имена на функции и променливи.
  • елементарни игри, стари и нови:

    • Тетрис - прочети как се генерират случайно парчетата, и си поиграй с user input-а докато докараш "подпъхването", без което не може да се играе на високи скорости (парчето пада и тогава може да се мръдне още няколко пъти)
    • Bejewelled/Candy Crush/Match-3 - без (истински сложната част) как се генерират новите камъчета, които падат отгоре, така че да може да се играе дълго - генерирай ги просто случайни; направи изчезване на 3, 4 и 5 (със поява на специален избухващ камък)
    • Snake
    • Tron На всичките тези се постарай да докараш играта до приятно за игра състояние - контрола да се усеща "като истински". И каквото писах по-горе за качеството на кода!
  • опитай да направиш шах, истински шах в който компютър играе срещу теб. Дори да играе лошо! Трябват ти реализирани

    • правила за движение на фигурите
    • оценъчна функция ("колко е добре положението на тая дъска за белите")
    • и дърво по което да обхождаш възможните 1-2 хода напред, за да намериш кой ход може да те доведе до най-висока (или най-ниска, ако си с черните) стойност на оценъчната функция, ако приемеш че и противника играе оптимално (т.е. когато той е на ход, търси най-добрата в обратна посока.) Има огромен сайт chessprogramming.org, на който стигат до много advanced техники, но предполагам някакво вдъхновение можеш да почерпиш. Как се представя дъската, така че търсенето на възможни ходове да е най-лесно?
  • опитай се да направиш играта Plants vs. Zombies, елементарно подмножество с 3-4 вида растения и 1-2 вида зомбита. Как се дефинират новите видове растения, така че кодът им да е прегледно събран на едно място?

  • всичките тези неща ще искат да рисуваш нещо на екрана; избери някоя графична библиотека и я изучи толкова, че да ти е полезна. Имаш опит със SDL и SFML, но може да опиташ и нещо като sokol или bgfx. Не губи време да ги "обвиваш" в класове, използвай ги директно.

  • ако графиката и математиката ти са интересни, потърси книжката Raytracing in a Weekend (безплатен PDF) и мини през нея - ще напишеш за няколко пъти по няколко часа приличен, макар и елементарен рендерер.

  • ако мрежовото и back-end програмирането са ти интересни, опитай Build Your Own Redis with C/C++ (https://build-your-own.org/redis/) и мини през нея - ще напишеш минимален сървър за база данни по модела на популярния такъв Redis, и по пътя ще научиш какво е socket и как се прехвърлят данни през него.

Всичко това го има на различни парчета в Github, Stackoverflow, а сигурно вече и ChatGPT може да генерира елементи от него с променлив успех - опитай се да не гледаш и да не копираш, а да направиш всичко сам, за да ти бъде максимално полезно.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment