C++ gra Scrabble

0

Witam z góry przepraszam za dług kod. Nie wiem czy ktoś będzie chciał mi pomóc, ale nie widzę już sam innego wyjścia :(
Piszę projekt semestralny gry w Scrablle na zaliczenie z PO. Jeżeli ktoś może mi pomóc choć w jednym z problemow to będę dozgonnie wdzięczny :(

Czasem przy kompilowaniu występuje błąd i Visual chce debugować a czasem nie. Czym to jest spowodowane?

Nie wiem gdzie umieścić i jak stworzyć metodę zliczającą punkty.

Nie działa mi system zmiany tury, nie wiem dlaczego. Może ma ktoś lepszy pomysł?

Nie wiem jak wymusić na użytkowniku zaczęcie gry od środkowego pola a potem dokładanie liter do już istniejących słów.

Jeżeli ktoś jeszcze widzi jakieś błędy lub ma jakieś sugestie, to będę bardzo wdzięczny.

Z góry dziękuję za pomoc.

Gracz.h

#pragma once
#include "Plansza.h"
class Rozgrywka
{
	int tura;
	
public:
	int punkty;
	int set_tura(int t);
	int get_tura();
	int nastepna();
	Rozgrywka();
	virtual ~Rozgrywka(void);
};

class Gracz: public Rozgrywka
{
	Litera * reka[7];
	Litera * pierwsza_litera;
	int indeks;
public:
	Gracz();
	Gracz(int id);
	virtual ~Gracz(void);
	friend class Gra;
	
	void litery_gracza();
	Plansza Gracz::wstaw(Plansza B3);
	
};


 

Plansza.h

 
#pragma once
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <list>
using namespace std;

class Litera
{
	char znak;
	int pkt;
public:
	Litera(char z1, int pkt1);
	Litera();
	~Litera(void){};
	friend ostream & operator<<(ostream & wy, const Litera & L1);
	friend class Gra;
	Litera * nast;
};
class Plansza;
class Pole
{
	Litera * letter;
	int p_slowna;
	int p_literowa;
public:
	Pole(void);
	~Pole(void){};
	int set_wartosc(int nowa_slowna, int nowa_literowa);

	friend ostream & operator<<(ostream & wy, const Pole & P1);
	friend class Plansza;

	bool wstaw_litere(Litera * L3);
};

class Plansza
{
	Pole board[15][15];

public:
	Plansza(void);
	~Plansza(void);

	friend ostream & operator<<(ostream & wy, const Plansza & B1);

	bool umiesc(Litera * L2, int x, int y);
	void legenda();
};


Gra.h

#pragma once
#include "Plansza.h"
#include "Gracz.h"
#include <iostream>
#include <list>
#include <cstdlib>
#include <ctime>
#include <fstream>

using namespace std;

class Gra
{

	Litera * glowa;
	Litera * wsk;
	
public:
	Gra(void);
	virtual ~Gra(void);

	void dostepne_litery();
	Gracz Gra::rozdaj_litery(Gracz player);
};

Gracz.cpp

#include "Gracz.h"

Rozgrywka::Rozgrywka(void)
{
}
Rozgrywka::~Rozgrywka(void)
{
}

int Rozgrywka::set_tura(int t)
{
	return t=tura;
}
int Rozgrywka::get_tura()
{
	return tura;
}
int Rozgrywka::nastepna()
{
	return ++tura;
}
Gracz::Gracz(void)
{

}
Gracz::Gracz(int id)
{
	indeks=id;
}

void Gracz::litery_gracza()
{
	cout << "Litery: Gracza " ;
	cout << indeks << endl;
	for(int p=0; p<7; p++)
	{
		if(reka[p]!=NULL)
			cout << p+1 << ". " << *(reka[p]) << endl;
		else
			cout << p+1 << ". []" << endl;
	}
}
int Rozgrywka::policzpkt(Plansza B4, int x, int y)
{
	B4.board[1][1].
}

Plansza Gracz::wstaw(Plansza B3)
{
	int index, xx, yy;
		cout << "Wybierz litere ktora chcesz wstawic (wpisz jej nr) :" ;
		cin >> index;
		while(reka[(index-1)]==NULL)
		{
			cout << "Ta litera zostala juz wstawiona" << endl;
			cout << "Wybierz inna litere ktora chcesz wstawic (wpisz jej nr) :" ;
			cin >> index;
			cout << endl;
		}
		while(isalpha(index)==true || index<1 || index>7)
		{
			cout << "Numer liczby musi byc liczba calkowita z przedzialu 1-7" << endl;
			cout << "Wybierz litere ktora chcesz wstawic (wpisz jej nr) :" ;
			cin >> index;
			cout << endl;
		}
		index-=1;

		cout << "Wybierz wiersz w ktorym chcesz wstawic litere :" ;
		cin >> yy;
		while(isalpha(yy)==true || yy<1 || yy>15)
		{
			cout << "Wiersz musi byc liczba calkowita z przedzialu 1-15" << endl;
			cout << "Wybierz wiersz w ktorym chcesz wstawic litere :" ;
			cin >> yy;
			cout << endl;
		}
		yy-=1;

	
		cout << "Wybierz kolumne w ktorej chcesz wstawic litere :" ;
		cin >> xx;
		while(isalpha(xx)==true || xx<1 || xx>15)
		{
			cout << "Kolumna musi byc liczba calkowita z przedzialu 1-15" << endl;
			cout << "Wybierz kolumne w ktorej chcesz wstawic litere :" ;
			cin >> xx;
			cout << endl;
		}
		xx-=1;

		B3.umiesc(reka[index], xx, yy);
		reka[index]=NULL;
		system("cls");
		
	return B3;
}
Gracz::~Gracz(void)
{
}

 

Plansza.cpp

 
#include "Plansza.h"


Plansza::Plansza(void)
{
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			board[i][j].letter=NULL;
		}
	}
	board[0][0].p_slowna=3;
	board[7][0].p_slowna=3;
	board[14][0].p_slowna=3;
	board[0][7].p_slowna=3;
	board[7][7].p_slowna=3;
	board[14][7].p_slowna=3;
	board[0][14].p_slowna=3;
	board[7][14].p_slowna=3;
	board[14][14].p_slowna=3;

	for(int i=1; i<5; i++)
		board[i][i].p_slowna=2;
	for(int j=13; j>9; j--)
		board[j][j].p_slowna=2;
	for(int i=1, j=13; i<5 , j>9; i++, j--)
	{
			board[i][j].p_slowna=2;
	}
	for(int i=1, j=13; i<5 , j>9; i++, j--)
	{
			board[j][i].p_slowna=2;
	}
	board[5][1].p_literowa=3;
	board[5][5].p_literowa=3;
	board[5][9].p_literowa=3;
	board[5][13].p_literowa=3;
	board[9][1].p_literowa=3;
	board[9][5].p_literowa=3;
	board[9][9].p_literowa=3;
	board[9][13].p_literowa=3;
	board[1][5].p_literowa=3;
	board[1][9].p_literowa=3;
	board[13][5].p_literowa=3;
	board[13][9].p_literowa=3;
	board[6][6].p_literowa=2;
	board[6][8].p_literowa=2;
	board[8][6].p_literowa=2;
	board[8][8].p_literowa=2;
	board[12][6].p_literowa=2;
	board[11][7].p_literowa=2;
	board[12][8].p_literowa=2;
	board[14][3].p_literowa=2;
	board[14][11].p_literowa=2;
	board[11][0].p_literowa=2;
	board[11][14].p_literowa=2;
	board[8][2].p_literowa=2;
	board[7][3].p_literowa=2;
	board[6][2].p_literowa=2;
	board[8][12].p_literowa=2;
	board[7][11].p_literowa=2;
	board[6][12].p_literowa=2;
	board[2][6].p_literowa=2;
	board[3][7].p_literowa=2;
	board[2][8].p_literowa=2;
	board[3][0].p_literowa=2;
	board[3][14].p_literowa=2;
	board[0][3].p_literowa=2;
	board[0][11].p_literowa=2;

}

Plansza::~Plansza(void)
{
}

int Pole::set_wartosc(int nowa_slowna, int nowa_literowa)
{
	p_slowna=nowa_slowna;
	p_literowa=nowa_literowa;
	return 0;
}

Pole::Pole()
{
	p_slowna=1;
	p_literowa=1;
	letter=NULL;
}

ostream & operator<<(ostream & wy, const Plansza & B1)
{
	for(int i=0; i<15; i++)
	{
		if(i==0)
		{
			for(int j=0; j<15; j++)
			{
				if(j>9)
					wy << " " << (j+1) << " ";
				else
					wy << " " << (j+1) << "  ";

			}
			cout << endl;
		}

		for(int j=0; j<15; j++)
		{
			wy << "----";
		}
		cout << endl;
		for(int j=0; j<15; j++)
		{
			
			wy << "| " << B1.board[i][j] << " ";

		}
		wy << " |" << i+1 << endl;
		
		if(i==14)
		{
			for(int j=0; j<15; j++)
			{
				if(j>9)
					wy << " " << (j+1) << " ";
				else
					wy << " " << (j+1) << "  ";

			}
		}


	}

	return wy;
}


ostream & operator<<(ostream & wy, const Pole & P1)
{
	if(P1.letter!=NULL)
	{
		wy << *(P1.letter);
	}
	else if(P1.letter==NULL && P1.p_slowna==3) 
	{
		wy << "#";
	}
	else if(P1.letter==NULL && P1.p_slowna==2) 
	{
		wy << "$";
	}
	else if(P1.letter==NULL && P1.p_literowa==3) 
	{
		wy << "+";
	}
	else if(P1.letter==NULL && P1.p_literowa==2) 
	{
		wy << "=";
	}
	else
		wy << " ";

	return wy;
}

ostream & operator<<(ostream & wy, const Litera & L1)
{
	wy << L1.znak;
	return wy;
}

bool Plansza::umiesc(Litera * L2, int x, int y)
{
	return board[y][x].wstaw_litere(L2);
}
void Plansza::legenda()
{
	cout << "Legenda:" << endl << "# - 3x premia slowna" << endl << "$ - 2x premia slowna" << endl << "+ - 3x premia literowa" << endl << "= - 2x premia literowa" << endl << "% - pole startowe" << endl;
}

bool Pole::wstaw_litere(Litera * L3)
{
	letter=L3;

	return true;
}


Litera::Litera()
{

}

Litera::Litera(char z1, int pkt1)
{
	znak=z1;
	pkt=pkt1;
}

Gra.cpp

 
#include "Gra.h"


Gra::Gra(void)
{
	fstream plik;
	plik.open( "pula.txt", ios::in | ios::out );
	if( plik.good() == true )
		cout << "Uzyskano dostep do pliku!" << endl;
	else 
		cout << "Dostep do pliku zostal zabroniony!" << endl;

	glowa=wsk=new Litera;
	glowa=NULL;
	wsk=NULL;
	while(!plik.eof())
	{ 
		if(glowa==NULL)
		{
			glowa=wsk=new Litera;
		}

		else
		{ 
			wsk->nast=new Litera;
			wsk=wsk->nast;
		}

		plik >> wsk->znak;
		plik >> wsk->pkt;
		wsk->nast=NULL;
		

	}
	/*
	// Blanki
	for(int i=0; i<2; i++)
		pula.push_back(Litera('*',0));
	// Litery za 1 pkt
	for(int i=0; i<9; i++)
		pula.push_back(Litera('A',1));
	for(int i=0; i<7; i++)
		pula.push_back(Litera('E',1));
	for(int i=0; i<8; i++)
		pula.push_back(Litera('I',1));
	for(int i=0; i<5; i++)
		pula.push_back(Litera('N',1));
	for(int i=0; i<6; i++)
		pula.push_back(Litera('O',1));
	for(int i=0; i<4; i++)
		pula.push_back(Litera('R',1));
	for(int i=0; i<4; i++)
		pula.push_back(Litera('S',1));
	for(int i=0; i<4; i++)
		pula.push_back(Litera('W',1));
	for(int i=0; i<5; i++)
		pula.push_back(Litera('Z',1));
	
	// Litery za 2 pkt
	for(int i=0; i<3; i++)
		pula.push_back(Litera('C',2));
	for(int i=0; i<3; i++)
		pula.push_back(Litera('D',2));
	for(int i=0; i<3; i++)
		pula.push_back(Litera('K',2));
	for(int i=0; i<3; i++)
		pula.push_back(Litera('L',2));
	for(int i=0; i<3; i++)
		pula.push_back(Litera('M',2));
	for(int i=0; i<3; i++)
		pula.push_back(Litera('P',2));
	for(int i=0; i<3; i++)
		pula.push_back(Litera('T',2));
	for(int i=0; i<4; i++)
		pula.push_back(Litera('Y',2));


	// Litery za 3 pkt
	for(int i=0; i<2; i++)
		pula.push_back(Litera('B',3));
	for(int i=0; i<2; i++)
		pula.push_back(Litera('G',3));
	for(int i=0; i<2; i++)
		pula.push_back(Litera('H',3));
	for(int i=0; i<2; i++)
		pula.push_back(Litera('J',3));
	for(int i=0; i<2; i++)
		pula.push_back(Litera('Ł',3));
	for(int i=0; i<2; i++)
		pula.push_back(Litera('U',3));

	// Litery za 5 i wiecej pkt
	pula.push_back(Litera('Ą',5));
	pula.push_back(Litera('Ę',5));
	pula.push_back(Litera('F',5));
	pula.push_back(Litera('Ó',5));
	pula.push_back(Litera('Ś',5));
	pula.push_back(Litera('Ż',5));
	pula.push_back(Litera('Ć',6));
	pula.push_back(Litera('Ń',7));
	pula.push_back(Litera('Ź',9));
	*/
}

void Gra::dostepne_litery()
{
	wsk=glowa;
	int z=0;
	while(wsk!=NULL)
	{
		cout << wsk->znak << ", " ;
		
		if(z<9)
			z++;
		else
		{
			z=0;
			cout << endl;
		}
		wsk=wsk->nast;
	}
	cout << endl;
	/*int i=0;
	for( list<Litera>::iterator iter=pula.begin(); iter != pula.end(); iter++ )
	{
		
		if(i<10){}
		else
		{
			i=0;
			cout << endl;
		}

		cout << *iter << ", " ;
		i++;
	}
	
	cout << endl;*/
}
Gracz Gra::rozdaj_litery(Gracz player)
{
	//cout << "Otrzymane litery ";
	srand( time( NULL ) );
	wsk=glowa;
	for(int i=0; i<7; i++ )
	{
		for(int j=1; j<((rand()%100)+1); j++)
			wsk=wsk->nast;
		player.reka[i]=wsk;
		wsk=wsk->nast;
		wsk->nast=wsk->nast->nast;

		//cout << *(player.reka[i]) << ", ";
		
	}
	cout << endl;

	return player;
	/*{
		list<Litera>::iterator iter=pula.begin();
		for(int j=0; j<((rand()%100)+1); j++)
		{
			//cout << "Wylosowano " << j << " litere." << endl;
			iter++;
		}
		cout << *iter << ", " ;
		
		Litera * wsk = new Litera;
		wsk=&(*iter);
		//player.pierwsza_litera=&(*iter);
		//player.reka[i]=&(*iter);

		pula.erase(iter);


	}*/
}


Gra::~Gra(void)
{
}
int main()
{
	Gra game;
	Gracz player1(1);
	player1.set_tura(1);
	Gracz player2(2);
	player2.set_tura(1);
	Plansza nowa_plansza;

	cout << nowa_plansza << endl;
	nowa_plansza.legenda();
	//Litera *literka=new Litera('D',3);
	//nowa_plansza.umiesc(literka,5,4);
	game.dostepne_litery();
	cout << "Gdy wszystko prawidlowo wcisknij ENTER" << endl;
	system("PAUSE");
	system("cls");

	cout << nowa_plansza << endl;
	player1=game.rozdaj_litery(player1);
	player2=game.rozdaj_litery(player2);

	char dalej='T';

	while(dalej!='K' || dalej!='k')
	{
		if(player1.get_tura()==player2.get_tura())
		{
			while(dalej=='T' || dalej=='t')
			{
				player1.litery_gracza();
				nowa_plansza=player1.wstaw(nowa_plansza);
				cout << nowa_plansza << endl;
				nowa_plansza.legenda();
				cout << "Chcesz wstawic kolejna litere ? Wpisz T. Koniec - dowolny inny znak." << endl;
				cout << "Wyjdz z gry - wpisz K" << endl;
				cin >> dalej;
		
			}
			player1.nastepna();
		}
		else
		{
			system("cls");
			cout << nowa_plansza << endl;

			dalej='T';
	
			while(dalej=='T' || dalej=='t')
			{
				player2.litery_gracza();
				nowa_plansza=player2.wstaw(nowa_plansza);
				cout << nowa_plansza << endl;
				nowa_plansza.legenda();
				cout << "Chcesz wstawic kolejna litere ? Wpisz T. Koniec - dowolny inny znak." << endl;
				cin >> dalej;
		
			}
			player2.nastepna();
		}
	}
	
	
	
	
	/*
	game.dostepne_litery();
	cout << endl;
	player1.litery_gracza();
	
	game.dostepne_litery();
	player2=game.rozdaj_litery(player2);
	game.dostepne_litery();
	cout << endl;
	player2.litery_gracza();
	*/
	
	system("PAUSE");
	return 0;
}

0

Gracz pochodzący od Rozgrywki - każdy ma własną turę - kompletny bezsens.
Rozgrywka powinna zawierać Dostępne Litery (które nie wiedzieć czemu nazywasz Gra), listę Graczy oraz Plansze.
Przy każdym z graczy możesz trzymać liczbę punktów.

0

user image

0

Wiem, rozgrywka jest klasa na siłę bo muszę mieć dziedziczenie a nie mam na nie pomysłu :(

0

@kubzal nie bądź śmieszny. A różne rodzaje pól na planszy które modyfikują mnożnik dla literek?

0

@kubzal, obczaj to:

#include <iomanip>
for(int i=7;i<14;++i) cout<<setw(2)<<i<<endl;

Wklej plansze z ekranu tekstowo - pokaże jak skraca się Plansza::Plansza(void) do 20 wierszy razem z dziedziczeniem.

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