1. Dragon (version alpha)

  • Complexity level: medium

  • Lines of code to write: 100 lines

  • Estimated time of completion: 60 min, then 90 min live coding with instructor

  • Solution (basic): solution/dragon_alpha_basic.py

  • Solution (advanced): solution/dragon_alpha_adv.py

  • Warning: Don't delete code, assignment will be continued

../_images/dragon.gif

Figure 1.3. Firkraag dragon from game Baldur's Gate II: Shadows of Amn

English
  1. Dragon has (attributes):

    1. name

    2. position x on the screen

    3. position y on the screen

    4. texture file name, default img/dragon/alive.png

    5. health points, default random int in range from 50 to 100

  2. Dragon can (methods):

    1. have position set to any place on the screen

    2. make damage in range from 5 to 20

    3. take damage

    4. move in any direction by specified value

  3. Assume left-top screen corner as a initial coordinates position:

    1. going right add to x

    2. going left subtract from x

    3. going up subtract from y

    4. going down add to y

  4. When dragon receives damage:

    • print name of the Dragon

    • health points which left

  5. When health points drop to, and below zero:

    1. Dragon is dead

    2. Set object status to dead

    3. Print XXX is dead, where XXX is the name of the dragon

    4. Change texture file name to img/dragon/dead.png

    5. Print position where dragon died

    6. Return gold dropped by Dragon (random in range from 1 to 100)

    7. Dragon cannot take any more damage

    8. Dragon cannot make any more damage

    9. Dragon cannot move or have position set

  6. Run the game:

    1. Create dragon at x=50, y=120 position and name it "Wawelski"

    2. Set new position to x=10, y=20

    3. Move dragon left by 10 and down by 20

    4. Move dragon left by 10 and right by 15

    5. Move dragon right by 15 and up by 5

    6. Move dragon down by 5

    7. Dragon makes damage

    8. Make 10 points damage to the dragon

    9. Make 5 points damage to the dragon

    10. Make 3 points damage to the dragon

    11. Make 2 points damage to the dragon

    12. Make 15 points damage to the dragon

    13. Make 25 points damage to the dragon

    14. Make 75 points damage to the dragon

  7. Non-functional requirements:

    1. This is a simulation of development process

    2. Trainer act as Product Owner with little technical knowledge

    3. You are the software engineer who need to decide and live with consequences of your choices

    4. Task is a narrative story telling to demonstrate OOP and good engineering practices

    5. Calculated last position of the game should be x=20, y=40

    6. You can introduce new fields, methods, functions, variables, constants, classes, objects, whatever you want

    7. Don't use modules form outside the Python Standard Library

    8. Task is business requirements specification, not a technical documentation, i.e. "what Dragon has to do, not how to do it"

    9. You don't have to keep order of business specification while writing code

    10. This is alpha version, so no new functionality like negative position checking etc.

    11. Do not read solution or any future iterations of this exercise.

    12. If you read future tasks, you will spoil fun and what is the most important: learning.

Polish
  1. Smok ma (atrybuty):

    1. nazwę

    2. pozycję x na ekranie

    3. pozycję y na ekranie

    4. nazwę pliku tekstury, domyślnie img/dragon/alive.png

    5. punkty życia, domyślnie losowy int z zakresu od 50 do 100

  2. Smok może (metody):

    1. być ustawiony w dowolne miejsce ekranu

    2. zadawać komuś losowe obrażenia z przedziału od 5 do 20

    3. otrzymywać obrażenia

    4. być przesuwany o zadaną liczbę punktów w którymś z kierunków

  3. Przyjmij górny lewy róg ekranu za punkt początkowy:

    1. idąc w prawo dodajesz x

    2. idąc w lewo odejmujesz x

    3. idąc w górę odejmujesz y

    4. idąc w dół dodajesz y

  4. Gdy smok otrzymuje obrażenia:

    • wypisz nazwę smoka,

    • pozostałe punkty życia

  5. Kiedy punkty życia Smoka spadną do, lub poniżej zera:

    1. Smok jest martwy

    2. Ustaw status obiektu na dead

    3. Wypisz napis XXX is dead gdzie XXX to nazwa smoka

    4. Zmień nazwę pliku tekstury na img/dragon/dead.png

    5. Wypisz pozycję gdzie smok zginął

    6. Zwróć ile złota smok wyrzucił (losowa 1-100)

    7. Nie można zadawać mu obrażeń

    8. Smok nie może zadawać obrażeń

    9. Smok nie może się poruszać

  6. Przeprowadź grę:

    1. Stwórz smoka w pozycji x=50, y=120 i nazwij go "Wawelski"

    2. Ustaw nową pozycję na x=10, y=20

    3. Przesuń smoka w lewo o 10 i w dół o 20

    4. Przesuń smoka w lewo o 10 i w prawo o 15

    5. Przesuń smoka w prawo o 15 i w górę o 5

    6. Przesuń smoka w dół o 5

    7. Smok zadaje obrażenia

    8. Zadaj 10 obrażeń smokowi

    9. Zadaj 5 obrażeń smokowi

    10. Zadaj 3 obrażeń smokowi

    11. Zadaj 2 obrażeń smokowi

    12. Zadaj 15 obrażeń smokowi

    13. Zadaj 25 obrażeń smokowi

    14. Zadaj 75 obrażeń smokowi

  7. Wymagania niefunkcjonalne:

    1. Zadanie jest symulacją procesu developmentu

    2. Trener zachowuje się jak Product Owner z niewielką techniczną wiedzą

    3. Ty jesteś inżynierem oprogramowania, który musi podejmować decyzje i ponosić ich konsekwencje

    4. Zadanie jest tylko narracją do demonstracji OOP i dobrych praktyk programowania

    5. Wyliczona pozycja Smoka na końcu gry powinna być x=20, y=40

    6. Możesz wprowadzać dodatkowe pola, metody, funkcje, zmienne, stały, klasy, obiekty, co tylko chcesz

    7. Nie korzystaj z modułów spoza standardowej biblioteki Pythona

    8. Zadanie jest specyfikacją wymagań biznesowych, a nie dokumentacją techniczną. tj. "co Smok ma robić, a nie jak to ma robić"

    9. Nie musisz trzymać się kolejności punktów i podpunktów w zadaniu

    10. Jest to wersja alpha więc bez dodatkowych funkcjonalności (np. sprawdzanie koordynatów, wychodzenia poza planszę itp.)

    11. Nie przeglądaj rozwiązań ani treści kolejnych (przyszłych) części zadania.

    12. Jeżeli zaglądniesz w przód, to zepsujesz sobie zabawę i co najważniejsze naukę.

The whys and wherefores
  • Object oriented thinking

  • Data modeling in OOP

  • Designing and working with objects

  • Nested objects

  • Interface specification

  • MVC architecture

  • Good Engineering Practices

  • Keep it Simple

  • Open to extensions, close for modifications

Hint
  • from random import randint

  • randint returns random integer in range [a, b], including both end point