mikroNinjago-J.G
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; }