diff --git a/abstract.typ b/abstract.typ index a14ac15..a725463 100644 --- a/abstract.typ +++ b/abstract.typ @@ -1,4 +1,5 @@ #import "@preview/dashy-todo:0.0.1": todo +#import "@preview/wordometer:0.1.3": word-count, total-words #pagebreak() #heading( level: 1, @@ -6,11 +7,20 @@ numbering: none, "Anotācija", ) +Kvalifikācijas darbā ir izstrādāta spēle "Maze Ascension", kas piedāvā +spēlētājiem izaicinājumu iziet cauri proceduāli ģenerētiem sešstūrainam +labirintiem. Spēle ir veidota, izmantojot Rust programmēšanas valodu un Bevy +spēļu dzinēju. -#lorem(100) - -#todo("Uzrakstīt anotāciju (līdz 850 rakstzīmēm)") +Darba gaitā tika izstrādāta "hexlab" bibliotēka labirintu ģenerēšanai, kas tika +atdalīta no galvenās spēles loģikas. Labirintu ģenerēšanai tiek izmantots +rekursīvās atpakaļizsekošanas algoritms, kas nodrošina, ka katrai šūnai var +piekļūt no jebkuras citas šūnas. +Spēle ir izstrādāta kā vienspēlētāja režīmā ar progresējošu grūtības +pakāpi, kur katrs nākamais līmenis piedāvā lielāku labirintu. Spēle ir pieejama +gan kā lejupielādējama versija Windows, Linux un macOS platformām, gan kā +tīmekļa versija, izmantojot WebAssembly tehnoloģiju. #par( first-line-indent: 0cm, @@ -36,13 +46,20 @@ papilspējas. numbering: none, "Abstract", ) - _"Maze Ascension" is a minimalist maze exploration game built using the Bevy - engine. The game features simple visuals with hexagonal tiles forming the maze - structure on a white background with black borders, and a stickman-style player - character. Players navigate through multiple levels of increasing difficulty, - progressing vertically as they climb up through levels. The game includes - power-ups and abilities hidden throughout the maze, and later introduces the - ability to move between levels freely._ + The qualification work includes the game "Maze Ascension", which offers + players the challenge to pass through procedurally generated hexagons + mazes. The game is built using the Rust programming language and Bevy + game engine. + + The work included the development of a "hexlab" library for maze generation, + which was separated from the main game logic. The maze generation is a + recursive backtracking algorithm which ensures that each cell can be + accessed from any other cell. + + The game is designed as a single-player mode with progressive difficulty + with each successive level offering a larger maze. The game is available + as a downloadable version for Windows, Linux and macOS platforms, and as + as a web-based version using WebAssembly technology. #todo("līdz 850 rakstzīmēm") #par( first-line-indent: 0cm, diff --git a/assets/images/dpd/dpd2/maze-gen.svg b/assets/images/dpd/dpd2/maze-gen.svg new file mode 100644 index 0000000..70abd65 --- /dev/null +++ b/assets/images/dpd/dpd2/maze-gen.svg @@ -0,0 +1,4 @@ + + + +
Operatīvā
Atmiņa
Labirinta
dati
Labirinta
parametru dati
Labirinta
būvētājs
\ No newline at end of file diff --git a/bibliography.yml b/bibliography.yml index 7965dd0..9337033 100644 --- a/bibliography.yml +++ b/bibliography.yml @@ -71,3 +71,43 @@ omg-uml: date: 2015-03 url: https://www.omg.org/spec/UML/2.5/PDF page-total: 794 +clippy: + type: Web + title: Clippy + author: Rust Projekta Izstādātāji + url: https://doc.rust-lang.org/clippy/usage.html +rustfmt: + type: Web + title: Rustfmt + author: Rust Projekta Izstādātāji + url: https://github.com/rust-lang/rustfmt +cargo-doc: + type: Web + title: cargo-doc + author: Rust Projekta Izstādātāji + url: https://doc.rust-lang.org/cargo/commands/cargo-doc.html +rust-style: + type: Web + title: Rust stila ceļvedis + author: Rust Projekta Izstādātāji + url: https://doc.rust-lang.org/nightly/style-guide/ +hexlab: + type: Web + title: Hexlab bibliotēka + author: Kristiāns Francis Cagulis + url: https://crates.io/crates/hexlab +hexlab-docs: + type: Web + title: Hexlab bibliotēkas dokumentācija + author: Kristiāns Francis Cagulis + url: https://docs.rs/hexlab/latest/hexlab/ +justfile: + type: Web + title: Just programmētāja rokasgrāmata + author: Casey Rodarmor + url: https://just.systems/man/en/ +gh-release: + type: Web + title: Par laidieniem + author: GitHub komanda + url: https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases diff --git a/doc.typ b/doc.typ new file mode 100644 index 0000000..7f38411 --- /dev/null +++ b/doc.typ @@ -0,0 +1,88 @@ +#import "@preview/tablex:0.0.9": tablex + +#let vspace = 1fr +#heading(numbering: none, outlined: false, "Dokumentārā lapa") +#v(vspace) + +Kvalifikācijas darbs "Spēles izstrāde, izmantojot Bevy spēļu dzinēju" ir +izstrādāts Latvijas Universitātes eksakto zinātņu un tehnoloģiju fakultātē. + +Darba autors apliecina, ka darbs ir veikts patstāvīgi, un ir izmantoti tikai +tajā norādītie informācijas avoti. + + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Darba autors:", + [ + Kristiāns Francis Cagulis, kc22015 + ], + ), +) + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Darba vadītājs:", + "prof. Mg. dat. Jānis Iljins", + ), +) + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Darba galīgā versija izgatavota:", + "x.01.2025.", + ), +) + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Darba iesniegšanas datums:", + "06.01.2025.", + ), +) + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Darba aizstāvēšanas datums:", + "x.01.2025.", + ), +) + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Komisijas vērtējums:", + line(length: 100%, start: (0pt, 10pt)), + ), +) + +#v(vspace) +#figure( + tablex( + stroke: none, + columns: (1fr, 1fr), + "Komisijas sastāvs:", + [ + #line(length: 100%, start: (0pt, 10pt)) + #line(length: 100%, start: (0pt, 30pt)) + #line(length: 100%, start: (0pt, 40pt)) + ], + ), +) diff --git a/layout.typ b/layout.typ index fbec183..fae574b 100644 --- a/layout.typ +++ b/layout.typ @@ -184,6 +184,21 @@ } set ref(supplement: it => { }) // disable default reference suppliments + show ref: it => { + let el = it.element + + if el != none and el.func() == heading { + return link( + el.location(), + numbering( + el.numbering, + ..counter(heading).at(el.location()), + ) + " " + el.body, + ) + } + + it + } /* --- Figure/Table config end --- */ set list(marker: ( diff --git a/main.pdf b/main.pdf new file mode 100644 index 0000000..4f7b092 Binary files /dev/null and b/main.pdf differ diff --git a/main.typ b/main.typ index 1a36d3d..88b666d 100644 --- a/main.typ +++ b/main.typ @@ -18,20 +18,20 @@ #set heading(numbering: none) = Apzīmējumu saraksts -/ Audio: #todo("add description") +/ Audio: Skaņas komponentes, kas ietver gan skaņas efektus, gan fona mūziku. / CI/CD: nepārtraukta integrācija un nepārtraukta izvietošana; / DPD: datu plūsmas diagramma; / ECS: entitāšu komponentu sistēma (angl. Entity-Component-System#footnote[https://en.wikipedia.org/wiki/Entity_component_system]); / GitHub#footnote[https://en.wikipedia.org/wiki/GitHub]: izstrādātāju platforma, kas ļauj izstrādātājiem izveidot, glabāt, pārvaldīt un kopīgot savu kodu; -/ GitHub Release #footnote[https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases]: izvēršamas programmatūras iterācijas, ko varat iepakot un padarīt pieejamas plašākai auditorijai, lai lejupielādētu un izmantotu; / Jaucējtabula#footnote[https://lv.wikipedia.org/wiki/Jauc%C4%93jtabula]: jeb heštabula (angl. hash table#footnote[https://en.wikipedia.org/wiki/Hash_table]) ir datu struktūra, kas saista identificējošās vērtības ar piesaistītajām vērtībām. -/ Papildspēja: objekts, kas kā spēles mehānika spēlētājam piešķir īslaicīgas priekšrocības vai papildu spējas (angl. power-up#footnote[https://en.wikipedia.org/wiki/Power-up]); -/ Pirmkods: #todo("add description") +/ Laidiens: Programmatūras versija, kas ir gatava izplatīšanai lietotājiem un satur īpašas funkcijas, uzlabojumus vai labojumus. / PPA: programmatūras projektējuma apraksts; / PPS: programmatūras prasību specifikācija; -/ Renderēšana: #todo("add description") +/ Papildspēja: objekts, kas kā spēles mehānika spēlētājam piešķir īslaicīgas priekšrocības vai papildu spējas (angl. power-up#footnote[https://en.wikipedia.org/wiki/Power-up]); +/ Pirmkods: Cilvēkam lasāmas programmēšanas instrukcijas, kas nosaka programmatūras darbību. +/ Renderēšana: Process, kurā tiek ģenerēts vizuāla izvade. +/ Sēkla: Skaitliska vērtība, ko izmanto nejaušo skaitļu ģeneratora inicializēšanai. / Spēlētājs: lietotāja ieraksts vienas virtuālās istabas kontekstā. -/ Sēkla: _seed_ #todo("add description") /* Pēdējos gados spēļu izstrādes joma ir piedzīvojusi strauju popularitātes * pieaugumu, ko veicināja neatkarīgo spēļu skaita pieaugums un jaudīgu spēļu @@ -120,9 +120,10 @@ tostarp Linux, macOS, Windows un WebAssembly (WASM). Tas nodrošina, ka spēle ir pieejama plašai auditorijai, nodrošinot konsekventu un saistošu pieredzi dažādās operētājsistēmās un vidēs. -Spēle tiek izplatīta, izmantojot GitHub releases un -#link("http://itch.io/")[itch.io], kas ir populāra neatkarīgo spēļu -platforma, kas ļauj viegli piekļūt un izplatīt spēles visā pasaulē. +Spēle tiek izplatīta, izmantojot "GitHub +releases"@gh-release +un itch.io#footnote("https://itch.io/"), kas ir populāra neatkarīgo +spēļu platforma, kas ļauj viegli piekļūt un izplatīt spēles visā pasaulē. Izmantojot šīs platformas, datorspēle gūst dažādu maksājumu modeļu un kopienas iesasaistes funkcijas, tādējādi palielinot spēles sasniedzamību un atpazīstamību. @@ -149,7 +150,7 @@ Sistēmas izstrādē galvenā uzmanība tiks pievērsta sekojošu darījumprasī + Savietojamība ar vairākām platformām: sistēma būs pieejama vairākās platformās, tostarp Linux, macOS, Windows un WebAssembly, nodrošinot plašu pieejamību un sasniedzamību. -+ Kopienas iesaiste: Spēle izmantos #link("http://itch.io/")[itch.io] kopienas ++ Kopienas iesaiste: Spēle izmantos itch.io@itch-io kopienas funkcijas, lai sadarbotos ar spēlētājiem, apkopotu atsauksmes un veicinātu atbalstošu spēlētāju kopienu. + Regulāri atjauninājumi un uzturēšana: CI/CD cauruļvadu veicinās regulārus @@ -197,7 +198,7 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ - Windows kompilācijām; - WebAssembly kompilāciju. - Izplatīšanas atkarības: - - Pastāvīga #link("http://itch.io/")[itch.io] platformas pieejamība spēļu izplatīšanai. + - Pastāvīga itch.io@itch-io platformas pieejamība spēļu izplatīšanai. - CI/CD darbplūsmai nepieciešamo kompilēšanas rīku un atkarību uzturēšana. - Izstrādes atkarības: - Rust programmēšanas valoda (stabilā versija); @@ -205,7 +206,7 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ - Nepieciešamie Bevy spraudņi un atkarības, kā norādīts projekta Cargo.toml failā. - Lietotāja vides pieņēmumi: - Spēlētājiem ir pamata izpratne par labirinta navigāciju un mīklu risināšanas koncepcijām. - - Lietotāji var piekļūt un lejupielādēt spēles no #link("http://itch.io/")[itch.io] platformas. + - Lietotāji var piekļūt un lejupielādēt spēles no itch.io@itch-io platformas. - Spēlētājiem ir ievadierīces (tastatūra/pele), ar kurām kontrolēt spēli. = Programmatūras prasību specifikācija @@ -271,7 +272,7 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu. [Spēlētāju stāvokļa atjaunināšana], [], rowspanx(1)[Labirinta ģenerēšanas modulis], - [Labirinta ģenerēšana], [#link()[LGMF01]], + [Labirinta būvētājs], [#link()[LGMF01]], rowspanx(5)[Līmeņu pārvaldības modulis], [Līmeņu ielāde], [], @@ -297,16 +298,38 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu. === Spēles stāvokļa pārvaldības modulis === Spēlētāja modulis === Labirinta ģenerēšanas modulis + +Apakšnodaļa ietver labirinta moduļa funkcijas. Moduļa funkcionalitāte ir +izmantota sešstūraina labirinta ģenerēšanai. +Moduļa funkciju datu +plūsmas ir parādītas 2. līmeņa datu plūsmas diagrammā (skat. @dpd-2-maze-gen att.) +Labirinta būvēšanas funkcija ir aprakstītas atsevišķā tabulā (skat. +#link()[LGMF01] tab.) + +Modularitātes un atkārtotas lietojamības apsvērumu dēļ labirinta ģenerēšanas +funkcionalitāte tika pārnesta uz ārēju bibliotēku "hexlib"@hexlab. Šis lēmums +ļauj labirinta ģenerēšanas loģiku atkārtoti izmantot dažādos projektos un +lietojumprogrammās, veicinot atkārtotu koda izmantošanu. +Iekapsulējot labirinta ģenerēšanu atsevišķā bibliotēkā, to ir vieglāk pārvaldīt +un atjaunināt neatkarīgi no galvenās lietojumprogrammas, nodrošinot, ka +labirinta ģenerēšanas algoritma uzlabojumus vai izmaiņas var veikt, neietekmējot +programmu. + +#figure( + caption: [Labirinta ģenerēšanas moduļa 2. līmeņa DPD], + image("assets/images/dpd/dpd2/maze-gen.svg"), +) + #function-table( - "Labirinta ģenerēšana", + "Labirinta būzētājs", "LGMF01", [Izveido sešstūrainu labirintu ar norādītajiem parametriem.], [ - + Rādiuss: `u32` -- Labirinta rādiuss. Obligāts parametrs, kas nosaka labirinta izmēru. - + Sēkla: `Option` -- Neobligāta sēkla nejaušo skaitļu ģeneratoram. Ja + + Rādiuss -- Labirinta rādiuss. Obligāts parametrs, kas nosaka labirinta izmēru. + + Sēkla -- Neobligāta sēkla nejaušo skaitļu ģeneratoram. Ja norādīta, nodrošina reproducējamu labirinta ģenerēšanu ar vienādiem parametriem. Ja nav norādīta, tiek izmantota nejauša sēkla. - + Sākuma pozīcija: `Option` -- Neobligāta sākotnējā pozīcija labirintā. + + Sākuma pozīcija -- Neobligāta sākotnējā pozīcija labirintā. Ja norādīta, labirinta ģenerēšana sāksies no šīs pozīcijas. Ja nav norādīta, tiek izvēlēta nejauša derīga sākuma pozīcija. // + Ģeneratora tips: `GeneratorType` -- Algoritms, kas tiks izmantots @@ -391,55 +414,103 @@ Pret sistēmas izstrādājamo programmatūras uzturamību tiek izvirzītas sekoj = Programmatūras projektējuma apraksts == Daļējs funkciju projektējums +#todo("pievienot funkciju projektējumu +diagrammas") /* Apraksta svarīgākās, sarežģītākās funkcijas vai sistēmas darbības aspektus; * obligāti jālieto vismaz 4 dažādi diagrammu veidi, izņemot DPD un lietošanas * piemēru (use case) diagrammas */ -== Izmantotās bibliotēkas -== Daļējs lietotāju saskarņu projektējums +== Saskarņu projektējums +#todo("pievienot saskarnes (UI/UX)") /* 5-7 lietotāja saskarnes un to apraksts */ = Testēšanas dokumentācija -== Dinamiskā programmatūras testēšana +Šajā nodaļā ir aprakstīta spēles "Maze Ascension" testēšanas process. +Testēšana tika veikta divos galvenajos virzienos -- statiskā un dinamiskā +testēšana, izmantojot gan automatizētus rīkus, gan manuālu pārbaudi. + +== Statiskā testēšana +Statiskā testēšana ir svarīga daļa no projekta kvalitātes nodrošināšanas. +"Clippy"@clippy tiek izmantots koda analīzei, meklējot potenciālas problēmas un +neoptimālus risinājumus. Papildus noklusētajiem noteikumiem, tika aktivizēti +stingrāki koda kvalitātes pārbaudes līmeņi: "pedantic" režīms nodrošina +padziļinātu koda stila pārbaudi, "nursery" aktivizē eksperimentālās pārbaudes, +un "unwrap_used" un "expect_used" brīdina par potenciāli nedrošu kļūdu +apstrādi. Šie papildu noteikumi palīdz uzturēt augstāku koda kvalitāti un +samazināt potenciālo kļūdu skaitu. + + +/* Programmatūras statiskai testēšanai ir izmantots rīks „clang-tidy“, kas analizē +programmatūru, meklējot kļūdas un problēmas pirmkodā. [12] Rīks satur vairākas specifiskas +problēmu kopas, kas var tikt izmantotas analīzē. Tika izmantota „clang-analyzer“ problēmu +kopa. Vieglākai statisko testu darbināšanai tika izmantots vienkāršs programmēšanas valodas +„Python“ skripts, kas atlasa visus failus, kuru paplašinājums ir „cpp“ (valodas „C++“ pirmkoda +fails) vai „h“ (galvenes fails) un darbina statiskās analīzes rīku ar katru failu atsevišķi (skat. +izpildes rezultātu attēlā 4.3.). */ + +== Dinamiskā testēšana +#todo("uztakstīt dinamisko testēšanu") === Manuālā integrācijas testēšana === Automatizēti testi -== Statiskā programmatūras testēšana = Programmas projekta organizācija -= Kvalitātes nodrošināšana -PPS ir izstrādāta, ievērojot LVS 68:1996 standarta "Programmatūras prasību specifikācijas -ceļvedis"@lvs_68 un LVS 72:1996 standarta "Ieteicamā prakse programmatūras projektējuma -aprakstīšanai"@lvs_72 standarta prasības. +Kvalifikācijas darba prasības paredz, ka programmatūru un dokumentāciju autors +veido patstāvīgi, vadoties pēc darba vadītāja norādījumiem. + +#todo("uzrakstīt projekta organizāciju") + +== Kvalitātes nodrošināšana +Augstas koda kvalitātes nodrošināšana ir jebkura projekta būtisks aspekts. +Lai to panāktu, tiek izmantoti vairāki rīki un prakses, kas palīdz uzturēt tīru, +efektīvu un uzticamu koda. + +Viens no galvenajiem rīkiem, kas tiek izmantots ir "Clippy"@clippy, kas analizē +iespējamās problēmas un iesaka uzlabojumus (skat. @static-tests nodaļu). + +Kopā ar "Clippy" tiek arī izmantots "Rustfmt"@rustfmt, koda formatētājs, lai +uzturētu vienotu koda formatējumu visā projektā. Šis rīks automātiski formatē +kodu saskaņā ar Rust stila vadlīnijām@rust-style. + +Turklāt visas publiskās funkcijas un datu struktūras +hexlab bibliotēkā ir +dokumentētas@hexlab-docs. Šajā dokumentācijā ir ietverti detalizēti apraksti un lietošanas +piemēri, kas ne tikai palīdz saprast kodu, bet arī kalpo kā dokumentācijas +testēšanas veids. Darbinot "cargo doc"@cargo-doc, tiek ģenerēja un validēja +dokumentācija, nodrošinot, ka piemēri ir pareizi un aktuāli. + +Programmatūras prasības specifikācija ir izstrādāta, ievērojot LVS 68:1996 +standarta "Programmatūras prasību specifikācijas ceļvedis"@lvs_68 un LVS 72:1996 +standarta "Ieteicamā prakse programmatūras projektējuma aprakstīšanai"@lvs_72 +standarta prasības. // Programmatūras projektējuma aprakstā iekļautās // aktivitāšu diagrammas ir izstrādātas, ievērojot UML 2.5 versijas // specifikāciju@omg-uml. -= Konfigurācijas pārvaldība +== Konfigurācijas pārvaldība Pirmkods tiek pārvaldīts, izmantojot "git"@git versiju kontroles sistēmu. Repozitorijs tiek izvietots platformā "GitHub". - Rīku konfigurācija ir definēta vairākos failos: -- "justfile#footnote[https://github.com/casey/just]" -- satur atkļūdošanas un - piegādes komandas dažādām vidēm: +- "justfile" -- satur atkļūdošanas un + laidiena komandas dažādām vidēm@justfile: - atkļūdošanas kompilācijas ar iespējotu pilnu atpakaļsekošanu; - - piegādes kompilācijas ar iespējotu optimizāciju. + - laidiena kompilācijas ar iespējotu optimizāciju. - "GitHub Actions" darbplūsmas, kas apstrādā: - koda kvalitātes pārbaudes (vienībtesti, statiskie testi, formatēšana, dokumentācijas izveide). - kompilācijas un izvietotošanas darbplūsma, kas: - izveido Windows, Linux, macOS un WebAssembly versijas; - publicē bināros failus GitHub platformā; - - izvieto tīmekļa versiju #link("http://itch.io/")[itch.io] platformā. + - izvieto tīmekļa versiju itch.io@itch-io platformā. -#indent-par[Versiju kontrole notiek pēc semantiskās versiju@sem_ver atlases - (MAJOR.MINOR.PATCH): ] +Versiju specifikācija notiek pēc semantiskās versiju atlases@sem_ver (MAJOR.MINOR.PATCH): + MAJOR -- galvenā versija, nesaderīgas izmaiņas, būtiskas koda izmaiņas. + MINOR -- atpakaļsaderīgas funkcionalitātes papildinājumi. + PATCH -- ar iepriekšējo versiju saderīgu kļūdu labojumi. -= Darbietilpības novērtējums +== Darbietilpības novērtējums +#todo("uzrakstīt darbietilpības novērtējumu") -= Secinājumi +// = Secinājumi +// #todo("uzrakstīt secinājumus") #bibliography( title: "Izmantotā literatūra un avoti", @@ -450,5 +521,5 @@ Rīku konfigurācija ir definēta vairākos failos: // #include "doc.typ" -// #pagebreak() -// #total-words words +#pagebreak() +#total-words words