11 Dokumentacja biblioteki json_generator.py
Jakub Radowicz edited this page 2021-05-01 00:28:12 +02:00

Autor: Jakub Radowicz | Data utworzenia: 24.03.2021 | Wersja: 0.4

Spis treści:

1 Przeznaczenie klasy JsonGenerator - krótki wstęp

2 Ogólna zasada działania klasy JsonGenerator

3 Powiązane pliki

       3.1 - project_constants.py

4 Struktura danych

       4.1 - Python

       4.2 - Json

5.1 Metody oraz konstruktor

       5.1.1 - konstruktor - JsonGenerator(agents_initial_position=(0, 0), agents_initial_direction=Direction.Up.Value)

       5.1.2 - set_agents_initial_state(position=(0, 0), direction=Diretion.Up.value)

       5.1.3 - generate_randomized_grid(dimensions, mine_appearance_chance=0.15, predecessor_chance_decrease=0.25)

       5.1.4 - add_tile(position, color)

       5.1.5 - add_tile_with_a_mine(position, color, mine_type, attribute_values)

       5.1.6 - delete_a_tile(position)

       5.1.7 - set_a_mine(position, mine_type, attribute_values)

       5.1.8 - delete_a_mine(position)

       5.1.9 - get_tile(position)

       5.1.10 - get_mine(position)

       5.1.11 - get_grid()

       5.1.12 - clear_grid()

       5.1.13 - load_from_a_file(file_path)

       5.1.14 - save_to_a_file(file_path, access_mode)

       5.1.15 - edit_a_file(file_path)

5.2 Funkcje statyczne

       5.2.1 - create_a_mine(mine_dict, position)

       5.2.2 - create_a_tile(tile_dict, position)

       5.2.3 - get_chained_mine_and_its_predecessor_pairs(minefield_dictionary)

       5.2.4 - format_position_to_str(position)

       5.2.5 - format_position_to_tuple(position)

6 Przykładowe dane

       6.1 - krata [3*3]

1 Przeznaczenie klasy JsonGenerator - krótki wstęp

Klasa JsonGenerator służy do generowania/edytowania/tworzenia, oraz zapisu/odczytu cech krat (map) z których generowane będą środowiska działania agenta. Cechy krat zapisywane są w formie struktury Json. Dzięki tej klasie można tworzyć pola o różnych kolorach, miny o różnych typach, zapisać startową pozycję agenta. Następnie możliwe jest zapisanie utworzonych danych w plikach, ich odczyt, a także pobranie danych w formie słownika.

Klasa JsonGenerator nie zwraca środowiska w którym agent może działać, a jedynie dane z których takie środowisko można utworzyć.

2 Ogólna zasada działania klasy JsonGenerator

Jedna instancja klasy JsonGenerator w każdym momencie może służyć tylko do edycji danych jednej kraty. Dane na temat kraty są przechowywane w polu grid, który jest słownikiem. Wywoływanie metod edytujących cechy kraty edytuje słownik grid. W wypadku zapisu danych do pliku plik Json jest generowany na podstawie stanu pola grid, a w wypadku wczytywania kraty dane są wczytywane do tego pola. Aktualny stan słownika grid można pobrać za pomocą metody get_grid().

Pole grid składa się ze słowników przechowywujących dane odpowiednich pól na planszy. Pola te identyfikowane są po numerze wiersza i kolumny w jakiej się znajdują. Przy czym implementacje metod zawartych w tej klasie zakładają, że numer wiersza oraz kolumny numeruje się od zera. Następnie te słowniki mogą w polu mine zawierać (nie muszą) podobne struktury logiczne przechowywujące informacje na temat min.

Wizualizacja numerowania danych w macierzy przyjęta w projekcie:

[0][0]  [0][1]  [0][2]  [0][3]  ...
[1][0]  [1][1]  [1][2]  [1][3]  ...
[2][0]  [2][1]  [2][2]  [2][3]  ...
   ...        ...        ...        ...

Wizualizacja zapożyczona z dokumentacji Minefield (aut. Bartłomieja Grochowskiego)

3 Powiązane pliki

3.1 project_constants.py

Plik ten zawiera różnego rodzaju stałe wartości jak również szablony obiektów, na podstawie których klasa JsonGenerator generuje i zapisuje obiekty JSON. Wszystkie istotne dla działania klasy obiekty znajdują się w sekcji STRUCTS -> USED BY JSON GENERATOR tego pliku.

STRUCT_TILE_COLORS - tablica zawierająca nazwy kolorów kafelków, za pomocą której klasa JsonGenerator tworzy dane losowych plansz.

STRUCT_MINE_TYPES - tablica zawierająca nazwy typów min, za pomocą której klasa JsonGenerator tworzy dane losowych plansz.

HARDCODED_VALUES - tablica w której zdefiniowane są pola kluczy z wartościami na stałe przypisanymi minom, aby nie dało się ich zmienić przy zmianach specjalnych parametrów min.

STRUCT_MINE_ATTRIBUTES - słownik, zawierający podstawowe szablony min z wartościami domyślnymi. Używany do konstruowania obiektów JSON.

STRUCT_MINE_ATTRIBUTE_TYPES - słownik zawierający dane pomocnicze do generowania losowych plansz. Dane te to informacje na temat jaki typ specjalnych danych należy wygenerować dla poszczególnych min.

4 Struktura danych

4.1 Python

Legenda:

Ogólne:
grid - słownik w którym przechowywane są dane na temat kraty

Początkowy stan agenta:
position - "row,column"
direction - int (wartość z enum'a Direction, istniejącego w pliku project_constants.py)

Miny - wspólne:
row, column - pozycja kafelka
color - kolor kafelka
mine - mina która stoi na danym kafelku (nieobowiązkowo)
mine_type - typ miny na kafelku (o ile mina istnieje)

Miny - ChainedMine:
predecessor - poprzednik miny
p_row, p_column - pozycja poprzednika miny

Miny - TimeMine:
timer - pole zawierające czas do detonacji
time_until_detonation - czas do detonacji

grid["agents_initial_state"] = {
    "position": position,
    "direction": direction
}

grid["row,column"] = {
    "color": color,
  "mine": None
}

grid["row,column"] = {
    "color": color,
  "mine": {
    "mine_type": "standard"
  }
}

grid["row,column"] = {
    "color": color,
  "mine": {
    "mine_type": "chained",
    "predecessor": "p_row,p_column"
  }
}

grid["row,column"] = {
    "color": color,
  "mine": {
    "mine_type": "time",
    "timer": time_until_detonation
  }
}

4.2 Json

Legenda:

Początkowy stan agenta:
position - "row,column"
direction - int (wartość z enum'a Direction, istniejącego w pliku project_constants.py)

Miny - wspólne:
rowi, columni - pozycja i-tego kafelka
color - kolor kafelka
mine - mina która stoi na danym kafelku (nieobowiązkowo)
mine_type - typ miny na kafelku (o ile mina istnieje)

Miny - ChainedMine:
predecessor - poprzednik miny
p_row, p_column - pozycja poprzednika miny

Miny - TimeMine:
timer - pole zawierające czas do detonacji
time_until_detonation - czas do detonacji

{ // start of json
  "agents_initial_state": {
    "direction": direction,
    "position": position
  }
  
  "row1,column1": {
    "color": color1,
    "mine": null
  }
  
  "row2,column2": {
    "color": color2,
    "mine": {
      "asset": StandardMineAssetLetter,
        "mine_type": "standard"
        }
    } 
    
  "row3,column3": {
    "color": color3,
    "mine": {
      "asset": ChainedMineAssetLetter,
      "mine_type": "chained",
      "predecessor": "p_row,p_column"
    }
  }
  
  "row4,column4": {
    "color": color4,
    "mine": {
      "asset": TimeMineAssetLetter,
      "mine_type": "time",
      "timer": time_to_detonation
    }
  }
  
  ... // other tile instances
} // end of json

5.1 Metody oraz konstruktor

5.1.1 - konstruktor - JsonGenerator(agents_initial_position=(0, 0), agents_initial_direction=Direction.Up.value)

agents_initial_position - (row: int, column: int)
agents_initial_direction - int (wartość z enum'a Direction, istniejącego w pliku project_constants.py)

Do konstruktora można przekazać parametry, ustawiające pozycje startową agenta i jego kierunek zwrotu. Wartoście te można zmieniać za pomocą metody set_agents_initial_state(position, direction).


5.1.2 - set_agents_initial_state(position=(0, 0), direction=Direction.Up.value)

position - (row: int, column: int)
direction - int int (wartość z enum'a Direction, istniejącego w pliku project_constants.py)

Modyfikuje dane odpowiadające stanu początkowemu agenta. Ustawia pozycje początkową oraz początkowy kierunek zwrotu agenta. Dane te są zapisane i przy tworzeniu dowolnej kraty są wykorzystywane. (nie dotyczy wczytywania kraty z plików)


5.1.3 - generate_randomized_grid(dimensions, mine_appearance_chance=0.15, predecessor_chance_decrease=0.25)

dimensions - (num_of_rows: int, num_of_columns: int)
mine_appearance_chance - float (szansa wystąpienia dowolnej miny na polu wyrażona w miarze [0,1]*100%)

Tworzy kratę o podanych wymiarach z losowymi polami oraz minami. Szansa na wystąpienie miny na polu jest zależna od parametrów przekazywanych do funkcji. Usuwa poprzednio istniejącą kratę. Pozycja startowa agenta nie jest losowa, tylko brana z pola agent_starting_position.

5.1.4 - add_tile(position, color)

position - (row: int, column: int) | "row,column"
color - color: string

Tworzy wpis o polu bez miny o podanym kolorze na podanej pozycji. W razie istnienia wpisu pola na podanej pozycji, wcześniej istniejący wpis jest nadpisywany.

5.1.5 - add_tile_with_a_mine(position, color, mine_type, attribute_values=[])

position - (row: int, column: int) | "row,column"
color - color: string
minetype - mine_type: string (char)
attribute_values - [value: basic_type]

Tworzy wpis o polu z miną na podanej pozycji. Pole jest ma przypisany kolor color, oraz minę o typie mine_type. Jeśli mina jest specjalnego typu i posiada zdefiniowane pola inne niż te z abstrakcyjnej klasy Mine, to można je nadpisać przekazując listę wartości w miejsce argumentu attribute_values. W razie istnienia miny w podanym polu typ miny jest nadpisywany. W razie istnienia wpisu pola na podanej pozycji, wcześniej istniejący wpis jest nadpisywany.

Przykład dla tworzenia kafelka z miną typu ChainedMine:
add_a_tile_with_a_mine((row1,column1), "some_color", "chained", ["row2,column2"]), gdzie row2, column2, to pozycja następnika.

5.1.6 - delete_a_tile(position)

position - (row: int, column: int) | "row,column"

Usuwa wpis o polu z podanej pozycji.

5.1.7 - set_a_mine(position, mine_type, attribute_values)

position - (row: int, column: int) | "row,column"
mine_type - mine_type: string (char)
attribute_values - [value: basic_type]

Dodaje do wpisu pola na podanej pozycji minę typu mine_type. Jeśli mina jest specjalnego typu i posiada zdefiniowane pola inne niż te z abstrakcyjnej klasy Mine, to można je nadpisać przekazując listę wartości w miejsce argumentu attribute_values. W razie istnienia miny w podanym polu typ miny jest nadpisywany.

Przykład dla miny typu ChainedMine, która posiada jedno dodatkowe pole (predecessor):
add_a_mine((row1,column1), "chained", ["row2,column2"]), gdzie row2, column2, to pozycja następnika.

5.1.8 - delete_a_mine(position)

position - (row: int, column: int) | "row,column"

Usuwa z wpisu pola na podanej pozycji minę.

5.1.9 - get_tile(position)

position - (row: int, column: int) | "row,column"

Zwraca słownik z danymi na temat pola na pozycji position.

5.1.10 - get_mine(position)

position - (row: int, column: int) | "row,column"

Zwraca słownik z danymi na temat miny istniejącej na pozycji position, lub wartość None jeśli mina nie istnieje.

5.1.11 - get_grid()

Zwraca słownik zawierające dane na temat wszystkich pól zdefiniowanych w obecnym stanie instancji klasy. Innymi słowy zwraca pole grid.

5.1.12 - clear_grid()

Usuwa wszystkie wpisy ze słownika grid. Nie usuwa pozycji startowej agenta.

5.1.13 - load_from_a_file(file_path)

file_path - string (ścieżka do pliku)

Wczytuje do własnego słownika grid dane z jsona. Poprzednio składowana mapa przepada.

5.1.14 - save_to_a_file(file_path, access_mode)

file_path - string (ścieżka do pliku)
access_mode - ('w' - write) or ('a' - append)

Zapisuje obecny stan słownika grid do pliku za pomocą podanej metody dostępu ('w' - write, 'a' - append).

5.1.15 - edit_a_file(file_path)

file_path - string (ścieżka do pliku)

Działa jak metoda save_to_afile(file_path, access_mode) ale edytuje tylko te wpisy które zostały utworzone w obecnej wersji pola grid, jeśli pole(x,y) istnieje w pliku edytowanym, ale nie zostało na nowo zdefiniowane w tej instancji klasy to pozostanie ono w pliku edytowanym bez zmian.

5.2 Funkcje statyczne

5.2.1 - create_a_mine(mine_dict, position)

mine_dict - słownik zawierający informacje na temat miny. (można pozyskać za pomocą get_mine(position) [5.1.10])
position - (row: int, column: int) | "row,column"

Zwraca instancję klasy StandardMine, lub ChainedMine, lub TimeMine zależnie od danych przekazanych w słowniku. Ustawia parametry min, z wyjątkiem poprzednika miny łańcuchowej, jako że funkcja nie ma dostępu do poprzednika takiej miny.

5.2.2 - create_a_tile(tile_dict, position)

tile_dict - słownik zawierający informacje na temat pola. (można pozyskać za pomocą get_tile(position) [5.1.9])
position - (row: int, column: int) | "row,column"

Zwraca instancję klasy Tile z parametrami zależnymi od przekazanego słownika zawierającego informacje na temat tworzonego pola. W wypadku tworzenia pola z miną łańcuchową, nie przypisuje minie łańcuchowej poprzednika jako że nie ma dostępu do poprzednika takiej miny.

5.2.3 - get_chained_mine_and_its_predecessor_pairs(minefield_dictionary)

minefield_dictionary - słownik zawierający informacje na temat kraty. (składającej się z wielu pól)

Zwraca listę par - mina łańcuchowa i jej poprzednik - istniejących w przekazanym słowniku zawierającym informacje na temat pól i ich min.

Format zwracanych danych: [(chained_mine_position, its_predecessor_position), ...]
gdzie position - (row: int, column: int)

5.2.4 format_position_to_str(position)

position - (row: int, column: int) | "row,column"

Zwraca pozycje w formacie "row,column", lub wartość None, gdy wprowadzone zostały niepoprawne dane.

5.2.5 format_position_to_tuple(position)

position - (row: int, column: int) | "row,column"

Zwraca pozycje w formacie (row: int, column: int), lub wartość None, gdy wprowadzone zostały niepoprawne dane.

6 Przykładowe dane

6.1 krata [3*3]

Kod wykorzystany do wygenerowania kraty:

import json_generator as jg

json_generator = jg.JsonGenerator()
json_generator.generate_randomized_grid((3, 3), 0.5, 1)


{
  "0,0": {
    "color": "PURPLE",
    "mine": null
  },
  "0,1": {
    "color": "GREEN",
    "mine": null
  },
  "0,2": {
    "color": "RED",
    "mine": {
      "mine_type": "time",
      "timer": 8
    }
  },
  "1,0": {
    "color": "RED",
    "mine": {
      "mine_type": "chained",
      "predecessor": null
    }
  },
  "1,1": {
    "color": "GREEN",
    "mine": {
      "mine_type": "standard"
    }
  },
  "1,2": {
    "color": "PURPLE",
    "mine": null
  },
  "2,0": {
    "color": "RED",
    "mine": {
      "mine_type": "chained",
      "predecessor": "1,0"
    }
  },
  "2,1": {
    "color": "BLUE",
    "mine": null
  },
  "2,2": {
    "color": "GREEN",
    "mine": null
  },
  "agents_initial_state": {
    "direction": 0,
    "position": "0,0"
  }
}