mikroNinjago-J.G
unknown
c_cpp
4 years ago
7.6 kB
6
Indexable
#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;
}Editor is loading...