...a treść błędu wygląda tak: "error: expected identifier before numeric constant".
Witam, jestem właśnie w trakcie pisania prostego węża w konsoli z nudów i dla praktyki, podczas "przepisywania" tej minigierki na "tryb obiektowy" napotkałem ten błąd.
Treść moich plików:
main.cpp
#include <iostream>
#include "game.h"
int main()
{
Game g1;
return 0;
}
game.h
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;
class Game
{
private:
char board[22][10];
vector<int> x_s(3); //tutaj wytepuje blad
vector<int> y_s(3); // i tutaj
int x_food = 0;
int y_food = 0;
int points = 0;
char pressed_key;
HANDLE hOut;
public:
Game();
void load_b();
void show_b();
void go_s();
};
game.cpp
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <vector>
#include "game.h"
using namespace std;
//vector<int> x_s(3);
//vector<int> y_s(3);
Game::Game()
{
/* x_s.push_back(0);
x_s.push_back(0);
x_s.push_back(0);
y_s.push_back(0);
y_s.push_back(0);
y_s.push_back(0);*/
hOut = GetStdHandle( STD_OUTPUT_HANDLE );
srand(time(NULL));
x_food = rand()%20+0;
y_food = rand()%10+0;
for(;;)
{
show_b();
go_s();
}
}
void Game::load_b()
{
for(int y=0; y<10; y++)
{
for(int x=0; x<20; x++)
board[x][y]=' ';
board[20][y]='|';
board[21][y]='\n';
}
for(int i=0; i<x_s.size(); i++)
board[ x_s[i] ][ y_s[i] ]=254;
board[x_food][y_food] = '1';
}
void Game::show_b()
{
load_b();
system("cls");
for(int y=0; y<10; y++)
for(int x=0; x<22; x++)
{
if((x==x_s[0]) && (y==y_s[0]))
{
SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY );
cout<<board[x][y];
}
else if (board[x][y]=='1')
{
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
cout<<board[x][y];
}
else if (board[x][y]=='|')
{
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
cout<<board[x][y];
}
else
{
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY );
cout<<board[x][y];
}
}
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
cout<<"\n\n\tyour points: "<<points<<endl;
}
void Game::go_s()
{
if ( ( (x_s[0]==0) or ( (board[ x_s[0]-1 ] [ y_s[0] ]!=' ' ) and (board[ x_s[0]-1 ] [ y_s[0] ]!='1' )) ) and //sprawdzanie czy jest sie zablokowany
( (x_s[0]==19) or ( (board[ x_s[0]+1 ] [ y_s[0] ]!=' ' ) and (board[ x_s[0]+1 ] [ y_s[0] ]!='1' ) ) ) and//sprawdzanie czy jest sie zablokowany
( (y_s[0]==0) or ( (board[ x_s[0] ] [ y_s[0]-1 ]!=' ' ) and (board[ x_s[0] ] [ y_s[0]-1 ]!='1' ) ) ) and//sprawdzanie czy jest sie zablokowany
( (y_s[0]==9) or ( (board[ x_s[0] ] [ y_s[0]+1 ]!=' ' ) and (board[ x_s[0] ] [ y_s[0]+1 ]!='1' ) ) ) )//sprawdzanie czy jest sie zablokowany
{
//tutaj moga byc ewenyualne efekty
cout<<"You lost!!! press enter to continue...";
getchar();
exit(0);
}
int i=x_s.size()-1;
while(i>0)
{
x_s[i]=x_s[i-1];
y_s[i]=y_s[i-1];
i--;
}
key:
pressed_key=getch();
switch(pressed_key)
{
case 's': { if((y_s[0]==9) or ((board[x_s[0] ][y_s[0]+1]!=' ') and (board[x_s[0] ][y_s[0]+1]!='1')) ) goto key; else y_s[0]++;} break;
case 'w': { if((y_s[0]==0) or ((board[x_s[0] ][y_s[0]-1]!=' ') and (board[x_s[0] ][y_s[0]-1]!='1')) ) goto key; else y_s[0]--;} break;
case 'd': { if((x_s[0]==19) or ((board[x_s[0]+1][y_s[0] ]!=' ') and (board[x_s[0]+1][y_s[0] ]!='1')) ) goto key; else x_s[0]++;} break;
case 'a': { if((x_s[0]==0) or ((board[x_s[0]-1][y_s[0] ]!=' ') and (board[x_s[0]-1][y_s[0] ]!='1')) ) goto key; else x_s[0]--;} break;
default: goto key;
}
if ( (x_s[0]==x_food) and (y_s[0]==y_food) )
{
food_generate:
x_food = rand()%20+0;
y_food = rand()%10+0;
points++;
x_s.push_back(-1);
y_s.push_back(-1);
if (board[x_food][y_food]!=' ')
goto food_generate;
}
}
Zaznaczam jeszcze z góry, że gdy zamiast...
vector<int> x_s(3);
...dam:
vector<int> x_s {0,0,0};
wszystko jest OK, tak samo jest w przypadku gdy vector'y x_s i y_s są vector'ami globalnymi, ale mam powody dla których tak nie zrobię:
1. W przypadku definicji z definiowaniem każdej komórki osobno jest to dosyć trudne przy ewentualnej modyfikacji, a definicja globalna moim zdaniem jest nieelegancka i świadcząca o nieumiejętności programisty.
2. Warto jest znać powody dla których coś się dzieje tak, a nie inaczej (np. w programowaniu) na przyszłość żeby nie być uzależnionym od ludzi którzy coś na ten temat wiedzą lub for internetowych itp..
Btw. mój kompilator: TDM-GCC-32 i używam Code::Blocks jako IDE.
Tak więc, z góry dziękuję za odpowiedź i przepraszam za ewentualne niedopowiedzenia, ale gdyby takie były proszę mnie ewentualnie upomnieć.