Neprihlásený používateľ |

Špecifikácia zadania


Cieľom zadania je naprogramovať novú funkcionalitu pre hru Monopoly: načítavanie nehnuteľností a hracieho plánu z textového súboru. Toto zadanie tematicky nadväzuje na zadanie 4. V zadaní si precvičíte najmä prácu s textovým súborom.

Úloha

V predchádzajúcom zadaní sme programovali hernú logiku pre hru Monopoly. Pracovali sme s databázou nehnuteľností a hracím plánom, ktorý bol napevno zadefinovaný. V tomto zadaní budeme načítavať nehnuteľnosti aj hrací plán z textových súborov. Týmto spôsobom vytvoríme možnosť dynamicky si prispôsobiť hrací plán, na ktorom bude vlastné rozmiestnenie vlastných nehnuteľností.

Budeme pracovať s 2 druhmi textových súborov:

  • Textový súbor s nehnuteľnosťami - obsahuje databázu nehnuteľností s uvedením ich atribútov (názov, cena a farba)
  • Textový súbor s hracím plánom - obsahuje počet a rozmiestnenie jednotlivých polí na hracom pláne

Načítanie nehnuteľností zo súboru

Na hracom pláne sa nachádzajú 2 typy polí: nehnuteľnosti a špeciálne polia. Každá nehnuteľnosť má 3 atribúty: názov, cena a farba. Zoznam nehnuteľností, ktoré sa budú nachádzať rozmiestnené na hracom pláne bude uložený v textovom súbore, ktorý bude mať štruktúru popísanú nižšie. Údaje načítané zo súboru odporúčame uložiť do rovnakých dátových štruktúr, ktoré ste používali v zadaní 4.

Spustenie programu

Ak chceme načítať nehnuteľnosti zo súboru, musíme program spustiť v termináli nasledovným spôsobom:

./z5 -t properties_file

Prepínač -t má svoj povinný parameter properties_file, ktorý určuje cestu k danému textovému súboru. Pri otváraní súboru si treba overiť, či daný súbor existuje. Urobíte tak pomocou overenia návratovej hodnoty funkcie fopen, ktorá slúži na otváranie súborov. Ak funkcia vráti NULL, súbor sa nepodarilo načítať a vtedy treba postupovať v zmysle chybovej situácie E1 opísanej v časti Chybové situácie.

Štruktúra súboru s nehnuteľnosťami

Textový súbor obsahuje databázu nehnuteľností. V každom testovacom súbore s nehnuteľnosťami môže byť iný počet nehnuteľností s rôznymi atribútmi. Súbor obsahuje postupnosť blokov. Blok je postupnosť riadkov, ktorá definuje viaceré (1 a viac) nehnuteľnosti rovnakej farby. Na obrázku 1 vidíme štruktúru bloku.


Obrázok 1: Štruktúra bloku nehnuteľností (blok predstavuje zoznam nehnuteľností rovnakej farby).


Pravidlá:

  • Každý blok začína riadkom v tvare [color], kde color predstavuje reťazec označujúci farbu. Znaky [ a ] sa nevyskytnú v názve žiadnej nehnuteľnosti (na jednoznačné odlíšenie riadku s názvom farby od ostatných riadkov).
  • Ak sa vyskytne v súbore riadok s názvom farby, bude za ním vždy nasledovať aspoň 1 nehnuteľnosť.
  • Každá farba nehnuteľnosti sa vyskytne v súbore len 1 krát.
  • Budú sa používať len tie názvy farieb, ktoré boli použité v zadaní 4. Konkrétne tie isté reťazce, ktoré boli zadefinované v poli property_colors v súbore monopoly.c.
    // nazvy farieb nehnutelnosti
    const char *property_colors[NUM_COLORS] = {
            "Brown",
            "Skyblue",
            "Purple",
            "Orange",
            "Red",
            "Yellow",
            "Green",
            "Blue"
    };
  • Názov nehnuteľnosti je uzavretý v úvodzovkách.
  • Názov nehnuteľnosti nikdy nebude prázdny reťazec.
  • Maximálna dĺžka názvu nehnuteľnosti je 100 znakov (bez ukončovacieho znaku \0).
  • Cena/výška nájomného bude vždy kladné číslo.
  • Vľavo/vpravo od separátora : nebudú žiadne medzery.
  • Súbor nebude obsahovať prázdne riadky.
  • Riadky nebudú začínať/končiť bielymi znakmi.
Príklad textového súboru s nehnuteľnosťami:
[Yellow]
"CINEMA":1
"THEATER":1
[Purple]
"BAKERY":2
[Skyblue]
"STADIUM":2
"GOLF PARK":2
[Blue]
"AIRPORT":3
"BUS STATION":3
"SUBWAY":3
"PORT":3
[Red]
"CHURCH":4
"SCHOOL":4
[Brown]
"SHOPPING PARK":5
"CAFE":5
[Green]
"HOSPITAL":5
"VETERINARY":5
[Orange]
"NUCLEAR POWER PLANT":6
"CAR FACTORY":6
"SPACE STATION":6

Obrázok 2: Vizualizácia blokov v textovom súbore s nehnuteľnosťami.


Načítanie hracieho plánu zo súboru

Hrací plán môže obsahovať ľubovoľný počet polí. Každé pole je buď špeciálne alebo predstavuje nehnuteľnosť. Hrací plán bude uložený v textovom súbore, ktorý bude mať štruktúru popísanú nižšie. Údaje hracieho plánu načítané zo súboru odporúčame uložiť do rovnakých dátových štruktúr, ktoré ste používali v zadaní 4.

Nehnuteľnosti rozmiestnené na hracom pláne sa môžu načítať 2 spôsobmi:

  • použije sa predvolená databáza nehnuteľností, ktorá je k dispozícii vo forme poľa s názvom properties, ktoré je definované v súbore monopoly.c (rovnako ako v zadaní 4).
  • načítajú sa z iného textového súboru (ak bol zadaný prepínač -t)

Predvolená databáza nehnuteľností reprezentovaná poľom properties, ktoré je deklarované v súbore monopoly.h a definované v súbore monopoly.c:

// zoznam nehnutelnosti na hracom plane
PROPERTY properties[NUM_PROPERTIES] = {
        {.name = "FOOD TRUCK", .price = 1, .color = Brown},
        {.name = "PIZZA RESTAURANT", .price = 1, .color = Brown},
        {.name = "DOUGHNUT SHOP", .price = 1, .color = Skyblue},
        {.name = "ICE CREAM SHOP", .price = 1, .color = Skyblue},
        {.name = "MUSEUM", .price = 2, .color = Purple},
        {.name = "LIBRARY", .price = 2, .color = Purple},
        {.name = "THE PARK", .price = 2, .color = Orange},
        {.name = "THE BEACH", .price = 2, .color = Orange},
        {.name = "POST OFFICE", .price = 3, .color = Red},
        {.name = "TRAIN STATION", .price = 3, .color = Red},
        {.name = "COMMUNITY GARDEN", .price = 3, .color = Yellow},
        {.name = "PET RESCUE", .price = 3, .color = Yellow},
        {.name = "AQUARIUM", .price = 4, .color = Green},
        {.name = "THE ZOO", .price = 4, .color = Green},
        {.name = "WATER PARK", .price = 5, .color = Blue},
        {.name = "AMUSEMENT PARK", .price = 5, .color = Blue}
};
Spustenie programu bez prepínača -t

Ak chceme načítať hrací plán zo súboru a použiť predvolenú databázu nehnuteľností, musíme program spustiť v termináli nasledovným spôsobom:

./z5 -b gameboard_file
Spustenie programu aj s prepínačom -t

Ak chceme načítať hrací plán zo súboru a použiť nehnuteľnosti načítané zo separátneho textového súboru, musíme program spustiť v termináli nasledovným spôsobom:

./z5 -b gameboard_file -t properties_file

V oboch prípadoch má prepínač -b svoj povinný parameter gameboard_file, ktorý určuje cestu k textovému súboru, kde je uložený hrací plán. Pri otváraní súboru si treba overiť, či daný súbor existuje. Urobíte tak pomocou overenia návratovej hodnoty funkcie fopen, ktorá slúži na otváranie súborov. Ak funkcia vráti NULL, súbor sa nepodarilo načítať a vtedy treba postupovať v zmysle chybovej situácie E1 opísanej v časti Chybové situácie.

Štruktúra súboru s hracím plánom

Textový súbor obsahuje:

  • počet všetkých polí na hracom pláne
  • postupnosť typov polí, ktoré sa nachádzajú na hracom pláne

V každom testovacom súbore s hracím plánom môže byť rôzny počet a rôzne rozmiestnenie polí.


Obrázok 3: Štruktúra textového súboru s hracím plánom.


Pravidlá:

  • Na prvom riadku je uvedený celkový počet polí na hracom pláne.
  • Budú sa používať len tie názvy typov polí, ktoré boli použité v zadaní 4. Konkrétne tie isté reťazce, ktoré boli zadefinované v poli space_types v súbore monopoly.c.
    // nazvy typov poli na hracom plane
    const char *space_types[NUM_SPACE_TYPES] = {
            "PROPERTY",
            "START",
            "FREE PARKING",
            "IN JAIL",
            "GO TO JAIL",
            "JAIL PASS"
    };
  • Súbor bude vždy obsahovať aspoň 1 pole na hracom pláne.
  • Súbor nebude obsahovať prázdne riadky.
  • Riadky nebudú začínať/končiť bielymi znakmi.

Aké nehnuteľnosti sa rozmiestnia na hracom pláne?

Najlepší spôsob vysvetlenia je pomocou príkladov. V nasledovnom texte uvádzame príklady načítania hracieho plánu podľa toho, či používateľ zadal okrem prepínača -b aj prepínač -t.

Príklad 1

Načítanie hracieho plánu s predvolenými nehnuteľnosťami (t.j. bez prepínača -t). Do hracieho plánu sa budú postupne dosádzať nehnuteľnosti prečítané z predvolenej databázy v zachovanom poradí. Ak je na hracom pláne viac nehnuteľností ako v databáze, treba postupovať v zmysle chybovej situácie E2 opísanej v časti Chybové situácie.

./z5 -b gameboard.txt

Textový súbor gameboard.txt s hracím plánom, ktorý má 16 polí, z toho 8 nehnuteľností:

16
START
PROPERTY
JAIL PASS
PROPERTY
IN JAIL
PROPERTY
JAIL PASS
PROPERTY
FREE PARKING
PROPERTY
JAIL PASS
PROPERTY
GO TO JAIL
PROPERTY
JAIL PASS
PROPERTY

Predvolená databáza nehnuteľností (pole properties zo súboru monopoly.c), ktorá obsahuje 16 nehnuteľností.

// zoznam nehnutelnosti na hracom plane
PROPERTY properties[NUM_PROPERTIES] = {
        {.name = "FOOD TRUCK", .price = 1, .color = Brown},
        {.name = "PIZZA RESTAURANT", .price = 1, .color = Brown},
        {.name = "DOUGHNUT SHOP", .price = 1, .color = Skyblue},
        {.name = "ICE CREAM SHOP", .price = 1, .color = Skyblue},
        {.name = "MUSEUM", .price = 2, .color = Purple},
        {.name = "LIBRARY", .price = 2, .color = Purple},
        {.name = "THE PARK", .price = 2, .color = Orange},
        {.name = "THE BEACH", .price = 2, .color = Orange},
        {.name = "POST OFFICE", .price = 3, .color = Red},
        {.name = "TRAIN STATION", .price = 3, .color = Red},
        {.name = "COMMUNITY GARDEN", .price = 3, .color = Yellow},
        {.name = "PET RESCUE", .price = 3, .color = Yellow},
        {.name = "AQUARIUM", .price = 4, .color = Green},
        {.name = "THE ZOO", .price = 4, .color = Green},
        {.name = "WATER PARK", .price = 5, .color = Blue},
        {.name = "AMUSEMENT PARK", .price = 5, .color = Blue}
};

Po načítaní bude hrací plán obsahovať polia v nasledovnom poradí:

  1. START
  2. FOOD TRUCK
  3. JAIL PASS
  4. PIZZA RESTAURANT
  5. IN JAIL
  6. DOUGHNUT SHOP
  7. JAIL PASS
  8. ICE CREAM SHOP
  9. FREE PARKING
  10. MUSEUM
  11. JAIL PASS
  12. LIBRARY
  13. GO TO JAIL
  14. THE PARK
  15. JAIL PASS
  16. THE BEACH

Príklad 2

Načítanie hracieho plánu s nehnuteľnosťami, ktoré sú načítané zo separátneho textového súboru (t.j. spustenie programu aj s prepínačom -t properties_file). Do hracieho plánu sa budú postupne dosádzať nehnuteľnosti prečítané z dodaného textového súboru, ktorý je daný parametrom properties_file. Ak je na hracom pláne viac nehnuteľností ako v textovom súbore s nehnuteľnosťami, treba postupovať v zmysle chybovej situácie E2 opísanej v časti Chybové situácie.

./z5 -b gameboard.txt -t properties.txt

Textový súbor gameboard.txt s hracím plánom, ktorý má 22 polí, z toho 14 nehnuteľností:

22
START
PROPERTY
JAIL PASS
PROPERTY
PROPERTY
PROPERTY
PROPERTY
IN JAIL
PROPERTY
JAIL PASS
PROPERTY
FREE PARKING
PROPERTY
PROPERTY
JAIL PASS
PROPERTY
PROPERTY
PROPERTY
GO TO JAIL
PROPERTY
JAIL PASS
PROPERTY

Databáza nehnuteľností uložená v súbore properties.txt, ktorá obsahuje 18 nehnuteľností.

[Yellow]
"CINEMA":1
"THEATER":1
[Purple]
"BAKERY":2
[Skyblue]
"STADIUM":2
"GOLF PARK":2
[Blue]
"AIRPORT":3
"BUS STATION":3
"SUBWAY":3
"PORT":3
[Red]
"CHURCH":4
"SCHOOL":4
[Brown]
"SHOPPING PARK":5
"CAFE":5
[Green]
"HOSPITAL":5
"VETERINARY":5
[Orange]
"NUCLEAR POWER PLANT":6
"CAR FACTORY":6
"SPACE STATION":6

Po načítaní bude hrací plán obsahovať polia v nasledovnom poradí:

  1. START
  2. CINEMA
  3. JAIL PASS
  4. THEATER
  5. BAKERY
  6. STADIUM
  7. GOLF PARK
  8. IN JAIL
  9. AIRPORT
  10. JAIL PASS
  11. BUS STATION
  12. FREE PARKING
  13. SUBWAY
  14. PORT
  15. JAIL PASS
  16. CHURCH
  17. SCHOOL
  18. SHOPPING PARK
  19. GO TO JAIL
  20. CAFE
  21. JAIL PASS
  22. HOSPITAL

Poznámky:

  • V týchto príkladoch predpokladáme, že textové súbory sa nachádzajú v rovnakom priečinku ako skompilovaný program.
  • Ak databáza nehnuteľností obsahuje viac nehnuteľností ako si vyžaduje hrací plán, zvyšné nehnuteľnosti v databáze budú ignorované.

Výpisy

Ak nie sú zadané žiadne prepínače, neuskutoční sa žiadny výpis. V prípade zadania prepínačov sa výpisy riadia nasledovnými pravidlami.

Aktivuje sa len v prípade, že bol zadaný prepínač -t bez prepínača -b. Vypíše sa zoznam všetkých načítaných nehnuteľností, ktoré boli uložené v príslušnom textovom súbore. Každý vypísaný riadok predstavuje 1 nehnuteľnosť.

Príklad

Majme nasledovný textový súbor properties.txt s nehnuteľnosťami:

[Yellow]
"CINEMA":1
"THEATER":1
[Purple]
"BAKERY":2
[Skyblue]
"STADIUM":2
"GOLF PARK":2
[Blue]
"BUS STATION":3
[Red]
"SCHOOL":4
[Brown]
"SHOPPING PARK":5
[Green]
"HOSPITAL":5
[Orange]
"NUCLEAR POWER PLANT":6
"CAR FACTORY":6
"SPACE STATION":6

Spustenie programu:

./z5 -t properties.txt

Výpis načítaných nehnuteľností:

CINEMA               1  Yellow
THEATER              1  Yellow
BAKERY               2  Purple
STADIUM              2  Skyblue
GOLF PARK            2  Skyblue
BUS STATION          3  Blue
SCHOOL               4  Red
SHOPPING PARK        5  Brown
HOSPITAL             5  Green
NUCLEAR POWER PLANT  6  Orange
CAR FACTORY          6  Orange
SPACE STATION        6  Orange 

Každý riadok výpisu musí spĺňať formát, ktorý je uvedený na obrázku 4.


Obrázok 4: Formát výpisu načítaných nehnuteľností (každý riadok musí spĺňať daný formát) (veľký obrázok).

Aktivuje sa len v prípade, že bol zadaný prepínač -b (samostatne alebo spolu s prepínačom -t). Vypíše sa hrací plán, ktorý bol zadefinovaný v príslušnom textovom súbore. Každý vypísaný riadok predstavuje 1 pole na hracom pláne.

Príklad 1

Majme nasledovný textový súbor gameboard.txt s hracím plánom:

20
START
PROPERTY
PROPERTY
PROPERTY
JAIL PASS
PROPERTY
IN JAIL
PROPERTY
JAIL PASS
PROPERTY
PROPERTY
FREE PARKING
PROPERTY
JAIL PASS
PROPERTY
GO TO JAIL
PROPERTY
JAIL PASS
PROPERTY
PROPERTY

Spustenie programu:

./z5 -b gameboard.txt

Výpis načítaného hracieho plánu (použili sa nehnuteľnosti s predvolenej databázy):

1.   START
2.   FOOD TRUCK           1  Brown
3.   PIZZA RESTAURANT     1  Brown
4.   DOUGHNUT SHOP        1  Skyblue
5.   JAIL PASS
6.   ICE CREAM SHOP       1  Skyblue
7.   IN JAIL
8.   MUSEUM               2  Purple
9.   JAIL PASS
10.  LIBRARY              2  Purple
11.  THE PARK             2  Orange
12.  FREE PARKING
13.  THE BEACH            2  Orange
14.  JAIL PASS
15.  POST OFFICE          3  Red
16.  GO TO JAIL
17.  TRAIN STATION        3  Red
18.  JAIL PASS
19.  COMMUNITY GARDEN     3  Yellow
20.  PET RESCUE           3  Yellow

Príklad 2

Majme nasledovný textový súbor gameboard.txt s hracím plánom a textový súbor properties.txt s nehnuteľnosťami.

gameboard.txt
16
START
PROPERTY
PROPERTY
PROPERTY
IN JAIL
PROPERTY
JAIL PASS
PROPERTY
PROPERTY
FREE PARKING
PROPERTY
GO TO JAIL
PROPERTY
PROPERTY
PROPERTY
PROPERTY
properties.txt
[Yellow]
"CINEMA":1
"THEATER":1
[Purple]
"BAKERY":2
[Skyblue]
"STADIUM":2
"GOLF PARK":2
[Blue]
"BUS STATION":3
[Red]
"SCHOOL":4
[Brown]
"SHOPPING PARK":5
[Green]
"HOSPITAL":5
[Orange]
"NUCLEAR POWER PLANT":6
"CAR FACTORY":6
"SPACE STATION":6

Spustenie programu:

./z5 -b gameboard.txt -t properties.txt

Výpis načítaného hracieho plánu:

1.   START
2.   CINEMA               1  Yellow
3.   THEATER              1  Yellow
4.   BAKERY               2  Purple
5.   IN JAIL
6.   STADIUM              2  Skyblue
7.   JAIL PASS
8.   GOLF PARK            2  Skyblue
9.   BUS STATION          3  Blue
10.  FREE PARKING
11.  SCHOOL               4  Red
12.  GO TO JAIL
13.  SHOPPING PARK        5  Brown
14.  HOSPITAL             5  Green
15.  NUCLEAR POWER PLANT  6  Orange
16.  CAR FACTORY          6  Orange 

Každý riadok výpisu musí spĺňať formát, ktorý je uvedený na obrázku 5.



Obrázok 5: Formát výpisu načítaného hracieho plánu (hore: riadok s nehnuteľnosťou, dole: riadok so špeciálnym poľom) (veľké obrázky: hore, dole).

Chybové situácie

Počas behu programu môžu nastať 2 chybové situácie, ktoré sa týkajú textových súborov.

Chyba E1

Táto chyba nastane ak sa zadaný textový súbor nedá otvoriť, t.j. funkcia fopen vráti NULL. Táto situácia môže vzniknúť pri oboch prepínačoch (-b aj -t). Po odhalení tejto chyby program vypíše reťazec E1 a skončí (iné výpisy sa neuskutočnia).

Príklad

Majme neplatnú cestu k súboru s nehnuteľnosťami: C:/Users/invalid_path/file.txt
./z5 -t C:/Users/invalid_path/file.txt
Výpis programu:
E1
Chyba E2

Jedná sa o chybu počas načítavania hracieho plánu. Nastane vtedy, keď hrací plán obsahuje viac nehnuteľností ako je možné načítať z databázy nehnuteľností (textový súbor alebo predvolená databáza). Po odhalení tejto chyby program vypíše reťazec E2 a skončí (iné výpisy sa neuskutočnia).

Príklad

Majme nasledovné textové súbory:

gameboard.txt
11
START
PROPERTY
IN JAIL
PROPERTY
JAIL PASS
PROPERTY
PROPERTY
GO TO JAIL
PROPERTY
PROPERTY
PROPERTY

Poznámka: hrací plán obsahuje 7 nehnuteľností.

properties.txt
[Yellow]
"CINEMA":1
"THEATER":1
[Purple]
"BAKERY":2

Poznámka: databáza obsahuje 3 nehnuteľnosti.

Výpis programu:

E2

Diagram aplikácie

Činnosť aplikácie sa dá vyjadriť pomocou nasledovného diagramu.


Obrázok 6: Diagram aplikácie (veľký obrázok).


Projekt

Projekt má nasledovnú štruktúru:

├── CMakeLists.txt
├── include/
│   └── monopoly.h
└── src/
    ├── monopoly.c
    └── z5.c
CMakeLists.txt - súbor s konfiguráciou projektu
cmake_minimum_required(VERSION 3.24)
project(z5 C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -lm")

add_executable(z5 src/z5.c src/monopoly.c)
target_include_directories(z5 PRIVATE ${PROJECT_SOURCE_DIR}/include)
monopoly.h - ten istý súbor ako v zadaní 4

Poznámky:

  • pole space_types obsahuje názvy typov polí na hracom pláne
  • pole property_colors obsahuje názvy farieb nehnuteľností
  • pole properties predstavuje predvolenú databázu nehnuteľností
  • pole game_board je tu len z historických dôvodov (predstavovalo fixný hrací plán v zadaní 4), teraz sa však hrací plán načítava zo súboru
  • štruktúra PLAYER je tu len z historických dôvodov (reprezentovala hráčov v zadaní 4), teraz hráčov nepotrebujeme
#ifndef Z5_MONOPOLY_H
#define Z5_MONOPOLY_H

#include <stdio.h>

// Makra
#define MAX_NAME 100        // max. dlzka nazvu (bez znaku '\0')
#define NUM_PROPERTIES 16   // pocet nehnutelnosti na hracom plane
#define NUM_SPACES 24       // pocet poli na hracom plane
#define MAX_PLAYERS 4       // max. pocet hracov
#define NUM_SPACE_TYPES 6   // pocet typov poli na hracom plane
#define NUM_COLORS 8        // pocet farieb nehnutelnosti

// Definicie vlastnych datovych typov

// Typy poli na hracom plane
typedef enum _space_type {
    Property,       // nehnutelnost
    Start,          // startovacie pole
    Free_parking,   // specialne pole bez akcie
    In_jail,        // specialne pole, predstavuje vazenie
    Go_to_jail,     // specialne pole, ktore presunie hraca do vazenia
    Jail_pass       // specialne pole s priepustkou
} SPACE_TYPE;

// Farba nehnutelnosti
typedef enum _color {
    Brown,
    Skyblue,
    Purple,
    Orange,
    Red,
    Yellow,
    Green,
    Blue
} COLOR;

// Struktura pre nehnutelnost
typedef struct _property {
    char name[MAX_NAME + 1];    // nazov
    int price;                  // cena nehnutelnosti/vyska najomneho
    COLOR color;                // farba
} PROPERTY;

// Struktura pre pole na hracom plane
typedef struct _space {
    SPACE_TYPE type;        // typ pola na hracom plane
    PROPERTY *property;     // pointer na nehnutelnost ak je pole
                            // typu Property, inak NULL
} SPACE;

// Struktura pre hraca
typedef struct _player {
    int number;             // cislo hraca (1, 2, 3 alebo 4)
    int space_number;       // cislo pola, na ktorom stoji (pole Start ma cislo 1)
    int cash;               // hotovost hraca
    int num_jail_pass;      // pocet nazbieranych priepustiek z vazenia
    int is_in_jail;         // info, ci je hrac vo vazeni: 0 - nie je; 1 - je
    PROPERTY *owned_properties[NUM_PROPERTIES]; // zoznam kupenych nehnutelnosti
    int num_properties;                         // pocet kupenych nehnutelnosti
} PLAYER;

// Deklaracie premennych
extern const char *space_types[NUM_SPACE_TYPES];    // nazvy typov poli na hracom plane
extern const char *property_colors[NUM_COLORS];     // nazvy farieb nehnutelnosti
extern PROPERTY properties[NUM_PROPERTIES];         // zoznam vsetkych nehnutelnosti
extern SPACE game_board[NUM_SPACES];                // hraci plan s 24 poliami

#endif //Z5_MONOPOLY_H
monopoly.c - ten istý súbor ako v zadaní 4
#include "monopoly.h"

// nazvy typov poli na hracom plane
const char *space_types[NUM_SPACE_TYPES] = {
        "PROPERTY",
        "START",
        "FREE PARKING",
        "IN JAIL",
        "GO TO JAIL",
        "JAIL PASS"
};

// nazvy farieb nehnutelnosti
const char *property_colors[NUM_COLORS] = {
        "Brown",
        "Skyblue",
        "Purple",
        "Orange",
        "Red",
        "Yellow",
        "Green",
        "Blue"
};

// zoznam nehnutelnosti na hracom plane
PROPERTY properties[NUM_PROPERTIES] = {
        {.name = "FOOD TRUCK", .price = 1, .color = Brown},
        {.name = "PIZZA RESTAURANT", .price = 1, .color = Brown},
        {.name = "DOUGHNUT SHOP", .price = 1, .color = Skyblue},
        {.name = "ICE CREAM SHOP", .price = 1, .color = Skyblue},
        {.name = "MUSEUM", .price = 2, .color = Purple},
        {.name = "LIBRARY", .price = 2, .color = Purple},
        {.name = "THE PARK", .price = 2, .color = Orange},
        {.name = "THE BEACH", .price = 2, .color = Orange},
        {.name = "POST OFFICE", .price = 3, .color = Red},
        {.name = "TRAIN STATION", .price = 3, .color = Red},
        {.name = "COMMUNITY GARDEN", .price = 3, .color = Yellow},
        {.name = "PET RESCUE", .price = 3, .color = Yellow},
        {.name = "AQUARIUM", .price = 4, .color = Green},
        {.name = "THE ZOO", .price = 4, .color = Green},
        {.name = "WATER PARK", .price = 5, .color = Blue},
        {.name = "AMUSEMENT PARK", .price = 5, .color = Blue}
};

// inicializacia hracieho pola
SPACE game_board[NUM_SPACES] = {
        {.type = Start, .property = NULL},
        {.type = Property, .property = &properties[0]},
        {.type = Property, .property = &properties[1]},
        {.type = Jail_pass, .property = NULL},
        {.type = Property, .property =  &properties[2]},
        {.type = Property, .property =  &properties[3]},
        {.type = In_jail, .property =  NULL},
        {.type = Property, .property =  &properties[4]},
        {.type = Property, .property =  &properties[5]},
        {.type = Jail_pass, .property =  NULL},
        {.type = Property, .property =  &properties[6]},
        {.type = Property, .property =  &properties[7]},
        {.type = Free_parking, .property =  NULL},
        {.type = Property, .property =  &properties[8]},
        {.type = Property, .property =  &properties[9]},
        {.type = Jail_pass, .property =  NULL},
        {.type = Property, .property =  &properties[10]},
        {.type = Property, .property =  &properties[11]},
        {.type = Go_to_jail, .property =  NULL},
        {.type = Property, .property =  &properties[12]},
        {.type = Property, .property =  &properties[13]},
        {.type = Jail_pass, .property =  NULL},
        {.type = Property, .property =  &properties[14]},
        {.type = Property, .property =  &properties[15]}
};
z5.c - hlavný zdrojový súbor, v ktorom bude vypracované zadanie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "monopoly.h" // Nemenit !!!
// Nevkladat monopoly.c !!!

int main(int argc, char *argv[]) {
	// TODO
    return 0;
}

Hodnotenie zadania

Odovzdávací systém otestuje a ohodnotí nasledovné oblasti funkcionality vášho programu. Na získanie bodov za konkrétny testovací scenár je nutné, aby testom prešli všetky testovacie prípady v danom scenári.

Testovacie scenáre
Scenár 1
Chybová situácia E1
0,5 b
Scenár 2
Chybová situácia E2
1,0 b
Scenár 3
Len prepínač -t, celý výpis
3,0 b
Scenár 4
Len prepínač -b, celý výpis
1,5 b
Scenár 5
Súčasne prepínač -b aj -t, celý výpis
4,0 b
Súčet 10 b

Testovacie príklady

K dispozícii sú dva adresáre s testovacími textovými súbormi. Čísla na konci názvu súboru predstavujú počet nehnuteľností v príslušnej databáze (napr. properties8.txt je databáza s 8 nehnuteľnosťami) alebo počet nehnuteľností na hracom pláne (napr. gameboard19.txt je hrací plán s 19 nehnuteľnosťami). Čísla v pomenovaní textových súborov sú len pomôcka na lepšie orientovanie sa v testovacích súboroch. Textové súbory využívané testovacím serverom nemusia obsahovať tento číselný údaj a môžu mať ľubovoľný názov.

Dôležitá poznámka: pred testovaním si nakopírujte obidva adresáre do priečinku, kde sa nachádza váš skompilovaný program, t.j. aby vám fungovali príkazy spustenia programu v jednotlivých príkladoch.


Obrázok 7: Adresáre s testovacími súbormi.


Zoznam testovacích scenárov:

Scenár 1 Chybová situácia E1
s1

  • Príklad 1

    Poznámka: predpokladáme, že /home/wrong/path/file.txt je neplatná cesta.

    ./z5 -t /home/wrong/path/file.txt
    Výstup: stdout_01.txt
  • Príklad 2

    Poznámka: predpokladáme, že /wrong/path/file.txt je neplatná cesta.

    ./z5 -b /wrong/path/file.txt
    Výstup: stdout_02.txt
  • Príklad 3

    Poznámka: predpokladáme, že wrong1.txt a wrong2.txt sú neplatné cesty.

    ./z5 -b wrong1.txt -t wrong2.txt
    Výstup: stdout_03.txt
  • Príklad 4

    Poznámka: predpokladáme, že wrong1.txt je neplatná cesta.

    ./z5 -b wrong1.txt -t properties/properties16.txt
    Výstup: stdout_04.txt
  • Príklad 5

    Poznámka: predpokladáme, že wrong2.txt je neplatná cesta.

    ./z5 -b gameboard/gameboard2.txt -t wrong2.txt
    Výstup: stdout_05.txt
Scenár 2 Chybová situácia E2
s2

  • Príklad 1
    ./z5 -b gameboard/gameboard6.txt -t properties/properties3.txt
    Výstup: stdout_01.txt
  • Príklad 2
    ./z5 -b gameboard/gameboard16.txt -t properties/properties10.txt
    Výstup: stdout_02.txt
  • Príklad 3
    ./z5 -b gameboard/gameboard19.txt
    Výstup: stdout_03.txt
Scenár 3 Len prepínač -t, celý výpis
s3

  • Príklad 1
    ./z5 -t properties/properties3.txt
    Výstup: stdout_01.txt
  • Príklad 2
    ./z5 -t properties/properties8.txt
    Výstup: stdout_02.txt
  • Príklad 3
    ./z5 -t properties/properties10.txt
    Výstup: stdout_03.txt
  • Príklad 4
    ./z5 -t properties/properties16.txt
    Výstup: stdout_04.txt
  • Príklad 5
    ./z5 -t properties/properties18.txt
    Výstup: stdout_05.txt
Scenár 4 Len prepínač -b, celý výpis
s4

  • Príklad 1
    ./z5 -b gameboard/gameboard2.txt
    Výstup: stdout_01.txt
  • Príklad 2
    ./z5 -b gameboard/gameboard6.txt
    Výstup: stdout_02.txt
  • Príklad 3
    ./z5 -b gameboard/gameboard8.txt
    Výstup: stdout_03.txt
  • Príklad 4
    ./z5 -b gameboard/gameboard16.txt
    Výstup: stdout_04.txt
Scenár 5 Súčasne prepínač -b aj -t, celý výpis
s5

  • Príklad 1
    ./z5 -b gameboard/gameboard2.txt -t properties/properties3.txt
    Výstup: stdout_01.txt
  • Príklad 2
    ./z5 -b gameboard/gameboard2.txt -t properties/properties8.txt
    Výstup: stdout_02.txt
  • Príklad 3
    ./z5 -b gameboard/gameboard2.txt -t properties/properties10.txt
    Výstup: stdout_03.txt
  • Príklad 4
    ./z5 -b gameboard/gameboard2.txt -t properties/properties16.txt
    Výstup: stdout_04.txt
  • Príklad 5
    ./z5 -b gameboard/gameboard2.txt -t properties/properties18.txt
    Výstup: stdout_05.txt
  • Príklad 6
    ./z5 -b gameboard/gameboard6.txt -t properties/properties8.txt
    Výstup: stdout_06.txt
  • Príklad 7
    ./z5 -b gameboard/gameboard6.txt -t properties/properties10.txt
    Výstup: stdout_07.txt
  • Príklad 8
    ./z5 -b gameboard/gameboard6.txt -t properties/properties16.txt
    Výstup: stdout_08.txt
  • Príklad 9
    ./z5 -b gameboard/gameboard6.txt -t properties/properties18.txt
    Výstup: stdout_09.txt
  • Príklad 10
    ./z5 -b gameboard/gameboard8.txt -t properties/properties8.txt
    Výstup: stdout_10.txt
  • Príklad 11
    ./z5 -b gameboard/gameboard8.txt -t properties/properties10.txt
    Výstup: stdout_11.txt
  • Príklad 12
    ./z5 -b gameboard/gameboard8.txt -t properties/properties16.txt
    Výstup: stdout_12.txt
  • Príklad 13
    ./z5 -b gameboard/gameboard8.txt -t properties/properties18.txt
    Výstup: stdout_13.txt
  • Príklad 14
    ./z5 -b gameboard/gameboard16.txt -t properties/properties16.txt
    Výstup: stdout_14.txt
  • Príklad 15
    ./z5 -b gameboard/gameboard16.txt -t properties/properties18.txt
    Výstup: stdout_15.txt

Zdroje

Nasledujúce zdroje vám môžu pomôcť pri programovaní zadania. Odporúčame si tieto zdroje preštudovať. Na prístup k niektorým zdrojom potrebujete byť prihlásení vo vašom Google STU konte.

Prednášky

Jazyk C

Zdroje obrázkov

Copyright © 2024, Pavol Marák, ÚIM FEI STU.
Vyrobené pomocou Django a Spectre.css.
Regulárne výrazy testujeme pomocou Regular Expression 101.
Videá prehrávame pomocou Plyr prehrávača.