• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziedziczenie zmiennej typu wyliczeniowego.

Object Storage Arubacloud
0 głosów
211 wizyt
pytanie zadane 28 października 2016 w C i C++ przez PaulW Początkujący (470 p.)

Witam mam pytanie , otóż chciałbym zrobić aby po kliknięciu któregoś klawisza wrócić do menu gry.

// main.cpp
#include <iostream>       // biblioteka wejscia / wyjscia
#include "pilka.h"        // dyrektywa #include załącza plik nagłówkowy "pilka.h"
#include "paletka.h"      // dyrektywa #include załącza plik nagłówkowy "paletka.h"
#include "menedzer.h"     // dyrektywa #include załącza plik nagłówkowy "menedzer.h"
#include "gra.h"
using namespace std;      // użycie przestrzeni nazw "std"

int main()
{
    Gra g1;
    g1.uruchomGre();
    return 0;
}

//gra.h

#include <iostream>
#include "pilka.h"        // dyrektywa #include załącza plik nagłówkowy "pilka.h"
#include "paletka.h"      // dyrektywa #include załącza plik nagłówkowy "paletka.h"
#include "menedzer.h"     // dyrektywa #include załącza plik nagłówkowy "menedzer.h"

using namespace std;

class Gra
{
public:
    Gra();
    enum opcje{MENU = 0 , GRA = 1 , USTAWIENIA = 2 , KONIEC = 3 , OUT};
    void uruchomGre();
    opcje stangry;
private:
    int wybranaopcja = 0;
    char znak;
    void menu();
    void czysc();

};

//gra.cpp

#include "iostream"
#include "gra.h"
#include "conio.h"
#include "windows.h"
using namespace std;

Gra::Gra()
{
    stangry = MENU;
}
void Gra::uruchomGre()
{
    while(stangry != KONIEC)
    {
        switch(stangry)
        {
        case MENU:
            menu();
            break;
        case GRA:
             Menedzer m1(40 , 20);
             m1.start();
             break;
        }
    }
}

void Gra::menu()
{
    while(stangry == MENU)
    {
        while( wybranaopcja != 3 ) // jeżeli zmienna "wybranaopcja" jest różna od 3 (menu posiada tylko 3 opcje)
        {
        czysc();
        if( wybranaopcja == 0 ) cout << "-->Graj\n";         // opcje menu
        else cout << "Graj    \n";                            // przy przejściu do następnej opcji

        if( wybranaopcja == 1 ) cout << "-->Ustawienia\n";   // pokazuje się "-->"
        else cout << "Ustawienia    \n";

        if( wybranaopcja == 2 ) cout << "-->Wyjdz\n";        // -//-
        else cout << "Wyjdz    \n";

        znak = getch(); // odczytuje kod wciśniętego klawisza klawiatury i przechowuje go w zmiennej "znak"

        switch( znak )
        {
        case 72:                // jeżeli wciśniemy strzałkę w górę "kod ASCII = 72"
            wybranaopcja--;     // opcja menu zmniejsza się
            break;
        case 80:
            wybranaopcja++;    // jeżeli wciśniemy strzałkę w dół "kod ASCII = 80"
            break;             // opcja menu zwiększa się
        }

        if(wybranaopcja > 2 ) wybranaopcja--; // jeżeli wybrana opcja jest > 2 to zmniejsz wartość zmiennej "wybranaopcja"
        if(wybranaopcja < 0) wybranaopcja++; // jeżeli wybrana opcja jest < 0 to zwiększ wartość zmiennej "wybranaopcja"

        if(wybranaopcja == 0 && znak == 13) // jeżeli opcja == 0 ( Play ) i wciśniemy klawisz "Enter"
        {
            stangry = GRA; // wyjdź z menu (przejście do gry)
            break;
        }

        if(wybranaopcja == 1 && znak == 13) // jeżeli opcja == 0 ( Play ) i wciśniemy klawisz "Enter"
        {
            stangry = USTAWIENIA; // wyjdź z menu (przejście do gry)
        }

        if(wybranaopcja == 2 && znak == 13) // jeżeli opcja == 2 ( Settings ) i wciśniemy klawisz "Enter"
        {
            stangry = KONIEC;
            break;
        }
        }
    }
}

void Gra::czysc()
{
    COORD cord;       // klatki planszy są rysowane jedna na drugiej
    cord.X = 0;        // dzięki czemu migotanie konsoli jest mocno ograniczone
    cord.Y = 0;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord );
}

// menedzer.cpp

 void Menedzer::wejscie()
    {
    pilka->ruch(); // wywołanie funkcji na rzecz obiektu pilka

    int pilkax = pilka->getX(); // zmienna "pilkax" przechowuje współrz. x "pilka"
    int pilkay = pilka->getY(); // zmienna "pilkay" przechowuje współrz. y "pilka"
    int gracz1x = gracz1->getX(); // zmienna "gracz1x" przechowuje współrz. x "gracz1"
    int gracz2x = gracz2->getX(); // zmienna "gracz2x" przechowuje współrz. x "gracz2"
    int gracz1y = gracz1->getY(); // zmienna "gracz1y" przechowuje współrz. y "gracz1"
    int gracz2y = gracz2->getY(); // zmienna "gracz2y" przechowuje współrz. y "gracz2"

    if(_kbhit()) // sprawdza czy w buforze klawiatury znajdują się dane do odczytania , jeśli tak zwraca wartość 1 (true)
        {
        char klawisz = getch(); // zmienna klawisz przechowuje pojedyńczy znak odczytany z klawiatury
        if (klawisz == gora1) // po wciśnięciu odpowiedniego klawiszu
            if(gracz1y > 0)   // jeżeli współrz. y "gracz1" jest > 0
                gracz1->ruchGora(); // na rzecz obiektu gracz1 wywołana zostaje funkcja "ruchGora" poruszająca paletkę do góry

        if (klawisz == gora2) // -//-
            if(gracz2y > 0) // -//-
                gracz2->ruchGora(); // -//-

        if (klawisz == dol1) // -//-
            if(gracz1y + 4 < wysokosc - 1) // -//-
                gracz1->ruchDol(); // -//-

        if (klawisz == dol2) // -//-
            if(gracz2y + 4 < wysokosc - 1) // -//-
                gracz2->ruchDol(); // -//-

        if(pilka->getKierunek() == STOP) // jeżeli piłka nie porusza się
            pilka->losowyKierunek();     // zostaje nadany piłce losowy kierunek

        if(klawisz == 27)   // Esc - wyjście z gry
            exit(0);

        if(klawisz == 112) // P - Pauza ( piłka zostaje ustawiona na środek boiska)
            pilka->reset();

        if(klawisz == 110) // N - nowa gra
        {
            wynikReset();    // wynik1 i wynik2 przyjmują wartość 0
            pilka->reset();  // piłka zostaje ustawiona na środek boiska
            gracz1->reset(); // "gracz1" wraca na pozycję początkową
            gracz2->reset(); // "gracz2" wraca na pozycję początkową
        }
        if(wynik1 == 5) // jeżeli "gracz1" zdobędzie 5 punków
        {
           cout << endl << endl << " GRATULACJE !! " << endl << "WYGRAL : I GRACZ"; // wyświetla się napis
           wynikReset();    // wynik zostaje wyzerowany
           pilka->reset();  // "pilka" wraca na pozycję początkową
           gracz1->reset(); // "gracz1" wraca na pozycję początkową
           gracz2->reset(); // "gracz2" wraca na pozycję początkową
        }
        if(wynik2 == 5) // -//-
        {
           cout << endl << endl << " GRATULACJE !! " << endl << "WYGRAL : II GRACZ"; // -//-
           wynikReset(); // -//-
           pilka->reset(); // -//-
           gracz1->reset(); // -//-
           gracz2->reset(); // -//-
        }

        }
    }

 


Proszę o nakierowanie co trzeba zrobić . Załączam jeszcze okno z grą , Jak już wspomniałem , moim celem jest po kliknięciu klawisza "Esc" wrócić do menu gry , a nie zakończyć program . 

komentarz 28 października 2016 przez DragonCoder Nałogowiec (36,500 p.)
Warunek if albo case gdzie umieszczasz kod Ascii i gdy ktos wcisnie to przechodzisz do funkcji menu, ktora odpale gre... to najlatwiejszy sposob, hoto ktorego kaze sie unikac i to tyle

1 odpowiedź

0 głosów
odpowiedź 28 października 2016 przez draghan VIP (106,230 p.)
wybrane 28 października 2016 przez PaulW
 
Najlepsza
W momencie wciskania ESC, musisz sprawdzić stan gry - jeśli to menu, wtedy wychodzisz z programu. Jeśli to gra - zmieniasz stan gry na menu.

A co ma tytuł pytania do jego treści, to chyba nawet sam autor nie wie. ;)
komentarz 28 października 2016 przez PaulW Początkujący (470 p.)

Wczoraj było już późno i nie dokładnie z edytowałem post. Chodziło mi o dziedziczenie typu wyliczeniowego enum , by później móc w klasie Menedzer zrobić coś takiego : 

// Po kliknięciu w Esc stan gry zmienił się na MENU . 

By później skorzystać :

 

komentarz 28 października 2016 przez PaulW Początkujący (470 p.)
Poradziłem już sobie z problemem . Dziedziczenie się powiodło . Dzięki !
komentarz 28 października 2016 przez draghan VIP (106,230 p.)
Cieszy mnie, że problem rozwiązałeś. Jednak nadal nie widzę tutaj żadnego dziedziczenia. Wytłumaczysz mi, o co Ci chodzi kiedy mówisz o dziedziczeniu?
komentarz 31 października 2016 przez PaulW Początkujący (470 p.)

tutaj zastosowałem dziedziczenie w celu uzyskania dostępu do zmiennej "stangry" typu "opcje"

#ifndef menedzer_h
#define menedzer_h
#include <iostream>
#include "paletka.h"
#include "pilka.h"
#include "gra.h"

using namespace std;

class Menedzer:public Gra
{
public:
    Menedzer(int s , int w); // konstruktor dwuparametrowy
    ~Menedzer(); // destruktor
    void wynikUp(Paletka *gracz); // funkcja składowa klasy której parametrem jest wskaźnik na obiekt klasy Paletka
    void rysuj(); // deklaracja funkcji "rysuj"
    void wejscie(); // -//-
    void start(); // -//-
    void kolizje(); // -//-
private:
    int wysokosc , szerokosc; // zmienne określające wysokość i szerokość pola gry
    int wynik1 , wynik2; // zmienne typu int , przechowują wynik gracza I i II
    char gora1 , dol1 , gora2 , dol2; // zmienne typu char , odpowiadają za sterowanie graczami ( orzypisanie klawiszu klawiatury)
    bool koniec; // warunek sprawdzający
    Pilka *pilka; // nowy obiekt klasy Pilka tworzony dynamicznie
    Paletka *gracz1; // -//-
    Paletka *gracz2; // -//-
    void wynikReset(); // funkcja zerująca wynik meczu
    void pilkaStop();

};

#endif // menedzer_h
class Gra
{
public:
    Gra();
    enum opcje{MENU , GRA , USTAWIENIA , KONIEC};
    void uruchomGre();
    opcje stangry;
    void menu();
    void ustaw(); void ustaw1(); void ustaw2(); void ustaw3();
private:
    int wybranaopcja = 0;
    char znak;


};
#endif // gra_h

Wygląda to wszystko tak :

Na tym etapie jest wszystko ok , jeżeli wybiorę "Wyjdz" i kliknę "Enter" program się zamyka . Ustawienia , zostaje wyczyszczony ekran ( później będzie tutaj inna funkcja ) . Graj uruchamia grę 

i na tym etapie zaczynają się już schody , jeżeli kliknę "p" piłka zatrzymuj się w danym miejscu i uruchamia się menu . Jeżeli kliknę "Graj" piłka zaczyna ponownie się poruszać , niestety wyjście z gry już nie działa . 

#ifndef gra_h
#define gra_h
#include <iostream>
#include "pilka.h"        // dyrektywa #include załącza plik nagłówkowy "pilka.h"
#include "paletka.h"      // dyrektywa #include załącza plik nagłówkowy "paletka.h"
#include "menedzer.h"     // dyrektywa #include załącza plik nagłówkowy "menedzer.h"

using namespace std;

class Gra
{
public:
    Gra();
    enum opcje{MENU , GRA , USTAWIENIA , KONIEC};
    void uruchomGre();
    opcje stangry;
    void menu();
    void ustaw(); void ustaw1(); void ustaw2(); void ustaw3();
    opcje getStanGry();
private:
    int wybranaopcja = 0;
    char znak;


};
#endif // gra_h
#include "pilka.h"
#include "menedzer.h"
#include "paletka.h"
#include "gra.h"
#include "conio.h"
#include "windows.h"
using namespace std;

Gra::Gra()
{
    stangry = MENU;
}
void Gra::uruchomGre()
{
    while(stangry != KONIEC)
    {
        switch(stangry)
        {
        case MENU:
            menu();
            break;
        case GRA:
            {
             Menedzer m1(40 , 20);
             m1.start();
            } break;
        case USTAWIENIA:
            {
             system("cls");
            } break;

        }
    }
}

void Gra::menu()
{
        while( wybranaopcja != 3 ) // jeżeli zmienna "wybranaopcja" jest różna od 3 (menu posiada tylko 3 opcje)
        {
        ustaw1();
        if( wybranaopcja == 0 ) cout << "-->Graj\n";         // opcje menu
        else cout << "Graj    \n";

        ustaw2();
        if( wybranaopcja == 1 ) cout << "-->Ustawienia\n";   // pokazuje się "-->"
        else cout << "Ustawienia    \n";

        ustaw3();
        if( wybranaopcja == 2 ) cout << "-->Wyjdz\n";        // -//-
        else cout << "Wyjdz    \n";

        znak = getch(); // odczytuje kod wciśniętego klawisza klawiatury i przechowuje go w zmiennej "znak"

        switch( znak )
        {
        case 72:                // jeżeli wciśniemy strzałkę w górę "kod ASCII = 72"
            wybranaopcja--;     // opcja menu zmniejsza się
            break;
        case 80:
            wybranaopcja++;    // jeżeli wciśniemy strzałkę w dół "kod ASCII = 80"
            break;             // opcja menu zwiększa się
        }

        if(wybranaopcja > 2 ) wybranaopcja--; // jeżeli wybrana opcja jest > 2 to zmniejsz wartość zmiennej "wybranaopcja"
        if(wybranaopcja < 0) wybranaopcja++; // jeżeli wybrana opcja jest < 0 to zwiększ wartość zmiennej "wybranaopcja"

        if(wybranaopcja == 0 && znak == 13) // jeżeli opcja == 0 ( Graj ) i wciśniemy klawisz "Enter"
        {
            stangry = GRA;
            cout << stangry;
            break;
        }

        if(wybranaopcja == 1 && znak == 13) // jeżeli opcja == 1 ( Ustawienia) i wciśniemy klawisz "Enter"
        {
            stangry = USTAWIENIA; // wyjdź z menu (przejście do gry)
            break;
        }

        if(wybranaopcja == 2 && znak == 13) // jeżeli opcja == 2 ( Koniec ) i wciśniemy klawisz "Enter"
        {
            stangry = KONIEC;
            cout << stangry;
            break;

        }
        }
}

void Gra::ustaw()
{
    COORD cord;       // ustawia kursor myszy na początek konsoli
    cord.X = 0;
    cord.Y = 0;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord );
}

void Gra::ustaw1()
{
    COORD cord;       // ustawia kursor myszy w daną pozycję
    cord.X = 60;
    cord.Y = 1;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord );
}

void Gra::ustaw2()
{
    COORD cord;       // ustawia kursor myszy w daną pozycję
    cord.X = 60;
    cord.Y = 2;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord );
}

void Gra::ustaw3()
{
    COORD cord;       // ustawia kursor myszy w daną pozycję
    cord.X = 60;
    cord.Y = 3;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord );
}

Gra::opcje Gra::getStanGry()
{
    return stangry;
}


#ifndef menedzer_h
#define menedzer_h
#include <iostream>
#include "paletka.h"
#include "pilka.h"
#include "gra.h"

using namespace std;

class Menedzer:public Gra
{
public:
    Menedzer(int s , int w); // konstruktor dwuparametrowy
    ~Menedzer(); // destruktor
    void wynikUp(Paletka *gracz); // funkcja składowa klasy której parametrem jest wskaźnik na obiekt klasy Paletka
    void rysuj(); // deklaracja funkcji "rysuj"
    void wejscie(); // -//-
    void start(); // -//-
    void kolizje(); // -//-
private:
    int wysokosc , szerokosc; // zmienne określające wysokość i szerokość pola gry
    int wynik1 , wynik2; // zmienne typu int , przechowują wynik gracza I i II
    char gora1 , dol1 , gora2 , dol2; // zmienne typu char , odpowiadają za sterowanie graczami ( orzypisanie klawiszu klawiatury)
    bool koniec; // warunek sprawdzający
    Pilka *pilka; // nowy obiekt klasy Pilka tworzony dynamicznie
    Paletka *gracz1; // -//-
    Paletka *gracz2; // -//-
    void wynikReset(); // funkcja zerująca wynik meczu
    void pilkaStop();

};

#endif // menedzer_h


ważniejszy fragment menedzer.cpp

 void Menedzer::wejscie()
    {
    pilka->ruch(); // wywołanie funkcji na rzecz obiektu pilka

    int pilkax = pilka->getX(); // zmienna "pilkax" przechowuje współrz. x "pilka"
    int pilkay = pilka->getY(); // zmienna "pilkay" przechowuje współrz. y "pilka"
    int gracz1x = gracz1->getX(); // zmienna "gracz1x" przechowuje współrz. x "gracz1"
    int gracz2x = gracz2->getX(); // zmienna "gracz2x" przechowuje współrz. x "gracz2"
    int gracz1y = gracz1->getY(); // zmienna "gracz1y" przechowuje współrz. y "gracz1"
    int gracz2y = gracz2->getY(); // zmienna "gracz2y" przechowuje współrz. y "gracz2"

    if(_kbhit()) // sprawdza czy w buforze klawiatury znajdują się dane do odczytania , jeśli tak zwraca wartość 1 (true)
        {
        char klawisz = getch(); // zmienna klawisz przechowuje pojedyńczy znak odczytany z klawiatury
        if (klawisz == gora1) // po wciśnięciu odpowiedniego klawiszu
            if(gracz1y > 0)   // jeżeli współrz. y "gracz1" jest > 0
                gracz1->ruchGora(); // na rzecz obiektu gracz1 wywołana zostaje funkcja "ruchGora" poruszająca paletkę do góry

        if (klawisz == gora2) // -//-
            if(gracz2y > 0) // -//-
                gracz2->ruchGora(); // -//-

        if (klawisz == dol1) // -//-
            if(gracz1y + 4 < wysokosc - 1) // -//-
                gracz1->ruchDol(); // -//-

        if (klawisz == dol2) // -//-
            if(gracz2y + 4 < wysokosc - 1) // -//-
                gracz2->ruchDol(); // -//-

        if(pilka->getKierunek() == STOP) // jeżeli piłka nie porusza się
            pilka->losowyKierunek();     // zostaje nadany piłce losowy kierunek

        if(klawisz == 112) // P - Pauza
        {
            menu();
        }

        if(klawisz == 110) // N - nowa gra
        {
            wynikReset();    // wynik1 i wynik2 przyjmują wartość 0
            pilka->reset();  // piłka zostaje ustawiona na środek boiska
            gracz1->reset(); // "gracz1" wraca na pozycję początkową
            gracz2->reset(); // "gracz2" wraca na pozycję początkową
        }
        if(wynik1 == 5) // jeżeli "gracz1" zdobędzie 5 punków
        {
           cout << endl << endl << " GRATULACJE !! " << endl << "WYGRAL : I GRACZ"; // wyświetla się napis
           wynikReset();    // wynik zostaje wyzerowany
           pilka->reset();  // "pilka" wraca na pozycję początkową
           gracz1->reset(); // "gracz1" wraca na pozycję początkową
           gracz2->reset(); // "gracz2" wraca na pozycję początkową
        }
        if(wynik2 == 5) // -//-
        {
           cout << endl << endl << " GRATULACJE !! " << endl << "WYGRAL : II GRACZ"; // -//-
           wynikReset(); // -//-
           pilka->reset(); // -//-
           gracz1->reset(); // -//-
           gracz2->reset(); // -//-
        }
        }
    }

Podobne pytania

0 głosów
1 odpowiedź 124 wizyt
pytanie zadane 31 października 2016 w C i C++ przez PaulW Początkujący (470 p.)
0 głosów
4 odpowiedzi 213 wizyt
0 głosów
1 odpowiedź 852 wizyt
pytanie zadane 27 kwietnia 2016 w C i C++ przez lukasz_m Obywatel (1,380 p.)

92,549 zapytań

141,392 odpowiedzi

319,519 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...