{"id":20748283,"url":"https://github.com/mtrajk/worldofgames","last_synced_at":"2026-05-09T07:32:39.708Z","repository":{"id":16916330,"uuid":"19677624","full_name":"MTrajK/WorldOfGames","owner":"MTrajK","description":"Windows Forms application composed of 5 small and popular games","archived":false,"fork":false,"pushed_at":"2019-09-07T11:05:13.000Z","size":919,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-12-26T19:35:41.420Z","etag":null,"topics":["2048","csharp","flappy-bird","game","minesweeper","snake","tetris","windows","winforms"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MTrajK.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-05-11T21:16:28.000Z","updated_at":"2023-01-21T19:51:53.000Z","dependencies_parsed_at":"2022-07-18T08:14:13.946Z","dependency_job_id":null,"html_url":"https://github.com/MTrajK/WorldOfGames","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MTrajK/WorldOfGames","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MTrajK%2FWorldOfGames","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MTrajK%2FWorldOfGames/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MTrajK%2FWorldOfGames/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MTrajK%2FWorldOfGames/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MTrajK","download_url":"https://codeload.github.com/MTrajK/WorldOfGames/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MTrajK%2FWorldOfGames/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32811340,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2048","csharp","flappy-bird","game","minesweeper","snake","tetris","windows","winforms"],"created_at":"2024-11-17T08:16:17.337Z","updated_at":"2026-05-09T07:32:39.692Z","avatar_url":"https://github.com/MTrajK.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# World Of Games\n\n**_[Преземи ја апликацијата (само за Windows OS)](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/dist/World%20Of%20Games.exe)_**\n\n\n\n\n# 1. Краток опис на апликацијата\n\n\nЦелта на овој проект беше да се создаде Windows Form апликација составена од неколку од најпопуларните мали игри.\n\nСо оваа апликација се опфатени три од \"историски\" најпопуларните игри (_стари преку 30 години_), кои иако се толку стари сè уште го привлекуваат вниманието на играчот: **_[Minesweeper](#23-minesweeper)_**, **_[Snake](#24-snake)_**, **_[Tetris](#25-tetris)_**.\n\nИсто така и двете најпоуларни игри во денешницата (_помалку од една година стари_), за кои нема потреба многу да се објаснува бидејќи нема човек кој што не ги играл: **_[2048](#21-2048)_**, **_[Flappy Bird](#22-flappy-bird)_**.\n\nЗаедничко за сите игри е тоа што имаат серилизација (_се чуваат најдобрите резултати посебно за секоја од петте игри_).\n\n![alt text](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/images/world_of_games.png \"Start Window\")\n\n\n\n\n## 2. Опис на игрите\n\n\n### 2.1 2048\n\nЦелта на ***[2048](https://en.wikipedia.org/wiki/2048_(video_game))*** е со помош на соединување на блоковите со бројки да се стигне до блокот 2048.\n\nОваа игра е идеја на [Gabriele Cirulli](https://github.com/gabrielecirulli) и е многу популарна на паметните телефони со повеќе верзии од кои најпревземаната е со околу 50 милиони превземања.\n\nДва блока можат да се соединат само доколку содржат ист број и притоа доколку меѓу нив нема друг блок, истите можат да се соединат во 4-те правци.\n\nДоколку се соединат два блока се добива еден блок кој има вредност еднаква на збирот на двата блока (_ако се соединат 2 и 2 ќе се добие 4, 4+4=8 итн_).\n\nПри секој нов потег се додава блок 2 или 4 (_4 се додава со помала веројатност_) на некоја од празните позиции.\n\nБлоковите се движаат со помош на 4-те копчиња со стрелки: горе (**↑**), десно (**→**), доле (**↓**) и лево (**←**).\n\nВо оваа верзија на 2048 додадени се две нови работи:\n\n* Играта не завршува кога ќе се добие блокот 2048, продолжува понатаму се додека има уште валидни потези.\n\n* И доколку за 3 секунди не се направи потег се додава нов блок.\n\n![alt text](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/images/2048.png \"2048\")\n\n**_[Преземи ја само 2048 (само за Windows OS)](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/dist/2048.exe)_**\n\n---\n\n### 2.2 Flappy Bird\n\n***[Flappy Bird](https://en.wikipedia.org/wiki/Flappy_Bird)*** е едноставна игричка во која играчот управува со птица.\n\nИсто така и оваа игра е многу популарна на паметните телефони. Нејзиниот сопственит пред некое време ја тргна од маркетите, но и покрај тоа оваа игра доби многу други верзии кои се превземени над 100 милиони пати.\n\nЦелта е при скокање да не се удри птицата во некој од столбовите или да не падне на земја.\n\nДоколку удри во некој столб или падне птицата на земја играта завршува.\n\nПтицата скока (_полетува_) со помош на копчето со стрелката горе (**↑**).\n\nВо оваа верзија на Flappy Bird нема некакви промени, концептот е ист како оргиналната игра.\n\n![alt text](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/images/flappy_bird.png \"Flappy Bird\")\n\n**_[Преземи ја само Flappy Bird (само за Windows OS)](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/dist/FlappyBird.exe)_**\n\n---\n\n### 2.3 Minesweeper\n\n***[Minesweeper](https://en.wikipedia.org/wiki/Minesweeper_(video_game))*** е играта од која што беа \"заразени\" скоро сите корисници на OS Windows. Бидејќи кај постарите верзии на Windows кога ќе се инсталираше оперативниот систем се инсталираше и оваа игра.\n\nКонцептот на играта е едноставен. Треба да се откријат каде се поставени 15-те мини и за таа цел во секое поле е испишана бројка која што означува со колку мини е опкружено тоа поле.\n\nДоколку се сомневам во некое поле дека има мина, тогаш тоа поле го маркирам со десен клик (_не можам да го отворам тоа поле се додека не стиснам повторно десен клик на маусот_).\n\nИграта завршува доколку \"нагазам\" на мина или пак доколку ги откријам сите 15 мини.\n\nИ играта се игра со помош на маусот. Лево копче за отварање поле и десно копче за маркирање (_ставање знаменце_) на поле.\n\n![alt text](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/images/minesweeper.png \"Minesweeper\")\n\n**_[Преземи ја само Minesweeper (само за Windows OS)](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/dist/Minesweeper.exe)_**\n\n---\n\n### 2.4 Snake\n\nИако ***[Snake](https://en.wikipedia.org/wiki/Snake_(video_game))*** е многу стара нашата генерација се запозна со оваа игра кога искочија првите мобилни телефони на Nokia каде што самата игра беше вградена.\n\nИграта преставува една структура која најмногу наликува на змија и се однесува како змија (_колку повеќе јаде, толку поголема станува_).\n\nЦелта на играта е да се \"изедат\" (_соберат_) што е можно повеќе форми.\n\nСекоја форма се разликува по бојата и секоја боја носи различни бодови (_што повеќе бодови носи тоа со помала веројатност се појавува_):\n* Црвена форма: 5 бода\n* Жолта форма: 10 бода\n* Портокалова форма: 15 бода\n* Кафеава форма: 20 бода\n* А сината форма не дава бодови туку го скратува телото на змијата за 50% и се појавува со ептен мала веројатност.\n\nНа секои 150 поени се зголемува брзината на змијата за 10%.\n\nИграта завршува кога ќе се судри змијата со своето тело или пак кога ќе се судри со некој ѕид (_горе, десно, доле, лево_).\n\nПравецот на змијата се задава со помош на 4-те копчиња со стрелки: горе (**↑**), десно (**→**), доле (**↓**) и лево (**←**).\n\n![alt text](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/images/snake.png \"Snake\")\n\n**_[Преземи ја само Snake (само за Windows OS)](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/dist/Snake.exe)_**\n\n---\n\n### 2.5 Tetris\n\n***[Tetris](https://en.wikipedia.org/wiki/Tetris)*** е една од игрите која се популаризира со помош на [нинтендото](https://en.wikipedia.org/wiki/Nintendo).\n\nИграта се состои од 7 форми (_сите составени од по 4 блока_) кои паѓаат од врвот кон дното.\n\nВо оваа верзија е имплементиран [оргиналниот алгоритам](https://upload.wikimedia.org/wikipedia/commons/0/0d/Tetris_gravity_%28simple%29.png) кој што е имплементиран во првата верзија на тетрис од русинот [Alexey Pajitnov](https://en.wikipedia.org/wiki/Alexey_Pajitnov). Оргиналната верзија се разликува од [модерната верзија](https://upload.wikimedia.org/wikipedia/commons/1/1b/Tetris_gravity_%28natural%29.png) во тоа што ако се поништи некој ред и доколку има дупка формите не ја пополнуваат дупката туку само се спуштаат во поништениот ред.\n\nНа секои 500 добиени поени се зголемува брзината на паѓање за 10%.\n\nИграта завршува доколку се пополни средното поле и при тоа не може да се појави нова форма.\n\nИграта се игра со помош на 4-те копчиња со стрелки. Со копчето горе (**↑**) се врти формата, со копчињата десно (**→**) и лево (**←**) се поместува формата на соодветната страна и со копчето доле (**↓**) се забрзува падот на формата.\n\n![alt text](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/images/tetris.png \"Tetris\")\n\n**_[Преземи ја само Tetris (само за Windows OS)](https://raw.githubusercontent.com/MTrajK/WorldOfGames/master/dist/Tetris.exe)_**\n\n\n\n\n## 3. Опис на метод\n\nСите класи во оваа апликација се поделени во региони за подобра прегледност на кодот.\n\nИсто така над секоја класа, секој метод и некои од глобалните променливи има објаснувања (_резиме-summary_) со што би се олеснила прегледноста кога би го гледал кодот некој што не бил вклучен во проектот.\n\nОваа апликација има многу интересни методи исто така и интересни алгоритми. Кога би издвоиле некои тоа би биле:\n\n* Мрдањето на блоковите во играта **_[2048](#21-2048)_** (_кое е решено на два различни начини, исто така во кодот е оставен и стариот алгоритам како коментар и објаснување за разликите и комплексностите на двата алгоритми_).\n* Отварањето на полињата во играта **_[Minesweeper](#23-minesweeper)_**, кое на прв поглед би се чинело много сложено, но се решава на едноставен начин со помош на *[BFS (Breadth-first search)](https://en.wikipedia.org/wiki/Breadth-first_search)*.\n* И како најинтересен метод би го издвоиле вртењето на формите во играта **_[Tetris](#25-tetris)_** чии што проблем е решен со помош на апстрактна класа, бидејќи има 7 различни форми, а тие 7 форми имаат некои различни и некои сосема исти методи. Во продолжение подетално за овој метод.\n\n#### Класата _[Forma.cs](https://github.com/MTrajK/WorldOfGames/blob/master/src/WorldOfGames/Forma.cs)_ и методите `public abstract List\u003cPoint\u003e Vrti()` и `public List\u003cPoint\u003e Pomesti(int Pravec)`\n\n```c#\n    abstract class Forma\n    {\n        public Color Boja;\n        public List\u003cPoint\u003e Koordinati;\n        public List\u003cPoint\u003e Proverka;\n        public int Pozicija;\n        public int ProverkaPoz;\n        public bool SmeniPoz;       // ova go koristam za da znam koga da ja smenam pozicijata\n                                    // zosto odkako ke ja svrtam i ne e validna ke se napravi cekor nadole i ke se smeni pozicijata, a ne treba\n\n        /// \u003csummary\u003e\n        /// Оваа метода е статична за да можам без креирање класа да ја повикувам.\n        /// \u003c/summary\u003e\n        /// \u003cparam name=\"Broj\"\u003e Рандом бројот според која ја креирам формата. \u003c/param\u003e\n        /// \u003creturns\u003e Враќа нова истанца од наследената форма. \u003c/returns\u003e\n        public static Forma Odberi(int Broj)\n        {\n            if (Broj == 0)\n                return new Forma1();\n            if (Broj == 1)\n                return new Forma2();\n            if (Broj == 2)\n                return new Forma3();\n            if (Broj == 3)\n                return new Forma4();\n            if (Broj == 4)\n                return new Forma5();\n            if (Broj == 5)\n                return new Forma6();\n            return new Forma7();\n        }\n\n        /// \u003csummary\u003e\n        /// Овој метод служи за да се добие наредната состојба со поместување на формата.\n        /// \u003c/summary\u003e\n        /// \u003cparam name=\"Pravec\"\u003e0- за надоле, 1- за лево, 2- за десно. \u003c/param\u003e\n        /// \u003creturns\u003e Враќа листа со координати на поместувањето. \u003c/returns\u003e\n        public List\u003cPoint\u003e Pomesti(int Pravec)\n        {\n            Proverka = new List\u003cPoint\u003e();\n            int x = 0;\n            int y = 0;\n\n            if (Pravec == 0)\n                y++;\n            else if (Pravec == 1)\n                x--;\n            else if (Pravec == 2)\n                x++;\n\n            foreach (Point p in Koordinati)\n                Proverka.Add(new Point(p.X + x, p.Y + y));\n\n            SmeniPoz = false;\n\n            return Proverka;\n        }\n\n        /// \u003csummary\u003e\n        /// Овој метод служи за да се добие наредната состојба со вртење на формата.\n        /// \u003c/summary\u003e\n        /// \u003creturns\u003e Враќа листа со координати на поместувањето. \u003c/returns\u003e\n        public abstract List\u003cPoint\u003e Vrti();\n\n        /// \u003csummary\u003e\n        /// Овој метод се повикува кога новодобиените координати се валидни и финалните координати треба да ја добијат вредноста на пробните и финалната позиција да ја добие позицијата од проверката.\n        /// \u003c/summary\u003e\n        public void Smeni()\n        {\n            Koordinati = new List\u003cPoint\u003e();\n\n            foreach (Point p in Proverka)\n                Koordinati.Add(p);\n\n            if (SmeniPoz)\n                Pozicija = ProverkaPoz;\n               \n        }\n```\n\nСекоја форма е составена од 4 блока, затоа за секоја форма се чува листа од 4 точки кои ги означуваат моменталните позиции на формата, дополнително се чува и една листа која ги означува идните позиции на формата (_бидејќи доколку се мрдне формата не значи дека ќе биде валидна позицијата, може да се судри со ѕид или пак со некој друг блок_).\n\nЗа таа цел се чува за секоја форма дополнителна променлива bool која означува дали е валидна променливата.\n\nИсто така се чуваат и една променлива за да се знае која е бојата на формата и една променлива за моменталната позиција на формата (_колку пати е свртена од почетната позиција_).\n\nВо оваа класа има и еден статичен метод со чија помош креирам нова инстанца на форма `public static Forma Odberi(int Broj)` како аргумент го прима редниот број на формата.\n\nЗа сите 7 форми поместувањето лево, десно и доле е исто, затоа има само еден метод во super класата преку која се мењаат сите форми `public List\u003cPoint\u003e Pomesti(int Pravec)`. Доколку некоја форма се мрда лево, тогаш се намалува X координатата на сите 4 форми за еден, доколку се мрда десно тогаш X координатата на сите 4 форми се намалува за еден и доколку се мрда надоле Y координатите се зголемуваат за еден (_бидејќи координатниот систем во програмските јазици е обратен во поглед на Y оската во однос на математичката Y оска_).\n\nИ доколку поместената форма е валидна (_поместена лево, десно, доле или пак свретена_) преку методот `public void Smeni()` се мењаат старите координати со новите.\n\nИ за на крај методот `public List\u003cPoint\u003e Vrti()` е различен во сите  7 форми бидејќи секоја форма на свој начин се врти.\n\n**_Еве пример од вртењето на долгнавестото._**\n\n```c#\n        public override List\u003cPoint\u003e Vrti()\n        {\n            Proverka = new List\u003cPoint\u003e();\n            \n            if (Pozicija == 0)\n            {\n                ProverkaPoz = 1;\n                Proverka.Add(new Point(Koordinati[0].X + 2, Koordinati[0].Y - 1));\n                Proverka.Add(new Point(Koordinati[1].X + 1, Koordinati[1].Y));\n                Proverka.Add(new Point(Koordinati[2].X, Koordinati[2].Y + 1));\n                Proverka.Add(new Point(Koordinati[3].X - 1, Koordinati[3].Y + 2));\n            }\n            else if (Pozicija == 1)\n            {\n                ProverkaPoz = 2;\n                Proverka.Add(new Point(Koordinati[0].X - 2, Koordinati[0].Y + 2));\n                Proverka.Add(new Point(Koordinati[1].X - 1, Koordinati[1].Y + 1));\n                Proverka.Add(new Point(Koordinati[2].X, Koordinati[2].Y));\n                Proverka.Add(new Point(Koordinati[3].X + 1, Koordinati[3].Y - 1));\n            }\n            else if (Pozicija == 2)\n            {\n                ProverkaPoz = 3;\n                Proverka.Add(new Point(Koordinati[0].X + 1, Koordinati[0].Y - 2));\n                Proverka.Add(new Point(Koordinati[1].X, Koordinati[1].Y - 1));\n                Proverka.Add(new Point(Koordinati[2].X - 1, Koordinati[2].Y));\n                Proverka.Add(new Point(Koordinati[3].X - 2, Koordinati[3].Y + 1));\n            }\n            else\n            {\n                ProverkaPoz = 0;\n                Proverka.Add(new Point(Koordinati[0].X - 1, Koordinati[0].Y + 1));\n                Proverka.Add(new Point(Koordinati[1].X, Koordinati[1].Y));\n                Proverka.Add(new Point(Koordinati[2].X + 1, Koordinati[2].Y - 1));\n                Proverka.Add(new Point(Koordinati[3].X + 2, Koordinati[3].Y - 2));\n            }\n\n            SmeniPoz = true;\n\n            return Proverka;\n        }\n```\n\nЗависно од која позиција е (_колку пати е свртена формата_) формата се местат координатите на 4-те блока. Формата никогаш не се врти околу еден блок, бидејќи не би било рамномерно движењето, за таа цел при секое вртење се мењаат координатите на блоковите на различен начин.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtrajk%2Fworldofgames","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmtrajk%2Fworldofgames","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtrajk%2Fworldofgames/lists"}