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

Dziedziczenie zmiennej typu wyliczeniowego.

Cloud VPS
0 głosów
371 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ź 176 wizyt
pytanie zadane 31 października 2016 w C i C++ przez PaulW Początkujący (470 p.)
0 głosów
4 odpowiedzi 327 wizyt
0 głosów
1 odpowiedź 1,322 wizyt
pytanie zadane 27 kwietnia 2016 w C i C++ przez lukasz_m Obywatel (1,380 p.)

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 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

Kursy INF.02 i INF.03
...