Projekt mapy, zorientowany obiektowo - co powinno być w klasie mapy?

Projekt mapy, zorientowany obiektowo - co powinno być w klasie mapy?
0

Myślę nad projektem mapy w c++, zorientowany obiektowo. Nie istotne czy wczytywany z pliku, czy generowany losowo.
Wymyśliłem coś takiego:

Kopiuj
class pole
{
private:
int ID;
int symbol; //w konsoli np. jakiś symbol reprezentujący, albo bitmapa.
int flag;
bool coolision;
public:
virtual void changes() = 0; //jakies akcje zachodzące w czasie na danym polu, np. jak sadzonka rośnie.
}

class tree : public pole //no i nowa klasa dla każdego pola, dla drzew,dla wody,dla kamieni itd.
{
private:
int wytrzymałość;//przykładowo tutaj dodaje wytrzymałość, np. ile uderzeń zanim drzewo zniknie.
public:
virtual void changes(){};
}

class mapa
{

}

Co według was powinno być w klasie mapa ?
Np. jeśli zrobimy generowanie losowe, to metoda generująca, ale potem do jakiego typu tablicowego mapy przypisywać te obiekty.
vector <typ> obiekt;

flowCRANE
Następnym razem, oprócz wstawiania kodu w znaczniki kolorujące składnię, nadaj także wątkowi sensowny tytuł;
MateuszS
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 5 lat
  • Postów:311
0

Myślę że jest OK jeśli chodzi o samą hierarchię. Główna klasa Mapa, która zawiera obiekty typu Pole (w jakiejś tablicy dwuwymiarowej, której indeksy mają przełożenie na pozycję Pola, w przeciwnym wypadku lepiej użyć czegoś z mniejszą złożonością operacji get (ale to też tylko gdy tych obiektów są tysiące a nie kilkadziesiąt)). Każde Pole to klasa bazowa dla konkretnych pól, np. typu Tree. Z tym że nie wiem czy klasa Mapa powinna mieć metodę generującą, czy to nie powinna być jakaś osobna klasa GeneratorMap. Nad tym trzeba by się zastanowić. Co do tego co powinno być w klasie Mapa to oczywiście jakiś getter dla konkretnych pozycji na mapie. Reszta wyjdzie w praniu.

0

Jak to obiekty typu Pole, przecież to jest klasa abstrakcyjna, nie można do niej tworzyć obiektów. Ewentualnie tablica wskaźników typu Pole, ale potem każdy z nich ustawić na klasę pochodną ?

MateuszS
Nie napisałem że musi to być klasa abstrakcyjna. Zaprezentowałem Ci tylko jedno z rozwiązań. W Twoim przypadku zastosuj polimorfizm. Pole * pole = new Tree(); I tyle. A czy klasa Pole będzie abstrakcyjna czy nie to Twój wybór.
KA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:71
0

Ja proponuje rozwiązanie z użyciem funkcji wirtualnych:

Kopiuj
#include <iostream>
#include <vector>


class thing {};

class field
{
public:
  virtual void affect(thing& object) {}

};

class tree 
  : public field
{
public:
  void affect(thing& object) 
  {
    std::cout << "It works!" << std::endl;
  }

};

class map
{
public:
  map()
  {
    fields_.push_back(new tree);

    thing object;
    for (const auto& field : fields_) {
      field->affect(object);
    }
  }

private:
  std::vector<field*> fields_;

};


int main(void)
{
  map m;
  return 0;
}
0

A dobrym pomysłem jest stworzenie metody wirtualnej dla obiektów, które posiadają w środku komendę wyświetlającą daną bitmapę w współrzędnych pobranych z prywatnego bloku klasy ? I potem w klasie mapa była by funkcja, która leci przez wszystkie pola tablicy wskaźników, sprawdza na co wskazuję i wywołuję daną funkcję rysującą bitmapę ?

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
  • Postów:2514
0

ja chyba bym z klasy mapa zrobił dokładnie jedną klasę, która by była tablicą kilku (2,3) wymiarową samych intów, gdzie int to ID. Druga klasa by miała mapowanie z ID na właściwości tego pola: (bitmapa, czy_blokuje itp., akcja).
Samą mapę bym zrobił tak:

Kopiuj
typedef int IdType;
template<class FieldType = IdType>
struct Map
{
private:
    FieldType* Data; // jednowymiarowa - indeksy implementujesz w stylu x*height + y
public:
  Map(size_t width, size_t height);
  // tutaj deskturktor, konstruktory kopiujace, move konstruktory itp...
  FieldType& GetField(size_t x, size_t y); // (albo dać bezpośredni dostęp do Data + funkcje pomocnicze)
  const Height; // chyba, że planujesz mapy które nie mają stałych rozmiarów, jeśli rozmiar znany w trakcie kompilacji to można w template wrzucic Width i Height
  const Width;
};

Dlaczego tak? Mapa to najniższy poziom w Twojej grze i musi działać szybko.

Raczej bym się skupił na MapCreator, który by tą strukturę wypełniał. W nim bym zrobił, żeby przyjmował tylko strumień, jak ktoś chce mieć plik to strumień będzie plikiem, jak z pamięci to MemoryStream czy coś w ten deseń.


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 4x, ostatnio: krwq
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)