1. Dragon v1.0¶
Assignment: Dragon v1.0
Complexity: medium
Lines of code: on average 100 lines, shortest solution is 24 lines
Time: 89 min, then 144 min live coding with instructor
Warning: Don't delete code, assignment will be continued

Figure 1.16. Firkraag dragon from game Baldur's Gate II: Shadows of Amn¶
1.1. Agenda¶
09:00 - 09:20 - Assignment introduction (functional and non-functional requirements)
09:20 - 10:50 - Students write code
10:50 - 11:00 - Git commit and push, break
11:00 - 11:40 - Code review (2-3 volunteers)
11:40 - 11:45 - Break
11:45 - 13:15 - Trainer writes code (TDD)
13:15 - 14:00 - Lunch
14:00 - 15:30 - Trainer performs refactoring
15:30 - 15:45 - Survey, break
15:45 - 17:00 - ...
1.2. English¶
Assignment is simulation of a software development process.
Assignment is a business requirements specification.
Solution must fulfill all the acceptance criteria.
How to implement those criteria is up to you.
You - programmer, Instructor - Product Owner.
Product Owner will not help you in architectural decisions.
Do not check neither solution nor future versions (beta and rc).
Non-functional requirements:
In your directory create an empty file
dragon_v1.py
Add file to the version control system (should be automatic)
Commit with message: "Dragon: NAME", where
NAME
is your first namePush changes to the repository
In this file write a solution to the assignment
Upon completing assignment commit and push changes to the repository
Functional requirements:
Create Dragon with:
name
position on the screen
health points, default random
int
in range from 50 to 100path to the texture file, default
img/dragon/alive.png
Dragon can:
have position set to any place on the screen
move in any direction by specified value
make damage in range from 5 to 20
take damage
Assume left-top screen corner as an initial coordinates position:
going right add to
x
going left subtract from
x
going up subtract from
y
going down add to
y
When health points drop to, or below zero:
Dragon has status
dead
Change texture file name to
img/dragon/dead.png
Display
NAME is dead
, whereNAME
is the dragon's nameDisplay how much gold dragon dropped (random integer from 1 to 100)
Display position where dragon died
Run the game:
Create dragon named "Wawelski"
Set Dragon's initial position to x=50, y=120
Set new position to x=10, y=20
Move dragon left by 10 and down by 20
Move dragon left by 10 and right by 15
Move dragon right by 15 and up by 5
Move dragon down by 5
Dragon makes damage
Make 10 points damage to the dragon
Make 5 points damage to the dragon
Make 3 points damage to the dragon
Make 2 points damage to the dragon
Make 15 points damage to the dragon
Make 25 points damage to the dragon
Make 75 points damage to the dragon
Dragon should die at the position x=20, y=40 and drop gold (1-100)
Post notes:
Trainer acts as Product Owner with little technical knowledge
You are the software engineer who need to decide and live with consequences of your choices
Task is a narrative story telling to demonstrate OOP and good engineering practices
Calculated last position of the game should be x=20, y=40
You can introduce new fields, methods, functions, variables, constants, classes, objects, whatever you want
Don't use modules form outside the Python Standard Library
Task is business requirement specification, not a technical documentation, i.e., "what Dragon has to do, not how to do it"
You don't have to keep order of specification while writing code
This is 1.0 version, so no new functionality like negative position checking etc
You can create tests, i.e.: unittest, doctest
Do not read solution or any future iterations of this exercise; if you read future tasks, you will spoil fun and learning
Good luck, have fun!
1.3. Polish¶
Zadanie jest symulacją procesu wytwarzania oprogramowania. Motyw Smoka z zadania jest tylko narracją do demonstracji obiektowego paradygmatu programowania i dobrych praktyk programistycznych. Nie piszemy gry i nie będziemy omawiali specyfiki game-dev! Siłą rzeczy poruszymy kilka kwestii z związanych ze specyfiką gier (np. to że smok zieje ogniem itp), ale całość dyskusji znajdzie zastosowanie do dowolnego rodzaju projektów informatycznych i problemów inżynierii oprogramowania w każdej domenie biznesowej.
Ty - programista, Prowadzący - Product Owner. Przy tym zadaniu wcielisz się w rolę inżyniera oprogramowania (programisty), a Prowadzący będzie zachowywał się jak Product Owner z niewielką wiedzą techniczną - 10 lat temu był programistą, a teraz większość czasu spędza w arkuszu kalkulacyjnym i na spotkaniach. Pamiętaj, że doświadczenie Product Ownera rzutuje na sposób w jaki pisze kryteria akceptacyjne. Jego kariera programisty może powodować, że w specyfikacji wymagań pojawią się kwestie techniczne i sugestie jak dany problem rozwiązać. Musisz to odfiltrować z treści zadania. Niestety to bardzo częsty scenariusz w branży IT.
Wymagania niefunkcjonalne:
W swoim katalogu stwórz pusty plik
dragon_v1.py
Dodaj plik do systemu kontroli wersji
Zapisz (commit) zmiany jako "Dragon: NAME", gdzie
NAME
to Twoje imięWypchnij (push) zmiany do repozytorium
W pliku zapisz kod do rozwiązania zadania
Po skończeniu zadania zapisz i wypchnij zmiany do repozytorium
Wymagania funkcjonalne:
Stwórz Smoka z:
nazwą
pozycją na ekranie
punktami życia, domyślnie losowy
int
z zakresu od 50 do 100ścieżką do pliku tekstury, domyślnie
img/dragon/alive.png
Smok może:
być ustawiony w dowolne miejsce ekranu
być przesuwany w którymś z kierunków o zadaną wartość
zadawać komuś losowe obrażenia z przedziału od 5 do 20
otrzymywać obrażenia
Przyjmij górny lewy róg ekranu za punkt początkowy:
idąc w prawo dodajesz
x
idąc w lewo odejmujesz
x
idąc w górę odejmujesz
y
idąc w dół dodajesz
y
Kiedy punkty życia Smoka spadną do lub poniżej zera:
smok ma status
dead
zmień nazwę pliku tekstury na
img/dragon/dead.png
wyświetl
NAME is dead
, gdzieNAME
to nazwa smokawyświetl ile złota smok wyrzucił (losowa liczba od 1 do 100)
wyświetl pozycję gdzie smok zginął
Przeprowadź grę:
Stwórz smoka o nazwie "Wawelski"
Ustaw inicjalną pozycję smoka na x=50, y=120
Ustaw nową pozycję na x=10, y=20
Przesuń smoka w lewo o 10 i w dół o 20
Przesuń smoka w lewo o 10 i w prawo o 15
Przesuń smoka w prawo o 15 i w górę o 5
Przesuń smoka w dół o 5
Smok zadaje obrażenia (5-20)
Zadaj 10 obrażeń smokowi
Zadaj 5 obrażeń smokowi
Zadaj 3 obrażenia smokowi
Zadaj 2 obrażenia smokowi
Zadaj 15 obrażeń smokowi
Zadaj 25 obrażeń smokowi
Zadaj 75 obrażeń smokowi
Smok powinien zginąć na pozycji: x=20, y=40 i zostawić złoto (1-100)
Informacje dodatkowe:
Zadanie jest specyfikacją wymagań biznesowych. Nie jest to dokumentacja techniczna. Zadanie opisuje "co ma być", a nie "jak to robić". Zwróć na to uwagę, bo to ważna różnica!
Sposób implementacji jest dowolny. Możesz wprowadzać dodatkowe pola, metody, funkcje, zmienne, stałe, klasy, obiekty, unittest lub doctest, type annotation - co tylko chcesz, ale nie korzystaj z modułów spoza biblioteki standardowej. Wyjątkiem są frameworki do testów (
pytest
,hypothesis
, itp).Rozwiązanie musi spełniać kryteria akceptacyjne. Pamiętaj, że jest to wersja 1.0 więc nie wprowadzaj dodatkowych niezamówionych funkcjonalności (np. dodatkowych postaci, sprawdzania wychodzenia poza planszę itp.). Z tego powodu nie musisz trzymać się kolejności punktów i podpunktów w zadaniu, a także rozwiązać problemy inaczej niż jest napisane. Masz pełną dowolność.
Product Owner nie doradzi Ci w sprawie decyzji architektonicznych. Nie podpowie Ci czy lepiej będzie zrobić to w jakiś konkretny sposób, albo czy jak zastosujesz to pewne rozwiązanie to jaki będzie wpływ na przyszłość. Zadanie polega na tym, że to Ty musisz podejmować decyzje i ponosić ich konsekwencje, tj. łatwa możliwość wprowadzania zmian w przyszłych wersjach. Musisz znaleźć balans, między wdrożeniem szybkim funkcjonalności, łatwością zrozumienia i utrzymywania kodu i nie zablokowaniem sobie drogi na wprowadzanie zmian w przyszłości. Pamiętaj o TDD, YAGNI, DRY, KISS, SOLID, emerging architecture i over-engineering.
Nie przeglądaj rozwiązań ani treści kolejnych części zadania. Jeżeli zaglądniesz w przód, to zepsujesz sobie zabawę i naukę. To zadanie ma niesamowity potencjał edukacyjny. Nie niszcz go.
Powodzenia i miłej zabawy!
1.4. Hints¶
Shortest solution has 24 lines of code
from random import randint
randint(a, b)
- random integer betweena
andb
(inclusive!)
1.5. Solution¶
EN: Note, that this will spoil your fun and learning
PL: Zwróć uwagę, że to zepsuje Twoją zabawę i naukę