[C++] Warcaby i coraz to nowe problemy...

0

Witam wszystkich!
Na wstępie zaznaczam, że dopiero raczkuję w C++ i obiektowości, dlatego z góry przepraszam za wszelkie rażące błędy w moim kodzie. Piszę właśnie projekt na zaliczenie, którego tematem są warcaby. Prosiłbym o pomoc czy naprowadzenie mnie na odpowiedni tor. Czasu zostało mało, dlatego proszę o wszelką pomoc.

Następujący fragment kodu sprawia trudności:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
using namespace std;
class Plansza;
enum Typy{
	brak,
	pionek,
	damka
};
enum Kolory{
	zaden,
	bialy,
	czarny
};

class Pionki{
protected:
	int typ;	
	int kolor;	
public:
	Pionki(){ typ = brak; kolor = brak; };
	~Pionki(){};
	Pionki(int a, int b){
		typ = a;
		kolor = b;
	};
};
class Pionek:Pionki{
protected:
	int pozycja_x;
	int pozycja_y;
public:
	Pionek():Pionki(){
		pozycja_x=0;
		pozycja_y=0;
	};
	~Pionek(){};
	Pionek(int a, int b, int a1, int a2):Pionki(a,b){
		pozycja_x = a1;
		pozycja_y = a2;
	};
	int get_kolor(){
		return kolor;
	};
	int get_typ(){
		return typ;
	};
	void ustaw_damke(){
		typ = damka;
	};
	Pionek ustaw_pionek(int a, int b, int a1, int a2){
		Pionek ppion(a, b, a1, a2);
		return ppion;
	};
	void zbij_pionek(Pionek *ppion){ 
		delete ppion;
	};
	void reset(){				
		typ = brak;
		kolor = brak;
	};
};

class Plansza{
protected:
	int rozmiar_x;
	int rozmiar_y;
	Pionek plansza[8][8];
public:
	Plansza(){
		rozmiar_x = 8;
		rozmiar_y = 8;
	};
	~Plansza(){};
	void ustaw_plansze_start(){
		for(int i=0; i<8; i++){
			for(int j=0; j<8; j++){
				if (i<2 && (i+j)%2== 1){
					plansza[i][j].ustaw_pionek(pionek,czarny,i,j);
				}
				else plansza[i][j].ustaw_pionek(brak,brak,i,j);
				if (j>=5 && (i+j)%2== 1){
					plansza[i][j].ustaw_pionek(pionek, bialy, i, j);
				}
				else plansza[i][j].ustaw_pionek(brak,brak,i,j);
			}
		}
	};
	void rysuj_plansze(){
		for(int i=0; i<8; i++){
			for(int j=0; j<8; j++){
				if(plansza[i][j].get_kolor()==czarny) // get_kolor nie zwraca
					cout << 2;
				if(plansza[i][j].get_kolor()==bialy && plansza[i][j].get_typ()==pionek)
					cout << 1;
				if(plansza[i][j].get_kolor()==brak && plansza[i][j].get_typ()==brak)
					cout << 0;
			}
			cout << endl;
		}
	};
};



int main(){
	Plansza *pwsk = NULL;
	pwsk = new Plansza();
	pwsk->ustaw_plansze_start();
	pwsk->rysuj_plansze();

	
	delete pwsk;
	cout << endl;
	system("PAUSE");
	return 0;
} 

Problemem jest to, że nie działa mi metoda get_kolor() na rzecz obiektu plansza[i][j]. Zrobiłem sobie mały test w mainie, żeby zobaczyć co jest nie tak i wygląda na to, że kompilatorowi bardzo nie podoba się obecność tej tablicy dwuwymiarowej. To samo na tablicy jednowymiarowej. Na zwyklym obiekcie typu Pionek wszystko działa. Problem zapewne trywialny, lecz trudno mi posunąć się dalej...

Proszę o pomoc. Dziękuję. Pozdrawiam.

0

w funkcji ustaw_pionek tworzysz lokalny obiekt z parametrami podanymi we funkcji następnie zwracasz ten obiekt w powietrze. konstruktor domniemany zainicjalizował obiekt Pionki wartością z typu wyliczeniowego "brak" czyli 0 bo pierwsza wartość w enumie ma zawsze 0. Dlatego wypisuje same 0. Musisz napisać:

plansza[i][j] = plansza[i][j].ustaw_pionek(pionek,czarny,i,j)
0

O jezu... no tak... Oczywiście. :D Dzięki stukrotne.

Biorę się do dalszej pracy. :)

0

Witam! Pojawił się u mnie kolejny mały problem, z którym nie mogę sobie poradzić. Oto kawałek kodu sprawiający problemy:

class Plansza{
	friend class Gracz;
protected:
	int rozmiar_x;
	int rozmiar_y;
public:
	static Pionek plansza[8][8];
	Plansza(){
		rozmiar_x = 8;
		rozmiar_y = 8;
	};
	~Plansza(){};
	void ustaw_plansze_start(){
		for(int i=0; i<8; i++){
			for(int j=0; j<8; j++){
				if (i<=2 && (i+j)%2== 1)
					plansza[i][j]=plansza[i][j].ustaw_pionek(pionek,czarny,i,j);
				if (i>=5 && (i+j)%2== 1)
					plansza[i][j]=plansza[i][j].ustaw_pionek(pionek, bialy, i, j);
			}
		}
	};
	void rysuj_plansze(){
		for(int i=0; i<8; i++){
			for(int j=0; j<8; j++){
				if(plansza[i][j].get_kolor()==czarny && plansza[i][j].get_typ()==pionek)
					cout << 2;
				else if(plansza[i][j].get_kolor()==bialy && plansza[i][j].get_typ()==pionek)
					cout << 1;
				else
					cout << 0;
			}
			cout << endl;
		}
		cout << endl;
	};
};

class Gracz{
	virtual void ruch() = 0;
	Walka czy_jest_bicie(int czyj_ruch){	// PROBLEM: W ZWIĄZKU Z PORZĄDKIEM W JAKIM PRZESZUKIWANA JEST TABLICA, PROGRAM WYMUSZA BICIE Z PEWNEJ STRONY PIONA.
		for (int x=0; x<8; x++){
			for (int y=0; y<8; y++){
				if (plansza[x][y].get_kolor() == czyj_ruch && plansza[x][y].get_typ() == pionek){
					if ((plansza[x+1][y+1].get_kolor() == 1 || plansza[x+1][y+1].get_kolor() == 2) && plansza[x+1][y+1].get_kolor() != plansza[x][y].get_kolor() && plansza[x+2][y+2].get_typ()==brak){
						Walka starcie(1,x,y,x+1,y+1,x+2,y+2);
						return starcie;
					} else ;
					if ((plansza[x-1][y+1].get_kolor() == 1 || plansza[x-1][y+1].get_kolor() == 2) && plansza[x-1][y+1].get_kolor() != plansza[x][y].get_kolor() && plansza[x-2][y+2].get_typ()==brak){
						Walka starcie(1,x,y,x-1,y+1,x-2,y+2);
						return starcie;
					} else ;
					if ((plansza[x+1][y-1].get_kolor() == 1 || plansza[x+1][y-1].get_kolor() == 2) && plansza[x+1][y-1].get_kolor() != plansza[x][y].get_kolor() && plansza[x+2][y-2].get_typ()==brak){
						Walka starcie(1,x,y,x+1,y-1,x+2,y-2);
						return starcie;
					} else ;
					if ((plansza[x-1][y-1].get_kolor() == 1 || plansza[x-1][y-1].get_kolor() == 2) && plansza[x-1][y-1].get_kolor() != plansza[x][y].get_kolor() && plansza[x-2][y-2].get_typ()==brak){
						Walka starcie(1,x,y,x-1,y-1,x-2,y-2);
						return starcie;
					} else ;
				}
			}
		}
		Walka starcie(0,0,0,0,0,0,0);
	};
}; 

O co mi chodzi:

Wymyśliłem sobie, że plansza[8][8] typu Pionek będzie polem statycznym, tak, żebym mógł go używać w metodach innych klas, tak jak np. w metodzie czy_jest_bicie() klasy Walka. Jednak, kompilator płacze wewnątrz ww. metody, że plansza is undefined. Czego tutaj nie widzę? Może jest lepszy sposób na 'udostępnienie' tego pola dla innych klas/metod?

Dziękuję za pomoc.

0

if(Plansza::plansza[...][...] ... )

Przemyśl wszystko jeszcze raz i zacznij od początku.

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