Gra - Kółko i Krzyzyk - Problem z kompilacją.

0

Witam wszystkich ;)

Napisałem grę Kółko i Krzyżyk.
Wszystko jest dobrze, nie ma żadnych podkreśleń...
A tu podczas kompilacji wywala mi błędy.

Kod błędu:

1>
------ Build started: Project: C'n'C, Configuration: Debug Win32 ------
1>main.obj : error LNK2005: "enum SIGN g_AktualnyGracz" (?g_AktualnyGracz@@3W4SIGN@@A) already defined in game.obj
1>main.obj : error LNK2005: "enum FIELD (* g_aPlansza)[3]" (?g_aPlansza@@3PAY02W4FIELD@@A) already defined in game.obj
1>main.obj : error LNK2005: "enum GAMESTATE g_StanGry" (?g_StanGry@@3W4GAMESTATE@@A) already defined in game.obj
1>C:\Users\user\Desktop\Programy\C++ ( GRY )\C'n'C\Debug\C'n'C.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Plik game.cpp:

#include <iostream>;
#include <ctime>;
#include "game.h";

using namespace std;

bool StartGry()
{
	if( g_StanGry != GS_NOTSTARTED ) return false;
	srand( static_cast<int>(time(NULL)));
	g_AktualnyGracz == (rand() % 2 == 0 ? SGN_CIRCLE : SGN_CROSS);
	
	g_StanGry = GS_MOVE;

	return true;

}


bool Ruch( unsigned uIDPola )
{
	if( g_StanGry != GS_MOVE ) return false;
	if(!( uIDPola >= 1 && uIDPola <= 9)) return false;

	unsigned uX = ( uIDPola - 1 ) / 3;
	unsigned uY = ( uIDPola - 1 ) % 3;

	if( g_aPlansza[uY][uX] == FLD_EMPTY )

		g_aPlansza[uY][uX] = static_cast<FIELD>(g_AktualnyGracz );

	const int WINLINE[][3][2] = { { { 0,0 }, { 0,1 }, { 0,2 } },
							  { { 1,0 }, { 1,1 }, { 1,2 } },
							  { { 2,0 }, { 2,1 }, { 2,2 } },
							  { { 0,0 }, { 1,0 }, { 2,0 } },
							  { { 0,1 }, { 1,1 }, { 2,1 } },
							  { { 0,2 }, { 1,2 }, { 2,2 } },
							  { { 0,0 }, { 1,1 }, { 2,2 } }, 
							  { { 2,0 }, { 1,1 }, { 0,2 } } }; 
	FIELD Pole, DobrePole;
	int iLiczbaDobrychPol;
	for( int i = 0; i <= 8; ++i)
	{
		DobrePole, Pole = FLD_EMPTY;
		iLiczbaDobrychPol = 0;
		
		for( int j = 0; j <=3; ++j)
		{
			g_aPlansza[WINLINE[i][j][0]][WINLINE[i][j][1]];

			if( Pole != DobrePole )
			{
				DobrePole = Pole;
				iLiczbaDobrychPol = 1;
			}
			else

				++iLiczbaDobrychPol;
		}
		
		if( iLiczbaDobrychPol == 3 && DobrePole != FLD_EMPTY )
		{	
			g_StanGry == GS_WON;

			return true;
		}
	}
}
bool RysujPlansze()
{
	if( g_StanGry == GS_NOTSTARTED ) return false;

	system("CLS");

	cout << "		C'n'C		\n";
	cout << "-=+=-=+=-=+=-=+=-=+=-\n";

	cout << "-----\n";
	for( int i = 0; i <= 3; ++i )
	{
		cout << "    |";
			
			for( int j = 0; j<= 3; ++j )
			{
				if( g_aPlansza[i][j] == FLD_EMPTY )
				{
					cout << i * 3 + j + 1;
				}
				else
					cout << static_cast<char>(g_aPlansza[i][j]);
			}

		cout << "|" << endl;
	}

	cout << "-----" << endl;
	cout << "\n";

	switch(g_StanGry)
	{
		case GS_MOVE:
			cout << "Podaj ID pola w ktorym chcesz postawic: ";
			cout << (g_AktualnyGracz == SGN_CROSS ?	"krzyzyki" : "kolka" );

		case GS_NOTSTARTED:
			cout << "ZACZYNAMY !!!" <<endl;

		case GS_WON:
			cout << "Wygral gracz stawiajacy: ";
			cout << (g_AktualnyGracz == SGN_CROSS ? "krzyżyki" : "kolka" );
		case GS_DRAW:

			cout << " !!! REMIS !!!" << endl;
	}

	return true;

}

Plik main.cpp:

#include <iostream>;
#include <conio.h>;
#include "game.h";

using namespace std;

extern GAMESTATE g_StanGry;

void main()
{
	StartGry();
	for(;;)
	{
		RysujPlansze();

		if( g_StanGry == GS_MOVE )
		{
			unsigned int IDPola;
			cin >> IDPola;
			Ruch(IDPola);
		}
		else if( g_StanGry == GS_WON || g_StanGry == GS_DRAW )
			break;
	}

	getch();
}

Plik game.h:

enum GAMESTATE{ GS_WON,
				GS_MOVE,
				GS_DRAW,
				GS_NOTSTARTED };

enum SIGN{ SGN_CIRCLE = 'O',
		   SGN_CROSS = 'X' };

enum FIELD{ FLD_EMPTY,
			FLD_CROSS = SGN_CROSS,
			FLD_CIRCLE = SGN_CIRCLE} ;

bool StartGry();

bool Ruch( unsigned );

bool RysujPlansze();

FIELD g_aPlansza[3][3] = {{ FLD_EMPTY, FLD_EMPTY, FLD_EMPTY },
						  { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY },
					      { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }};

GAMESTATE g_StanGry = GS_NOTSTARTED;

SIGN g_AktualnyGracz;

Proszę, o odnalezienie takowego "błędu" naprawienie i jeżeli można, to wyjaśnieniem dlaczego tak a nie inaczej :)

Pozdrawiam :)

1

To ma być w game.cpp

FIELD g_aPlansza[3][3] = {{ FLD_EMPTY, FLD_EMPTY, FLD_EMPTY },
                                                  { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY },
                                              { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }};
 
GAMESTATE g_StanGry = GS_NOTSTARTED;
 
SIGN g_AktualnyGracz;

A to w game.h:

extern FIELD g_aPlansza[][3];
 
extern GAMESTATE g_StanGry;
 
extern SIGN g_AktualnyGracz;
0

A dlaczego nie może być tak jak było ?
Możesz wyjaśnić ? Uczę się na błędach :)

1

Tak jak było powodowało co następujące:

w pliku main.cpp zmienna globalna przez dołączenie game.h:
GAMESTATE g_StanGry;
w pliku gaim.cpp zmienna globalna przez dołączenie game.h:
GAMESTATE g_StanGry;
Dalej używasz zmiennej globalnej g_StanGry - i tu linkier się buntuje: - której z nich chcesz użyć, przecież masz dwie?!

To samo z pozostałymi dwoma.

0

Wielkie dzięki :)

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