Решение на Време е да помислите за проектите си! от Александър Сариков

Обратно към всички решения

Към профила на Александър Сариков

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

"""
[Title/Звание]
Tower Defense игра "Maze Rush" (с уговорката, че за момента името е placeholder)
[Description/Обрисовка]
С едно изречение – 2D top-down игра тип Tower Defense с малко RTS елементи, която демонстрира приложението на pathfinding алгоритъм за "по-умно" поведение.
Играта е силно вдъхновена от стари модове в Warcraft 3 и ще представлява сравнително опростен вариант на тях.
Links for reference:
https://youtu.be/xbwvGm7yU-c?t=335
https://youtu.be/qBAYLFpBjk8?t=243
Сходна като идея съвременна игра - https://play.google.com/store/apps/details?id=com.mobile.defense.gears&hl=en&gl=US
Първо малко за жанрът tower defense(TD), без да навлизам в подробности - целта е да се защитят териториите или притежанията на играча чрез възпрепятстване на вражеските нападатели или чрез спиране на враговете да достигнат до изходите, което обикновено се постига чрез поставяне на защитни структури около или по пътя им на атака.
Основната разлика между класическият TD, и това което аз искам да разработя е, че цялото игрално поле ще се разбие на плочици(tiles), като върху всеки tile потребителят може да поставя структури/постройки. Пътят, по който нападателите минават, за да стигнат до целта не е предефиниран. Той ще се изчислява според постройките върху игралното поле. Можем да си представим игралното поле, като това на шах, като ако върху определена позиция има фигура, то тогава тя е окупирана и нападателите трябва да я заобикалят. Върху всеки tile играчът може да построява структура(в повечето случаи това е кула, от където идва и наименованието Tower Defense) стига да не блокира всички възможни пътища на нападателите до целта или с други думи - трябва да има поне един валиден път от началото(spawn point) до целта(goal point). За определяне на минимален път ще използвам pathfinding алгоритъм(първоначално ще е BFS, а след като имплементирам препятствия, ще го модифицирам до алг. на Дийкстра). Всяка кула ще може да изстрелва снаряд(projectile) по нападател, като има различни видове снаряди – например: едни ще се движат преследвайки целта си(homing); други ще се изстрелват в посока и ще преминават през всичко по пътя си(piercing); трети може да се движат по някоя интересна математическа крива; и т.н. Основната цел е потребителят да оцелее n на брой вълни(wave) от нападатели и така печели играта. На всеки wave се появява нова група нападатели, като всеки нападател(условно ще го наричам unit) ще си има свои характеристики – бързина, health points, currency on kill и др. Играчът използва събраното currency, за да се построяват нови структури или да се подобряват текущите. Ако unit стигне до целта потребителят губи животи, а ако изхаби всичките играта завършва.
Смятам че темата е лесно разширяема т.е. ако функционалностите по-долу не са достатъчно, мога да добавям още.
[Functionalities/Надарености]
Основни:
1. Програмата зарежда структурата на текущото ниво от файл.
2. Програмата записва и актуализира информация за притежавани от играча характеристики - брой животи, currency и други.
3. Програмата ще обновява следното:
- текущата позиция на всяка активна структура.
- текущата позиция на всеки нападател.
- текущата позиция на всеки снаряд.
- HUD с актуална информация за състоянието на играта
4. На всеки кадър програмата ще визуализира следното:
- всички (спрайтове на) плочици. (Tе формират и целия background.)
- всички (спрайтове на) структури.
- всички (спрайтове на) нападатели.
- всички (спрайтове на) снаряди.
- интерактивни UI елементи в обособен HUD, които позволяват избирането на структура за построяване, продаване на избрана структура, подобряване(upgrade) на структура и др.
5. Потребителят може да си взаимодейства с:
- структура, като се визуализира индикатор за обхват около нея, както и опции за действия.
- бутони в HUD-a на потребителския интерфейс.
6. Потребителят може да стартира следващия wave (ако има такъв) през интерактивния интерфейс.
7. Програмата изчислява и маркира минималния път от началото (unit spawn-point) до целта, при стартиране на всеки wave, както и при построяване/продаване на структура.
8. Потребителят може да избира структури(Structure) - кули(Tower), аури(Aura), препятствия(Obstacle).
9. Потребителят може да поставя избрана структура на свободна позиция върху игралното поле(кулата ще snap-ва върху най-близкия tile) използвайки своето currency.
10. Програмата прилага характеристиките за всяка кула – обхват, скорост на атака, damage, нов спрайт и др.
11. На всеки кадър, програмата премества нападател(unit) по пътя му до целта.
12. На всеки кадър, програмата обръща (завърта спрайта на) unit в посоката към която се движи, ако е необходимо.
13. Програмата следи за unit, който е стигнал до целта си, и ако това се случи бива премахнат и животите на играча намаляват.
14. Програмата ще записва информация за всички ефекти върху състоянието(status effect) на unit, като:
- намаляване на скоростта на придвижване(slow),
- увеличаване на скоростта на придвижване,
- damage-over-time,
- health regeneration;
15. Програмата ще предоставя възможност за прилагане на всички status effect върху характеристиките на unit за определено време.
16. Програмата ще актуализира текущата посока на кула чрез ротация към unit. Тя ще се определя в зависимост от характеристика на кулата – режим на насочване.
17. Програмата ще поддържа два режима за насочване(и стреляне) на кула – "близост" и "първи". При режим "близост" се избира най-близкият unit до кулата, в обхвата й. При режим "първи" избира unit най-близък до целта си, който е все още в обхвата на кулата.
18. Потребителят може да превключва режима на насочване на избрана кула през потребителския интерфейс.
19. На всеки кадър, програмата премества projectile по пътя му до целта.
20. Програмата ще поддържа два режима на движение на projectile – "следене" и "посока". При режим "следене", projectile постоянно актуализира пътя си отчитайки новата позиция на unit. При режим "посока" - отчита посоката спрямо позицията на unit в момента на изстрелване и продължава да мести projectile в същата посока, преминавайки през всички unit-и по пътя си.
21. Програмата ще актуализира текущата посока на projectile чрез ротация към unit, към който е насочен, или посоката, в която е изстрелян.
22. Програмата ще следи за колизии между hitbox(нямам намерение да се опитам да го преведа на български) на unit и projectile и ще действа по определен начин:
- нанася щети(damage). Ако unit-a все още има точки живот, ще визуализира поле, което представя съотношение между текущия брой точки живот върху целия (с други думи - health bar).
- ако след пресмятане на нанесените щети, unit няма повече точки живот, то той бива премахнат, а играчът получава currency.
- ако режимът на движение е "следене" - нанася щети само на целта по която е изстрелян.
- ако режимът на движение е "посока" - нанася щети на всички unit-и по пътя си.
23. При поставяне на структура от тип аура, програмата увеличава ефективността на други кули в нейния обхват.
24. При поставяне на структура от тип препятствие, програмата маркира плочицата, върху която се намира структурата, така че да блокира или увеличава тежестта за преминаване на unit по пътя, след изчисления на pathfinding алгоритъма, и/или прилага ефект върху състоянието на преминаващи unit-и.
25. При зареждане на нивото, програмата избира произволни (но валидни - несъседни) позиции за spawn point и цел на unit-ите.
26. При зареждане на нивото, програмата поставя препятствия на произволни (но валидни, така че да има път) позиции след зареждане на нивото.
27. Потребителят може да премахва структура от избрана позиция, като ако структурата е била от тип кула или аура – получава част от сумата за построяването ѝ обратно. Ако е от тип препятствие – трябва да изхарчи определена сума, за да я премахне.
28. При премахване на постройка програмата връща плочицата, над която се е намирала постройката, в първоначалното ѝ състояние.
Опционални(неконкретизирани):
1. Програмата изчислява по-умно (чрез по-сложна евристика и A* алгоритъм) пътя на нападателите. (Евристиката може да се изчислява според това колко кули с какъв damage и attack speed има в близост на текущия tile.)
2. Програмата ще поддържа повече режими на насочване.
3. Програмата ще поддържа повече типове projectile – AoE около кула, AoE on impact и т.н.
4. Програмата ще поддържа повече status effect-и
5. Програмата ще поддържа повече типове структури
6. Програмата ще избира произволни плочици преди началото на всеки wave, с определени бонуси.
7. Unit, който се движи по друг начин – например летящ и използва друг метод да определя пътя си.
8. Endless wave mode? Score?
9. "Bouncy" projectile – physics based
10. Multiplayer? (Все още обмислям добър начин как да вкарам multiplayer. Но ако ще добавям networking в проекта, по-скоро да е нещо от сорта на това да зареждам daily level от уеб сървър отколкото multiplayer.)
[Milestones/Възлови точки]
1. Прозорец - размери, настройки, game loop.
2. Четене на информация от файл. Навързване на информацията за дизайнът на нивото с файлове тип изображения(sprites) и зареждането им в обекти.
3. Ниво. Генериране на ниво.
4. Взаимодействие с прозореца. Поставяне на обекти по екрана.
5. Кула. Създаване и премахване на структура от тип „Кула“.
6. Нападатели - units. Движение на обекти по екрана.
7. Геометрия на структури.
8. Обхват на кули, hitbox и health bar на unit, както и тяхното визуализиране.
9. Pathfinding алгоритъм.
10. Предвижване на unit по изчислен за него минимален път. Визуализиране и актуализиране на намерен минимален път върху игралното поле.
11. Режими на насочване и стреляне на кули. Tracking.
12. Projectile. Типове и колизии.
13. Характеристики на играча, и тяхното прилагане към съществуващите системи.
14. Upgrade на структури. Актуализиране на характеристики на структури.
15. Аури. Интегриране на структура от тип „Аура“.
16. Статус ефекти върху unit и структури.
17. HUD – бутони и информация.
18. Препятствия. Интегриране на структура от тип „Препятствие“.
19. Условия за победа/загуба. Unit waves.
20. Дизайн на ниво, unit-и, структури. Балансиране на характеристиките им.
[Estimate in man-hours/Времеоценка в човекочасове]
Предполагам, че за около 100 часа бих имал имплементирани всички основни функционалности, от списъка по-горе, плюс тестове. Ако все още има време до защитата ще продължа с имплементация на опционалните функционалности, евентуално по-добре изглеждащ интерфейс, vfx/sfx, меню екран и други подобрения. Относно спрайтовете, намерих няколко пакета за общо ползване, които смятам, че ще са ми достатъчни да направя играта да изглежда задоволително.
[Usage of technologies/Потребление на технологии]
- pygame
- numpy
- Евентуално модули с по-оптимизирани структури за стек и опашка (макар че вградената deque би трябвало да ми свърши работа). Може би heapq за опашка с приоритет.
- вградени модули – random, sys, os, asyncio, collections и т.н.
- ако стигна до имплементация на networking – http/web socket модул
"""
### P.S. Искам да се извиня за супер странното описание, просто ми е изключително трудно да дефинирам игрови термини на български език.

История (1 версия и 1 коментар)

Александър обнови решението на 16.12.2022 13:11 (преди над 1 година)

+"""
+[Title/Звание]
+Tower Defense игра "Maze Rush" (с уговорката, че за момента името е placeholder)
+
+[Description/Обрисовка]
+С едно изречение – 2D top-down игра тип Tower Defense с малко RTS елементи, която демонстрира приложението на pathfinding алгоритъм за "по-умно" поведение.
+
+Играта е силно вдъхновена от стари модове в Warcraft 3 и ще представлява сравнително опростен вариант на тях.
+Links for reference:
+https://youtu.be/xbwvGm7yU-c?t=335
+https://youtu.be/qBAYLFpBjk8?t=243
+Сходна като идея съвременна игра - https://play.google.com/store/apps/details?id=com.mobile.defense.gears&hl=en&gl=US
+
+Първо малко за жанрът tower defense(TD), без да навлизам в подробности - целта е да се защитят териториите или притежанията на играча чрез възпрепятстване на вражеските нападатели или чрез спиране на враговете да достигнат до изходите, което обикновено се постига чрез поставяне на защитни структури около или по пътя им на атака.
+
+Основната разлика между класическият TD, и това което аз искам да разработя е, че цялото игрално поле ще се разбие на плочици(tiles), като върху всеки tile потребителят може да поставя структури/постройки. Пътят, по който нападателите минават, за да стигнат до целта не е предефиниран. Той ще се изчислява според постройките върху игралното поле. Можем да си представим игралното поле, като това на шах, като ако върху определена позиция има фигура, то тогава тя е окупирана и нападателите трябва да я заобикалят. Върху всеки tile играчът може да построява структура(в повечето случаи това е кула, от където идва и наименованието Tower Defense) стига да не блокира всички възможни пътища на нападателите до целта или с други думи - трябва да има поне един валиден път от началото(spawn point) до целта(goal point). За определяне на минимален път ще използвам pathfinding алгоритъм(първоначално ще е BFS, а след като имплементирам препятствия, ще го модифицирам до алг. на Дийкстра). Всяка кула ще може да изстрелва снаряд(projectile) по нападател, като има различни видове снаряди – например: едни ще се движат преследвайки целта си(homing); други ще се изстрелват в посока и ще преминават през всичко по пътя си(piercing); трети може да се движат по някоя интересна математическа крива; и т.н. Основната цел е потребителят да оцелее n на брой вълни(wave) от нападатели и така печели играта. На всеки wave се появява нова група нападатели, като всеки нападател(условно ще го наричам unit) ще си има свои характеристики – бързина, health points, currency on kill и др. Играчът използва събраното currency, за да се построяват нови структури или да се подобряват текущите. Ако unit стигне до целта потребителят губи животи, а ако изхаби всичките играта завършва.
+
+Смятам че темата е лесно разширяема т.е. ако функционалностите по-долу не са достатъчно, мога да добавям още.
+
+
+[Functionalities/Надарености]
+Основни:
+1. Програмата зарежда структурата на текущото ниво от файл.
+2. Програмата записва и актуализира информация за притежавани от играча характеристики - брой животи, currency и други.
+3. Програмата ще обновява следното:
+ - текущата позиция на всяка активна структура.
+ - текущата позиция на всеки нападател.
+ - текущата позиция на всеки снаряд.
+ - HUD с актуална информация за състоянието на играта
+4. На всеки кадър програмата ще визуализира следното:
+ - всички (спрайтове на) плочици. (Tе формират и целия background.)
+ - всички (спрайтове на) структури.
+ - всички (спрайтове на) нападатели.
+ - всички (спрайтове на) снаряди.
+ - интерактивни UI елементи в обособен HUD, които позволяват избирането на структура за построяване, продаване на избрана структура, подобряване(upgrade) на структура и др.
+5. Потребителят може да си взаимодейства с:
+ - структура, като се визуализира индикатор за обхват около нея, както и опции за действия.
+ - бутони в HUD-a на потребителския интерфейс.
+6. Потребителят може да стартира следващия wave (ако има такъв) през интерактивния интерфейс.
+7. Програмата изчислява и маркира минималния път от началото (unit spawn-point) до целта, при стартиране на всеки wave, както и при построяване/продаване на структура.
+8. Потребителят може да избира структури(Structure) - кули(Tower), аури(Aura), препятствия(Obstacle).
+9. Потребителят може да поставя избрана структура на свободна позиция върху игралното поле(кулата ще snap-ва върху най-близкия tile) използвайки своето currency.
+10. Програмата прилага характеристиките за всяка кула – обхват, скорост на атака, damage, нов спрайт и др.
+11. На всеки кадър, програмата премества нападател(unit) по пътя му до целта.
+12. На всеки кадър, програмата обръща (завърта спрайта на) unit в посоката към която се движи, ако е необходимо.
+13. Програмата следи за unit, който е стигнал до целта си, и ако това се случи бива премахнат и животите на играча намаляват.
+14. Програмата ще записва информация за всички ефекти върху състоянието(status effect) на unit, като:
+ - намаляване на скоростта на придвижване(slow),
+ - увеличаване на скоростта на придвижване,
+ - damage-over-time,
+ - health regeneration;
+15. Програмата ще предоставя възможност за прилагане на всички status effect върху характеристиките на unit за определено време.
+16. Програмата ще актуализира текущата посока на кула чрез ротация към unit. Тя ще се определя в зависимост от характеристика на кулата – режим на насочване.
+17. Програмата ще поддържа два режима за насочване(и стреляне) на кула – "близост" и "първи". При режим "близост" се избира най-близкият unit до кулата, в обхвата й. При режим "първи" избира unit най-близък до целта си, който е все още в обхвата на кулата.
+18. Потребителят може да превключва режима на насочване на избрана кула през потребителския интерфейс.
+19. На всеки кадър, програмата премества projectile по пътя му до целта.
+20. Програмата ще поддържа два режима на движение на projectile – "следене" и "посока". При режим "следене", projectile постоянно актуализира пътя си отчитайки новата позиция на unit. При режим "посока" - отчита посоката спрямо позицията на unit в момента на изстрелване и продължава да мести projectile в същата посока, преминавайки през всички unit-и по пътя си.
+21. Програмата ще актуализира текущата посока на projectile чрез ротация към unit, към който е насочен, или посоката, в която е изстрелян.
+22. Програмата ще следи за колизии между hitbox(нямам намерение да се опитам да го преведа на български) на unit и projectile и ще действа по определен начин:
+ - нанася щети(damage). Ако unit-a все още има точки живот, ще визуализира поле, което представя съотношение между текущия брой точки живот върху целия (с други думи - health bar).
+ - ако след пресмятане на нанесените щети, unit няма повече точки живот, то той бива премахнат, а играчът получава currency.
+ - ако режимът на движение е "следене" - нанася щети само на целта по която е изстрелян.
+ - ако режимът на движение е "посока" - нанася щети на всички unit-и по пътя си.
+23. При поставяне на структура от тип аура, програмата увеличава ефективността на други кули в нейния обхват.
+24. При поставяне на структура от тип препятствие, програмата маркира плочицата, върху която се намира структурата, така че да блокира или увеличава тежестта за преминаване на unit по пътя, след изчисления на pathfinding алгоритъма, и/или прилага ефект върху състоянието на преминаващи unit-и.
+25. При зареждане на нивото, програмата избира произволни (но валидни - несъседни) позиции за spawn point и цел на unit-ите.
+26. При зареждане на нивото, програмата поставя препятствия на произволни (но валидни, така че да има път) позиции след зареждане на нивото.
+27. Потребителят може да премахва структура от избрана позиция, като ако структурата е била от тип кула или аура – получава част от сумата за построяването ѝ обратно. Ако е от тип препятствие – трябва да изхарчи определена сума, за да я премахне.
+28. При премахване на постройка програмата връща плочицата, над която се е намирала постройката, в първоначалното ѝ състояние.
+
+
+Опционални(неконкретизирани):
+1. Програмата изчислява по-умно (чрез по-сложна евристика и A* алгоритъм) пътя на нападателите. (Евристиката може да се изчислява според това колко кули с какъв damage и attack speed има в близост на текущия tile.)
+2. Програмата ще поддържа повече режими на насочване.
+3. Програмата ще поддържа повече типове projectile – AoE около кула, AoE on impact и т.н.
+4. Програмата ще поддържа повече status effect-и
+5. Програмата ще поддържа повече типове структури
+6. Програмата ще избира произволни плочици преди началото на всеки wave, с определени бонуси.
+7. Unit, който се движи по друг начин – например летящ и използва друг метод да определя пътя си.
+8. Endless wave mode? Score?
+9. "Bouncy" projectile – physics based
+10. Multiplayer? (Все още обмислям добър начин как да вкарам multiplayer. Но ако ще добавям networking в проекта, по-скоро да е нещо от сорта на това да зареждам daily level от уеб сървър отколкото multiplayer.)
+
+
+[Milestones/Възлови точки]
+1. Прозорец - размери, настройки, game loop.
+2. Четене на информация от файл. Навързване на информацията за дизайнът на нивото с файлове тип изображения(sprites) и зареждането им в обекти.
+3. Ниво. Генериране на ниво.
+4. Взаимодействие с прозореца. Поставяне на обекти по екрана.
+5. Кула. Създаване и премахване на структура от тип „Кула“.
+6. Нападатели - units. Движение на обекти по екрана.
+7. Геометрия на структури.
+8. Обхват на кули, hitbox и health bar на unit, както и тяхното визуализиране.
+9. Pathfinding алгоритъм.
+10. Предвижване на unit по изчислен за него минимален път. Визуализиране и актуализиране на намерен минимален път върху игралното поле.
+11. Режими на насочване и стреляне на кули. Tracking.
+12. Projectile. Типове и колизии.
+13. Характеристики на играча, и тяхното прилагане към съществуващите системи.
+14. Upgrade на структури. Актуализиране на характеристики на структури.
+15. Аури. Интегриране на структура от тип „Аура“.
+16. Статус ефекти върху unit и структури.
+17. HUD – бутони и информация.
+18. Препятствия. Интегриране на структура от тип „Препятствие“.
+19. Условия за победа/загуба. Unit waves.
+20. Дизайн на ниво, unit-и, структури. Балансиране на характеристиките им.
+
+[Estimate in man-hours/Времеоценка в човекочасове]
+Предполагам, че за около 100 часа бих имал имплементирани всички основни функционалности, от списъка по-горе, плюс тестове. Ако все още има време до защитата ще продължа с имплементация на опционалните функционалности, евентуално по-добре изглеждащ интерфейс, vfx/sfx, меню екран и други подобрения. Относно спрайтовете, намерих няколко пакета за общо ползване, които смятам, че ще са ми достатъчни да направя играта да изглежда задоволително.
+
+[Usage of technologies/Потребление на технологии]
+- pygame
+- numpy
+- Евентуално модули с по-оптимизирани структури за стек и опашка (макар че вградената deque би трябвало да ми свърши работа). Може би heapq за опашка с приоритет.
+- вградени модули – random, sys, os, asyncio, collections и т.н.
+- ако стигна до имплементация на networking – http/web socket модул
+"""
+
+### P.S. Искам да се извиня за супер странното описание, просто ми е изключително трудно да дефинирам игрови термини на български език.

Удари ме в носталгията. :)

Всичко изглежда чудесно, единственото от гледна точка на геймплей, което бих отбелязал е следното:

  1. Евристиката може да се изчислява според това колко кули с какъв damage и attack speed има в близост на текущия tile.

Не съм убеден дали това не би повлияло негативно на геймплея. Обикновено враговете са "глупави" и играчите в крайна сметка се възползват от този наивен pathfinding с различните maze форми.

П.П. Ние малко тролваме с тези термини на български цял курс, описанието е супер. :D