Add abstract and project organization

This commit is contained in:
Kristofers Solo 2024-12-02 17:25:39 +02:00
parent 91eca5ce41
commit 684b56bd9a
7 changed files with 282 additions and 47 deletions

View File

@ -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,

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -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

88
doc.typ Normal file
View File

@ -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))
],
),
)

View File

@ -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: (

BIN
main.pdf Normal file

Binary file not shown.

145
main.typ
View File

@ -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]<gh-release>: 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]<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]<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/")<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>)[LGMF01]],
[Labirinta būvētājs], [#link(<LGMF01>)[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>)[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"),
) <dpd-2-maze-gen>
#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<u64>` -- 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<Hex>` -- 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 <static-tests>
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