C++, kółko i krzyżyk, wskaźniki -> nadpisywanie znaku


(Xxx Paka) #1

oto tresc zadania

napisać grę kółko i krzyżyk. Informacje o stanie gry powinny być zapisywane w tablicy dwuwymiarowej stworzonej przy użyciu tablicy wskaźników:

char * plansza[3];

W programie proszę wyodrębnić przynajmniej dwie funkcje: wyświetlającą planszę (proszę przekazać planszę do funkcji przy użyciu wskaźnika) oraz funkcję sprawdzającą czy jeden z graczy wygrał.

kod programu

#include 

#include "moja.h"

#include 

using namespace std;


void wyswietl(char **plansza){

	  char gracz1[15],gracz2[15];

 	  cout<<"podaj imie 1 gracza\n";

 	  cin>>gracz1;

 	  cout<<"podaj imie 2 gracza\n";

 	  cin>>gracz2;

	  for ( int i =0; i<3; i++){

 	  		plansza[i] = new char [3] ; 

 	  		for ( int j =0; j<3; j++) {

 				 plansza [i] [j]=' ' ; 

		 		 }

     }

	  cout<<" 1 2 3"<
 	  int k=1;

		   for ( int i =0; i<3; i++) { 

				 cout<
		 		 for ( int j =0; j<3; j++) {

 				 	  cout << plansza [i] [j]<<"|";

  		  			  }

 			    cout <
 			}

      gra(plansza,gracz1,gracz2);

}






void gra(char **plansza,char *gracz1,char *gracz2){

	  int x,y;

	  while(1){

				  while(1){

				  			  cout<
				  			  cout<<"podaj wspolrzedne: ";

				  			  cin>>x;

				  			  cin>>y;

				  			  if(x<1 || x>3 || y<1 || y>3)continue;

				  			  //if(czy_zajete(plansza,x,y)==0)continue;

				  			  else break;

				  }

				  plansza[y][x]='X';

				  cout<<" 1 2 3";

				  for(int i=1;i<=3;i++){

				  			 cout<
							 cout<
							 for(int j=1;j<=3;j++){

							 			cout<
								}

			     }

				  cout<
				  if(sprX(plansza,*gracz1)==1)break;							

				  while(1){									

						cout<
						cout<<"podaj wspolrzedne: ";

						cin>>x;

						cin>>y;

						if(x<1 || x>3 || y<1 || y>3)continue;

						//if(czy_zajete(plansza,x,y)==0)continue;				

						else break;

			      }

					plansza[x][y]='O';

					cout<<" 1 2 3";

					for(int i=1;i<=3;i++){

							  cout<
							  cout<
							  for(int j=1;j<=3;j++){

							  			 cout<
								 }

				 }

				 cout<
				 if(sprO(plansza,*gracz2)==1)break;					

				 if(remis(plansza)==0){cout<<"REMIS"<
				 continue;

				 }

}







/* int czy_zajete(char **plansza, int x, int y){

	bool c=true;

	cout<
	if(plansza[x][y]!=' ')c=false;

	return c;

	}*/ 


	// NAD TYM JESZCZE PRACUJE


int remis(char **plansza)

{

	int f=0;

	for(int i=1;i<=3;i++){

			for(int j=1;j<=3;j++){

				if(plansza[i][j]==' ')f++;

			}

		}

	return f;

}[/code]

kod dostepny takze tutaj

http://www.wklejto.pl/140526

(uważam ze lepiej się przegląda )

  1. czemu jak odkomentuje warunek sprawdzania czy pole jest juz zajęte ( na chwile obecna mozna nadpisywac ruch przeciwnika) nie moge wpisac współrzędnych z 3? typu [][3] || [3][]

dziekuje za pomoc


([alex]) #2

bo masz od [0][0] do [2][2]


(Xxx Paka) #3

rozumiem ze tablica jest indeksowana inaczej ale to chyba nie to

int czy_zajete(char **plansza, int x, int y){

	 cout<
	bool c=true;

	if(plansza[y][x]!=' ')c=false;

	return c;

	}

wstawilem jakby breakpointa ( cout<


(etam) #4

To co napisał [alex]. Tablice są indexowane od 0, więc w tym przypadku do 2.


([alex]) #5
int czy_zajete(char **plansza, int x, int y){ // nazwa chyba ma być czy_wolne

    cout<
    return plansza[y-1][x-1]==' '; // lub tu powinno być !=

   }

(Xxx Paka) #6

ehhh, wybaczcie, nie dokonca rozumialem o co chodzi, bylem pewien ze wszystko jest ok… troche juz przy tym siedze, jeszcze ogladalem na yt filmy po 1h zeby nauczyc sie tych wskaznikow^^

ostatnie juz pytanie

int sprO(char **plansza,char gracz2){

	bool k=false;

	while(1){

	   if(plansza[0][0]=='O' && plansza[0][1]=='O' && plansza[0][2]=='O'){cout<
		if(plansza[1][0]=='O' && plansza[1][1]=='O' && plansza[1][2]=='O'){cout<
		if(plansza[2][0]=='O' && plansza[2][1]=='O' && plansza[2][2]=='O'){cout<
		if(plansza[2][0]=='O' && plansza[1][0]=='O' && plansza[0][0]=='O'){cout<
		if(plansza[0][1]=='O' && plansza[1][1]=='O' && plansza[2][1]=='O'){cout<
		if(plansza[0][2]=='O' && plansza[1][2]=='O' && plansza[2][2]=='O'){cout<
		if(plansza[0][0]=='O' && plansza[1][1]=='O' && plansza[2][2]=='O'){cout<
		if(plansza[2][0]=='O' && plansza[1][1]=='O' && plansza[0][2]=='O'){cout<
		break;

	}

	return k;

}

wczesniej gracz2 przedstawialo jako imie, a w tejfunkcji przedstawia jako 1 litere imienia


([alex]) #7

…, char *gracz2) no i odpowiednie wywołanie.

Poza tym, po kiego sprawdzasz wszystkie warianty? Wystarczy sprawdzić tylko te przechodzące przez ostatnio postawione ‘O’.

Oraz ten:

while(1){

....

      break;

   }

przecież to bezsens!

lepiej już: { cout<