mikroNinjago-J.G

mail@pastecode.io avatar
unknown
c_cpp
3 years ago
7.6 kB
2
Indexable
Never

#include <iostream>

#include <stdlib.h>
#include <string.h>
#include <map>



using namespace std;



int random(int min, int max) //range : [min, max]
{
   static bool first = true;
   if (first) 
   {  
      srand( time(NULL) ); //seeding for the first time only!
      first = false;
   }
   return min + rand() % (( max + 1 ) - min);
}
 
/*

     1) Jak wygląda zapis do obiektu?

        - Zapisujemy bezpośrednio dane do obiektu.



     2) Czy zapis jest podobny do struktury?

         - Tak



     3) Kto może zapisywać do obiektu?

         - W przypadku pól publicznych, każdy.



     4) Różnice między klasą a strukturą

         - Pola klasy są domyślnie prywatne. (hermetyzacja)



     5) Zastanowić się czym klasa różni się w tym wypadku od struktury? Mamy
   tylko dane, cechy, atrybuty. Jakaś różnica? Po co nam zatem obiekty?

       - Mozna je tworzyc n razy.



     6) Jak wygląda odczyt, i kto może czytać z obiektu?

         - Pola są publiczne wiec odczyt może się odbywać bezpośrednio z obiektu

         - Każdy może czytać z obiektu



     7) Jak tworzone i obsługiwane są zmienne obiektowe tego typu?

         - Zmienna statyczna inicjalizująca się w momencie deklaracji, w
   przeciwieństwie do zmiennej dynamicznej, programista nie ma kontroli nad tym
   kiedy taka zmiena zostanie zniszczona.



     */

class Postac {
     /*
       1) Wyjaśnić kwestię sekcji dostępu do elementów obiektu
        - elementy są możliwe do modyfikacji tylko w przypadku gdy są publiczne. W sytuacji elementów prywatnych, mogą one zostać zmodyfikowane w tylko w zakresie klasy.
       2) Podać przykłady zastosowania i sens takich funkcjonalności.
        - Hermetyzacja zapobiega przed nieoczekiwanymi modyfikacjami klasy przez osoby zewnetrzne. Np dostęp do klasy będącej częścią biblioteki o określonym api. 
     */
 private:
  string rasa;
  string imie;
  int obrona;
  int atak;
  int szybkosc;

 public:
  void odczyt() {
    cout << "Gatunek: " << rasa << endl;
    cout << "Imię: " + imie << endl;
    cout << "Obrona: " + to_string(obrona) << endl;
    cout << "Atak: " + to_string(atak) << endl;
    cout << "Szybkość: " + to_string(szybkosc) << endl;
  }

  void ustawRase(string wybranaRasa) { rasa = wybranaRasa; }

  void ustawNick(string wybranyNick) { imie = wybranyNick; }

  int zwrocObrone() {
      return obrona;
  }

  int zwrocAtak() {
      return atak;
  }

  int zwrocSzybkosc() {
      return szybkosc;
  }

  string zwrocNick() {
      return imie;
  }

  void pokazDane() {
    /*
     1) Czy metoda ma dostęp do wnętrza klasy?
        - Tak
     2) Omówić metodykę tworzenia identyfikatorów w stylu camelCase oraz
     snake_case.
       - Identyfikatory w metodyce camelCase są tworzone w taki sposób że
     pierwsza litera każdego wyrazu np funkcji (nie licząc pierwszego) jest
     pisana z wielkiej litery, w przypadku snake_case wyrazy łączymy za pomocą _
     3) Jak działa taka metoda dodawania danych i odczytu?
       - pokazDane -> Pobiera dane następnie wyświetla za pomocą cout
       - wczytajDane -> zapisuje w klasie wartosci przekazane przez cin
     4) Omówić porządek w kodzie dzięki zamknięciu danych w obiektach.
       - Dzięki zastosowaniu klas w prosty sposób możemy porządkować logikę
     wspólną dla wielu elementów. Dodatkowo umożliwia nam segregację elementów w
     sposób logiczny i zwięzły.
     5) Sprawdzić ile pamięci zajmuje obiekt.
      - Zajmuje 64
    */
    cout << "Mój gatunek to " << rasa << endl;
    cout << "Nazywam się  " + imie << endl;
    cout << "Mam takie moce: " << endl;
    cout << " 1) Atak: " + to_string(atak) << endl;
    cout << " 2) Szybkość: " + to_string(szybkosc) << endl;
    cout << " 3) Obrona: " + to_string(obrona) << endl;
  }

  void wczytajDane() {
    cout << "Edycja danych dla " << rasa << endl;
    cout << "Wpisz Imię" << endl;
    cin >> imie;
    cout << "Wpisz Atak" << endl;
    cin >> atak;
    cout << "Wpisz Szybkość" << endl;
    cin >> szybkosc;
    cout << "Wpisz Obronę" << endl;
    cin >> obrona;
  }

  void wczytajDaneLosowe() {
    atak = random(1,100);
    szybkosc = random(1,100);
    obrona = random(1,100);
  }
};

class MikroNinjago {
    public: 
     void start() {
        isRunning = true;
        showMenu();
     }

      MikroNinjago() {
         avaiableSpecializations["Z"] = "zwiadowca";
         avaiableSpecializations["M"] = "mag";
         avaiableSpecializations["W"] = "wojownik";

    } 
    private: 
     bool isRunning;
     char menuSelection;
     Postac* playerA = NULL;
     Postac* playerB = NULL;
     map<string, string> avaiableSpecializations;

     void showMenu() {
         while(isRunning) {
           cout << "Menu gry: " << endl;
           if(playerA == NULL && playerB == NULL ) {
             cout << "1) Dodaj graczy (A)" << endl;
           }else {
               cout << "1) Rozpocznij grę " << playerA->zwrocNick() << " VS " << playerB->zwrocNick() << " (S)" << endl;
           }
           cout << "2) Zakończ (Z)" << endl;
           cout << "Wybierz opcję: " << endl;
           cin >> menuSelection;
           handleMenuSelection();
         }
     }

     void handleMenuSelection() {
       switch (menuSelection)
       {
       case 'A':
           onPlayerAdd();
           break;

       case 'Z':
           isRunning = false;
           break;     

       case 'S':
           getWinResult();
           break;            
       default:
           break;
       }
     }
     
     void getWinResult() {
         Postac* winner = comparePlayers();
         cout << "Wygrywa: " << endl;
         cout << winner->zwrocNick() << "!!!" << endl;
         playerA = NULL;
         playerB = NULL;
     }
     Postac* comparePlayers() {
        if(playerA->zwrocAtak() > playerB->zwrocObrone()) {
            return playerA;
        }

        if(playerB->zwrocAtak() > playerA->zwrocObrone()) {
          return playerB;
        }

        if(playerB->zwrocSzybkosc() > playerA->zwrocSzybkosc()){
            return playerB;
        }
        return playerA;
     }

     void onPlayerAdd() {
     string answer;

        if(playerA == NULL) {
            cout << "Wybierz klasę dla gracza nr 1" << endl;
            showAvaiableClasses();
            cin >> answer;
            string specialization = avaiableSpecializations.at(answer);
            playerA = new Postac();
            setPlayerSetting(playerA, specialization);
        }

         if(playerB == NULL) {
            cout << "Wybierz klasę dla gracza nr 2" << endl;
            showAvaiableClasses();
            cin >> answer;
            string specialization = avaiableSpecializations.at(answer);
            playerB = new Postac();
            setPlayerSetting(playerB, specialization);
        }
     }

     void showAvaiableClasses() {
         cout << "1) Wojownik (W)" << endl;
         cout << "2) Mag (M)" << endl;
         cout << "3) Zwiadowca (Z)" << endl;
     }

     void setPlayerSetting(Postac* currentPlayer, string specialization){
           string nick;
            cout << "################" << endl;
            currentPlayer->ustawRase(specialization);
            cout << "Wpisz nick" << endl;
            cin >> nick;
            currentPlayer->ustawNick(nick);
            currentPlayer->wczytajDaneLosowe();
            currentPlayer->odczyt();
            cout << "################" << endl;
     }
     
};

int main() {
   MikroNinjago game = MikroNinjago();
   game.start(); 
  return 0;
}