Zmienna w klasie. Nie mogę jej zmienić.

0

Witam! Tak jak w temacie mam problem ze zmienną będącą w klasie. Nie mogę zmienić jej wartości. Oto odpowiedni fragment kodu:

Naglowek:

class Tetris
{
private:
...
unsigned Punkty;
...
public:
...
void set_points(int x);
...
}

Definicje:

#include "tetris.h"
...
void Tetris::set_points(int x)
{
  Punkty +=x;
}
...

Dlaczego to nie działa?
Kompilator pokazuje mi taki błąd:
error: no 'void Tetris::set_points(int)' member function declared in class 'Tetris'|
oraz
error: 'Punkty' was not declared in this scope|

Z góry dziękuje za pomoc :)

1

http://ideone.com/fYCsSA

działa. jakiego kompilatora i IDE uzywasz?
dlaczego jak masz unsigned to uzywasz do przepisywania int?

0

Korzystam z Code::Blocks 13.12. Też uważam że może być to błąd od strony kompilatora. A z tym int pomyłka :). Dobra zrobiłem tak jka kolega wyżej mi napisał ale teraz jak chce użyć funkcji set_points() w innej funkcji to pokazuje że ta funkcja jest nie osiągalna ;/

0

Sprawdz czy poprawnie dolaczasz naglowek,moze jest nie w tym katalogu co trzeba .

0

Plik main.cpp:

#include "tetris.h"

void Welcome();
void Menu();
void PLAY();
int main()
{
    Welcome();
    Menu();
    return 0;
}

void Welcome()
{
    cout << "\n\n\t\t\t=== TETRIS 2014! ===\n\n\n\t\t\t\t\tBy Bartek";
    Sleep(1500);
    system("cls");
}
 void PLAY()
 {
    Tetris gra;
    while (gra.sprawdz())
    {
        gra.show();
        Sleep(200);
        gra.ruch();
    }
 }
 void Menu()
 {
     cout <<"[1] - Graj\n[0] - Wyjscie\nWybierz: ";
     int wybor;
     while (!(cin >> wybor))
     {
         cin.clear();
         while (cin.get() != '\n')
            continue;
         cout <<"Nie ma takiej opcji!\nWybierz ponownie: ";
     }
     switch(wybor)
     {
     case 1:
        PLAY();
        Menu();
        break;
     case 0:
        cout <<"\nZagraj jeszcze kiedys! :D";
        Sleep(3000);
        system("exit");
        break;
     }
 }

Plik tetris.h:

#ifndef TETRIS_H_INCLUDED
#define TETRIS_H_INCLUDED

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>

using namespace std;

struct Point{ int x, y;};

class Tetris
{
private:
    static const int X = 30; //wymiary planszy
    static const int Y = 21;
    enum STAN {EMPTY = ' ', SPADA = 'O', LEZY = 'L', POLE = 1}; // pole odnoi sie do struktury spadajacego klocka
    STAN Field[X][Y]; //plansza

    struct SPADAJACY{ STAN klocek[9]; };
    Point klocekxy[9]; // wspolrzedne pojedynczego elementu klocka
    SPADAJACY FIGURA;
    // spadajace klocki!
    void down(); //posuwa klocek w dol
    void left(); //w lewo
    void right(); // w prawo
    void obrot(); // wykonuje obrot klocka
    void losuj(); //gdy klocek spadnie losuje nowy wraz z ksztaltem
    void ksztalt(); // nowy ksztalt klocka
    void upadl(); //sprawdza czy upadl klocek jesli tak to losuje nowy!
    void Reset_FIGURY(); // gdy figura upadnie jest ona resetowana i ustawiana na gorze
    void usun(); //usuwa plna linie
    void usuwa_pozostalosci_klockow();
    void Reset();// resetuje cala plansze
    unsigned Punkty;
    inline void set_points(int x) { Punkty += x; }
public:
    Tetris() : { Reset(); losuj();  set_points(0);} //konstruktor
    void show();//pokazuje plansze
    void ruch();//mowi samo za siebie
    bool sprawdz();// czy gra trwa?
};


#endif // TETRIS_H_INCLUDED

Plik TETRIS.cpp

#include "tetris.h"
#include <ctime>

void Tetris::losuj()
{
    ksztalt();
    Reset_FIGURY();
}
void Tetris::Reset_FIGURY() //resetuje figure spadajaca
{
    Field[0][Y/2] = FIGURA.klocek[0];
    Field[0][Y/2+1] = FIGURA.klocek[1];
    Field[0][Y/2+2] = FIGURA.klocek[2];
    Field[1][Y/2] = FIGURA.klocek[3];
    Field[1][Y/2+1] = FIGURA.klocek[4];
    Field[1][Y/2+2] = FIGURA.klocek[5];
    Field[2][Y/2] = FIGURA.klocek[6];
    Field[2][Y/2+1] = FIGURA.klocek[7];
    Field[2][Y/2+2] = FIGURA.klocek[8];
    klocekxy[0].y = Y/2;
    klocekxy[0].x = 0;
    klocekxy[1].y = Y/2 + 1;
    klocekxy[1].x = 0;
    klocekxy[2].y = Y/2 + 2;
    klocekxy[2].x = 0;
    klocekxy[3].y = Y/2;
    klocekxy[3].x = 1;
    klocekxy[4].y = Y/2 + 1;
    klocekxy[4].x = 1;
    klocekxy[5].y = Y/2 + 2;
    klocekxy[5].x = 1;
    klocekxy[6].y = Y/2 + 0;
    klocekxy[6].x = 2;
    klocekxy[7].y = Y/2 + 1;
    klocekxy[7].x = 2;
    klocekxy[8].y = Y/2 + 2;
    klocekxy[8].x = 2;
}

void Tetris::show()
{
    system("cls");
    cout <<"Punkty: "<<Punkty<<endl;
    string ramka(Y, '*');
    cout<<ramka<<endl;
    for (int i = 3; i<X;i++)
    {
        cout <<"*";
            for (int j = 0; j<Y;j++)
            {
                for (int k = 0; k<9;k++)
                    if ( FIGURA.klocek[k] == POLE && klocekxy[k].x==i && klocekxy[k].y == j)
                    Field[i][j] = SPADA;
                cout << (char) Field[i][j];
            }
        cout <<"*\n";
    }
    cout<<ramka<<endl;
    upadl();
    usuwa_pozostalosci_klockow();
}

void Tetris::usuwa_pozostalosci_klockow()
{
    for (int i = 0; i<X;i++)
        for (int j = 0; j<Y;j++)
            if (Field[i][j] == SPADA)
                Field[i][j] = EMPTY;
}

void Tetris::Reset()
{
    for (int i = 0; i<X;i++)
        for (int j = 0; j<Y;j++)
            Field[i][j] = EMPTY;
}

void Tetris::down() // przesuwa klocek o jeden w dol
{
    for (int i = 0; i<9;i++)
        ++klocekxy[i].x;    //zmienia wspolrzedna x - przesuwa klocek o jeden w dol
}

void Tetris::left()
{
    for (int j = 0; j <9; j++)
        if ((Field[klocekxy[j].x][klocekxy[j].y-1] == LEZY && FIGURA.klocek[j] == POLE )|| (klocekxy[j].y-1 == -1 && FIGURA.klocek[j] == POLE ))
            return;
        for (int i = 0; i<9;i++)
            --klocekxy[i].y;    //zmienia wspolrzedna y - przesuwa klocek o jeden w lewo
}

void Tetris::right()
{
    for (int j = 0; j <9; j++)
        if ((Field[klocekxy[j].x][klocekxy[j].y+1] == LEZY && FIGURA.klocek[j] == POLE) || (klocekxy[j].y-1 == Y-2 && FIGURA.klocek[j] == POLE ))
            return;
    for (int i = 0; i<9;i++)
        ++klocekxy[i].y;    //zmienia wspolrzedna y - przesuwa klocek o jeden w prawo
}

void Tetris::ruch()
{
    if (kbhit())
    {
        while (kbhit()){
        switch(getch())
        {
        case 'A':
        case 'a':
            left();
            break;
        case 'D':
        case 'd':
            right();
            break;
        case 'S':
        case 's':
            down();
            break;
        case 'w':
        case 'W':
            obrot();
            break;
        }
        show();
        Sleep(50);
        }
    }
    down();
    usun();
}

void Tetris::upadl()
{
    for (int i = 0; i<9;i++)
        if ( (klocekxy[i].x == X-1 && FIGURA.klocek[i] == POLE) || (Field[klocekxy[i].x+1][klocekxy[i].y] == LEZY && FIGURA.klocek[i] == POLE ) ){
                for (int i=0;i<9;i++){
                        if ( Field[klocekxy[i].x][klocekxy[i].y] == SPADA)
                    Field[klocekxy[i].x][klocekxy[i].y] = LEZY;
                }
        losuj();
        }
}

void Tetris::usun() // usuwa pelna linie
{
    int licz;
    for (int i = 0; i<X; i++)
    {
        licz = 0;
        for (int j = 0; j<Y; j++){
            if ( Field[i][j] == LEZY)
                ++licz;
            if (licz == Y-1){
                for (int k = 0;k<Y;k++){
                    Field[i][k] = EMPTY;//usuwa pelna linie
                }
                for (int l = 0; l<i;l++){// to ma przesuwac "wiszace" klocki w dol
                    for (int m = 0; m<Y; m++)
                    {
                        if (Field[l][m] == LEZY){
                            Field[l][m] = EMPTY;
                            Field[l+1][m] = LEZY;
                        }
                    }
                }
                set_points(100);
            }
        }
    }
}

bool Tetris::sprawdz()
{
    for (int i = 0; i<Y; i++){
        if (Field[3][i] == LEZY)
            return false;
    }
    return true;
}
 void Tetris::obrot()
 {
    SPADAJACY TEMP;
    TEMP = FIGURA;
    FIGURA.klocek[0] = TEMP.klocek[6];
    FIGURA.klocek[1] = TEMP.klocek[3];
    FIGURA.klocek[2] = TEMP.klocek[0];
    FIGURA.klocek[3] = TEMP.klocek[7];

    FIGURA.klocek[5] = TEMP.klocek[1];
    FIGURA.klocek[6] = TEMP.klocek[8];
    FIGURA.klocek[7] = TEMP.klocek[5];
    FIGURA.klocek[8] = TEMP.klocek[2];
 }

void Tetris::ksztalt()// nadaje ksztalt klockowi
{
    time_t t;
    srand((unsigned) time(&t));

    /*
    0 1 2
    3 4 5
    6 7 8
     */

    switch( rand() % 8 + 1 )
    {
    case 1:
        /*   wzor klocka
        1 000
        2 111
        3 111
        */
        for (int i=3;i<9;i++)
            FIGURA.klocek[i] = POLE;

            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = EMPTY;
            FIGURA.klocek[2] = EMPTY;
            break;
    case 2:
        /*
        1 010
        2 010
        3 010
        */
            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = POLE;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = EMPTY;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = EMPTY;
            FIGURA.klocek[6] = EMPTY;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = EMPTY;
            break;
    case 3:
        /*
        1 1 0 0
        2 1 0 0
        3 1 1 0
        */
            FIGURA.klocek[0] = POLE;
            FIGURA.klocek[1] = EMPTY;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = POLE;
            FIGURA.klocek[4] = EMPTY;
            FIGURA.klocek[5] = EMPTY;
            FIGURA.klocek[6] = POLE;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = EMPTY;
            break;
    case 4:
        /*
        1 0 0 0
        2 1 1 0
        3 0 1 1
        */
            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = EMPTY;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = POLE;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = EMPTY;
            FIGURA.klocek[6] = EMPTY;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = POLE;
            break;
    case 5:
        /*
        1 0 0 0
        2 0 1 1
        3 1 1 0
        */
            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = EMPTY;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = EMPTY;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = POLE;
            FIGURA.klocek[6] = POLE;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = EMPTY;
    case 6:
        /*
        1 0 0 0
        2 0 1 0
        3 1 1 1
        */
            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = EMPTY;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = EMPTY;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = EMPTY;
            FIGURA.klocek[6] = POLE;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = POLE;
    case 7:
        /*
        1 1 1 1
        2 1 1 1
        3 1 1 1
        */
            FIGURA.klocek[0] = POLE;
            FIGURA.klocek[1] = POLE;
            FIGURA.klocek[2] = POLE;
            FIGURA.klocek[3] = POLE;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = POLE;
            FIGURA.klocek[6] = POLE;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = POLE;
    case 8:
        /*
        1 0 1 0
        2 0 1 0
        3 1 1 0
        */
            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = POLE;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = EMPTY;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = EMPTY;
            FIGURA.klocek[6] = POLE;
            FIGURA.klocek[7] = POLE;
            FIGURA.klocek[8] = EMPTY;
            break;
    default:
        /*
        1 0 0 0
        2 0 1 0
        3 0 0 0
        */
            FIGURA.klocek[0] = EMPTY;
            FIGURA.klocek[1] = EMPTY;
            FIGURA.klocek[2] = EMPTY;
            FIGURA.klocek[3] = EMPTY;
            FIGURA.klocek[4] = POLE;
            FIGURA.klocek[5] = EMPTY;
            FIGURA.klocek[6] = EMPTY;
            FIGURA.klocek[7] = EMPTY;
            FIGURA.klocek[8] = EMPTY;
    }
}
0

Tetris() : { Reset(); losuj(); set_points(0);}

wyrzuc drukropek i się już kompiluje

0

W dalszym ciągu pojawia się błąd.

1

a masz zrobiony poprawnie projekt? Bo to tak jakby te pliki w ogole sie nie widzialy. Musisz dodac plik do projektu(!)

0
SharpShooter napisał(a):

W dalszym ciągu pojawia się błąd.

pod visual compiler jest tez błąd

cout<<ramka<<endl;

daj mu tam spacje między operatorem <<

cout << ramka << endl

0

Okej chodzi. Dzięki wielkie za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1