# :telescope: Pet-projects

Pet-projects are a great opportunity to gain practical experience while learning a programming language, libraries, and/or frameworks. They can also serve as a launching pad for interviews and help initiate job opportunities.

Finding and selecting the right idea for a pet-project can be challenging. To help overcome this, we've compiled a list of links and ideas to get you started. After reading through this list, you should be able to choose the most appropriate idea or be inspired to create one of your own!


## :arrows_counterclockwise: External links

* [Google Summer of Code](https://summerofcode.withgoogle.com/archive)

A collection of projects is offered by various companies and the community as part of the annual Google student internship program. The archive contains projects from recent years, with a significant number of projects for the C++ language available. You may find something of interest for your own practice or consider trying your hand at future internships.

* [Project based learning - C++](https://github.com/practical-tutorials/project-based-learning#cc)

The repository holds a collection of pet projects for different programming languages, including an extensive list of ideas for C++.

* [Programming challenges](https://programming-challenges.jeremyjaydan.dev/) - [PNG image](https://programming-challenges.jeremyjaydan.dev/media/programming-challenges-v4.0.png)

The Roulette of Ideas for Pet Projects allows you to set the desired complexity level and spin the wheel. The result of the spin will determine the task for you to solve, chosen randomly. :)


## :boom: The list of pet-project ideas

### :arrow_forward: Games

Below is a list of classic video games that don't contain complex AI or dynamic world generation, which can be implemented as a starting point. You can refine additional functionality as you progress. For the graphics library, you can use [SFML](https://www.sfml-dev.org/), which is an easy-to-use library that provides sufficient features for creating simple 2D or 2.5D graphical interfaces using [sprites](https://en.wikipedia.org/wiki/Sprite_(computer_graphics)). If you want to do something more complex with physics applied, you can start with simple engines such as [Box2D](https://box2d.org/) or learn more advanced ones like [Cocos2D](https://www.cocos.com/en/) and [Unreal Engine](https://www.unrealengine.com/en-US/). Remember to follow the rule "from simple to complex" by starting with a simple game and gradually increasing the difficulty.

- [Snake](https://en.wikipedia.org/wiki/Snake_(video_game_genre))
- [Tetris](https://en.wikipedia.org/wiki/Tetris)
- [Game of Life](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life)
- [15 puzzle](https://en.wikipedia.org/wiki/15_puzzle)
- [Arkanoid](https://en.wikipedia.org/wiki/Arkanoid)
- [Minesweeper ](https://en.wikipedia.org/wiki/Minesweeper_(video_game))
- [2048](https://en.wikipedia.org/wiki/2048_(video_game))
- [Solitaire](https://en.wikipedia.org/wiki/Solitaire)
- [Spider Solitaire](https://en.wikipedia.org/wiki/Spider_(solitaire))
- [Ping-pong](https://en.wikipedia.org/wiki/Pong)
- [Donkey Kong](https://en.wikipedia.org/wiki/Donkey_Kong_(video_game))
- [Labyrinth](https://en.wikipedia.org/wiki/Labyrinth:_The_Computer_Game)
- [Network games for 2-4 players: ping-pong, poker, chess, battleships, etc.](https://en.wikipedia.org/wiki/Online_game)

It is recommended to read the following sources that contain more information about various algorithms for gamedev. They can be useful for one of the games mentioned above, or for your own ideas:
- https://www.redblobgames.com/
- http://www.squidi.net/three/


---

### :arrow_forward: Applications

When creating an application, start with the simplest implementation, such as a console application. After each completed step, set a more complex task, such as adding a graphical interface, making the application request data from a source using an HTTP request, and then writing/reading the received data to a file/database, etc. Always follow the principle of "from simple to complex."

Here are some examples of potential projects for beginners:

- A network chat (raw sockets or using [gRPC](https://grpc.io/docs/languages/cpp/quickstart))
- A calculator
- A file manager
- A currency converter
- Retrieving a list of "pull-requests" or "issues" from any Github repository
- Automating routine tasks, such as various calculations and generating reports in the form of tables.

--- 

### :arrow_forward: Student applications

The following examples are more suitable for students who have taken or recently taken basic courses such as linear algebra, analytical geometry, mathematical analysis, physics, etc. Tasks that involve applying the theory they have learned can help them achieve two objectives: consolidate their knowledge through practical application, and practice programming. This path is not restricted to others, but it is easier for students as their knowledge of academic disciplines is still fresh.

- Developing a linear algebra library, which involves working with matrices, vectors, and performing calculations
- Modeling various processes, such as physics and theoretical mechanics
- Implementing numerical methods, including integration, differentiation, approximation, and interpolation

---

[**To main page**](../README.md)
