[C++][visual studio] Statki strukturalnie

transatlantyk a
Użytkownik
Użytkownik
Posty: 15
Rejestracja: 2 gru 2015, o 18:53
Płeć: Kobieta
Lokalizacja: Polska

[C++][visual studio] Statki strukturalnie

Post autor: transatlantyk a »

Witam, piszę grę w statki, nieobiektowo. mam pewien problem, nad którym już trochę siedzę, to mój kod:

Kod: Zaznacz cały

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<string>

using namespace std;
int wynik1, wynik2;
int const N = 9;
char plansza1[N][N];
char plansza2[N][N];
char pole[N][N];
char pole_pomocnik[11][11];
bool ustawienie;
int ulatwienia, typ_rozgr;
int i, j, k, x, y,w;
int r = 4;
string nick, nick1, nick2, nick3;
int orient, gracz;
char strategia;
int strzaly1, strzaly2;
int pudla1, pudla2;
int zatopienia1, zatopienia2;

void menu();
void ustaw_statki(int gracz);
void set_planszekomp(char strategia);
void wyswietl_plansze(int ulatwienia, int gracz);
bool czy_zatopiony(int w, int k);
//int ruch(int gracz);
//int ruch_komp();
//int getruchy(int gracz);
//int rozgrywka(int typ_rozgr);



void menu()
{
	cout << "\t\t\tWitaj w Battleship Limited Reunion 15/16\n\n" << "Jaki rodzaj rozgrywki wybierasz?\n\n" << "1.Multiplayer\n" << "2.Gracz vs komputer\n" << "3.Wyjscie\n";
	cin >> typ_rozgr;
	switch (typ_rozgr){
	case 1:
		cout << "\n\nPodaj nick gracza nr 1:\n";
		cin >> nick1;
		cout << "\n\n" << "Podaj nick gracza nr 2:\n";
		cin >> nick2;
		system("cls");
		cout << "Czy chcecie stosowac ulatwienia?\n\n" << "1.Oznaczanie pol na ktrych nie moze byc statku\n" << "2.Oznaczanie pol na ktore oddano juz strzal\n" << "3.Bez ulatwien\n" << "4.Powrot do menu\n";
		cin >> ulatwienia;
		break;
	case 2:
		cout << "\n\nPodaj nick gracza:\n";
		cin >> nick1;
		nick3 = "wrog";
		system("cls");
		cout << "Jaka strategie ma stosowac komputer?\n\n" << "a.Losowa\n" << "b.Statki w orientacji pionowej\n" << "c.Statki w orientacji poziomej\n" << "d.Powrot do menu\n" << "e.Wyjscie z gry\n";
		cin >> strategia;
		break;
	case 3:
		exit(0);
		break;
	}
	system("cls");
	cout << "Oznaczenia pol na planszy:\n\n"
		<< "0"": pole nieodkryte\n"
		<< "+"": zatopiony maszt\n"
		<< "-"": pole puste\n"
		<< "."": pole na ktorym nie moze byc masztu innego statku\n\n"
	    <<"Nacisnij dowolny klawisz, zeby przejsc dalej";
}

void ustaw_statki(int gracz)
{
	
	for (i = 0; i < 10; i++){
		for (j = 0; j < 10; j++)
			pole[i][j] = '0';////////////////zmiana
	}
	if (gracz == 1){ nick = nick1; plansza1[11][11] = pole[11][11]; }
	else if (gracz == 2){ nick = nick2; plansza2[11][11] = pole[11][11]; }
	cout << nick << " utworzysz teraz plansze swojej gry, ma ona wymiar 10x10, twoje okrety to\n"
		<< " czteromasztowiec\n trzymasztowiec\n  dwumasztowiec\n jednomasztowiec\n\n"
		<< "Mozesz tworzyc je tylko w postaci odcinkow o orientacji dla kazdego z nich poziomej lub pionowej.\n"
		<< "Podajesz zawsze wspolrzedne kolumny i wiersza pierwszego masztu statku patrzac od gory i lewej strony planszy.\n"
		<< "Pamietaj, zeby podawane przez Ciebie wspolrzedne nie powodowaly budowania statku poza plansza ani krzyzowania\n"
		<< "lub stykania sie okretow. Kolumny i wiersze numerowane sa od 1 do 10.\n\n";
	ustawienie = true;

		w = x - 1;//żeby wczytane znaki z konsoli były odekwatne do numeracji pól w tablicy
		k = y - 1;

		cout << "Podajesz koordynaty dla 4-masztowca\n";
		cout << "Podaj wiersz i kolumne pierwszej wspolrzednej statku, rozdziel je spacja\n";
		cin >> x >> y;
		cout << "Podaj orientacje statku\n1.Pionowa\n2.Pozioma:\n";
		cin >> orient;
		if ((orient == 1 && w > 7) || (orient == 2 && k > 7))///warunke zawierania sie statku na planszy
		{
			cout << "Na tym polu nie zbudujesz statku- nie zawieralby sie na planszy!";
			ustawienie == false;
		}
		for (int j = 0; j < 4; j++)///warunke krzyzowania sie statku na planszy
		{
			if (pole[w][k] == '1')
			{
				cout << "Na tym polu nie zbudujesz statku- krzyzowalby sie z innym!";
				ustawienie = false;
			}
			if (orient == 1)
				w++;
			else
				k++;
		}
		if (ustawienie == true && orient == 1)/////rysowanie statku, jeżeli jest prawidlowy w zaleznosci od jego orientacji
		{
			for (int j = 0; j < 4; j++)
			{
				pole[w][k] = '1';
				w++;
			}
		}
		else if (ustawienie == true && orient == 2)
		{
			for (int j = 0; j < 4; j++)
			{
				pole[w][k] = '1';
				k++;
			}
		}


		/////to samo dla reszty okretow
		ustawienie = true;

			cout << "Podajesz koordynaty dla 3-masztowca\n";
			cout << "Podaj wiersz i kolumne pierwszej wspolrzednej statku, rozdziel je spacja\n";
			cin >> x >> y;
			cout << "Podaj orientacje statku\n1.Pionowa\n2.Pozioma:\n";
			cin >> orient;
			w = x - 1;
			k = y - 1;
			if ((orient == 1 && w > 8) || (orient == 2 && k > 8))
				cout << "Na tym polu nie zbudujesz statku- nie zawieralby sie na planszy!";
			for (int j = 0; j < 3; j++)
			{                                                  //pętla sparwdzajaca, czy pola dookoła nowo budowanego
				if (pole[w][k] == '1')//statku i jego maszty nie są oznaczone już przez x lub 1
				{
					cout << "Na tym polu nie zbudujesz statku- krzyzowalby sie z innym!"; ustawienie == false;
					ustawienie = false;
				}
				if (orient == 1)
					w++;
				else
					k++;
			}

			if (ustawienie == true && orient == 1)
			{
				for (int j = 0; j < 3; j++)
				{
					pole[w][k] = '1';
					w++;
				}
			}
			else if (ustawienie == true && orient == 2)
			{
				for (int j = 0; j < 3; j++)
				{
					pole[w][k] = '1';
					k++;
				}
			}
	

		ustawienie = true;
	
			cout << "Podajesz koordynaty dla 2-masztowca\n";
			cout << "Podaj wiersz i kolumne pierwszej wspolrzednej statku, rozdziel je spacja\n";
			cin >> x >> y;
			cout << "Podaj orientacje statku\n1.Pionowa\n2.Pozioma:\n";
			cin >> orient;
			w = x - 1;
			k = y - 1;
			if ((orient == 1 && w > 9) || (orient == 2 && k > 9))
				cout << "Na tym polu nie zbudujesz statku- nie zawieralby sie na planszy!"; ustawienie == false;
			for (int j = 0; j < 2; j++)
			{                                                  //pętla sparwdzajaca, czy pola dookoła nowo budowanego
				if (pole[w][k] == '1')//statku i jego maszty nie są oznaczone już przez x lub 1
				{
					cout << "Na tym polu nie zbudujesz statku- krzyzowalby sie z innym!";
					ustawienie = false;
				}
				if (orient == 1)
					w++;
				else
					k++;
			}
			if (ustawienie == true && orient == 1)
			{
				for (int j = 0; j < 2; j++)
				{
					pole[w][k] = '1';
					w++;
				}
			}
			else if (ustawienie == true && orient == 2)
			{
				for (int j = 0; j < 2; j++)
				{
					pole[w][k] = '1';
					k++;
				}
			}
		

		ustawienie = true;

			cout << "Podajesz koordynaty dla 1-masztowca\n";
			cout << "Podaj wiersz i kolumne pierwszej wspolrzednej statku, rozdziel je spacja\n";
			cin >> x >> y;
			w = x - 1;
			k = y - 1;
			if ((w > 10) || (k > 10))
			{
				cout << "Na tym polu nie zbudujesz statku- nie zawieralby sie na planszy!"; ustawienie == false;
			}
			else if (pole[w][k] == '1')
			{
				cout << "Na tym polu nie zbudujesz statku- krzyzowalby sie z innym!";
				ustawienie = false;
			}
			if (ustawienie == true)
				pole[w][k] = '1';
}

void set_planszekomp(char strategia)////na takich samych zasadach jak ustaw_statki
{
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		plansza2[i][j] = '0';
	}
	switch (ulatwienia)
	{
	case 'b':
		orient = 1;
		break;
	case 'c':
		orient = 2;
		break;
	}
	w = x - 1;
	k = y - 1;

	ustawienie = true;
	x = (rand() % 10) + 0;
	y = (rand() % 10) + 0;
	if(strategia=='a'){orient=(rand()%2)+1;}
	if ((orient == 1 && w > 7)||(orient==2&&k>7))
			ustawienie=false;
	for (int j = 0; j < 4; j++)
		{                                                  
			if (plansza2[w][k] == '1')
				ustawienie = false;
			if (orient == 1)
				w++;
			else
				k++;
		}
	if (ustawienie == true && orient == 1)
		{
			for (int j = 0; j < 4; j++)
			{
				plansza2[w][k] = '1';
				w++;
			}
		}
	else if (ustawienie == true && orient == 2)
		{
			for (int j = 0; j < 4; j++)
			{
				plansza2[w][k] = '1';
				k++;
			}
		}

	x = (rand() % 10) + 0;
	y = (rand() % 10) + 0;
	ustawienie = true;
	if(strategia=='a'){orient=(rand()%2)+0;}
	
	if ((orient == 1 && w > 8)||(orient==2&&k>8))
			ustawienie=false;
	for (int j = 0; j < 3; j++)
		{                                                  
			if (plansza2[w][k] == '1')
				ustawienie = false;
			if (orient == 1)
				w++;
			else
				k++;
		}
	if (ustawienie == true && orient == 1)
	{
		for (int j = 0; j < 3; j++)
		{
			plansza2[w][k] = '1';
			w++;
		}
	}
	else if (ustawienie == true && orient == 2)
	{
		for (int j = 0; j < 4; j++)
			{
				plansza2[w][k] = '1';
				k++;
			}
	}

	x = (rand() % 10) + 0;
	y = (rand() % 10) + 0;
	ustawienie = true;	
	if(strategia=='a'){orient=(rand()%2)+0;}

	if ((orient == 1 && w > 9)||(orient==2&&k>9))
			ustawienie=false;
	for (int j = 0; j < 2; j++)
		{                                                  
			if (plansza2[w][k] == '1')
				ustawienie = false;
			if (orient == 1)
				w++;
			else
				k++;
		}
	if (ustawienie == true && orient == 1)
		{
			for (int j = 0; j < 2; j++)
			{
				plansza2[w][k] = '1';
				w++;
			}
		}
	else if (ustawienie == true && orient == 2)
		{
			for (int j = 0; j < 2; j++)
			{
				plansza2[w][k] = '1';
				k++;
			}
		}

	x = (rand() % 10) + 0;
	y = (rand() % 10) + 0;
	ustawienie = true;
	if (strategia == 'a'){ orient = (rand() % 2) + 0; }

	if ((orient == 1 && w > 10)||(orient==2&&k>10))
		ustawienie=false;
	if (plansza2[w][k] == '1')
		ustawienie = false;
	if (ustawienie == true)
		plansza2[w][k] = '1';
}

void wyswietl_plansze(int ulatwienia, int gracz)
{///zerowanie pole[11][11]
	for (i = 0; i < 10; i++){
		for (j = 0; j < 10; j++){
			pole[i][j] = '0';
		}
	}
	if (gracz == 1){ nick = nick1; pole_pomocnik[i][j] = pole[N][N]; pole[N][N] = plansza2[N][N]; }
	else if (gracz == 2){ nick = nick2; pole_pomocnik[i][j] = pole[N][N];  pole[N][N] = plansza1[N][N]; }
	char z= '2';
	char t = z;
	char  p = z;
	char u = z;
	char f = z;
	char  g = z;
	switch (ulatwienia)
	{
	case 0:////wyswietlanie jawnie wszystkich statkow na planszy
		f = '1';
		break;
	case 1:////wyswietlanie pol gdzie byl oddany strzal
		p = '.';
		t = '-';
		g = '+';
		break;
	case 2:////wyświetlanie pól, na których nie może być statku
		z = '0';
		break;
	case 3:///bez ulatwień, tylko zatopione maszty
		u = '+';
		break;
	}
	cout << "Oto plansza gracza " << nick;

	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++){
			if (pole[i][j] == f){ pole_pomocnik[i][j] = '1'; }

			if (pole[i][j] == z)
			{
				if (pole[i--][j--] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i--][j] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i--][j++] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i][j--] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i][j++] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i++][j--] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i++][j] == '1'){ pole_pomocnik[i][j] = '.'; }
				else if (pole[i++][j++] == '1'){ pole_pomocnik[i][j] = '.'; }
			}

			if (pole[i][j] == p)pole_pomocnik[i][j] = '.';
			else if (pole[i][j] == t)pole_pomocnik[i][j] = '-';
			else if (pole[i][j] == g)pole_pomocnik[i][j] = '+';

			if (pole[j][j] == u)pole_pomocnik[i][j] = '+';
		}
	}
	for (int i = 0; i < 10; i++)
	{
		for ( int l = 0; l < 10; l++)
			cout << pole_pomocnik[i][j] << ' ';
	}
}




int main()
{
	srand(time(NULL));
	menu();
	if (typ_rozgr == 1)
	{
		ustaw_statki(1);
		ustaw_statki(2);
		cout << "\n\n\n";
		wyswietl_plansze(1, '0');
		cout << "\t\t\t";
		wyswietl_plansze(2, '0');
		do{
			//ruch(1);
			//wynik1 = ruch(1);
			if (wynik1 == 1){ zatopienia1++, strzaly1++; }
			if (wynik1 == 2){ strzaly1++; }
			if (wynik1 == 3){ pudla1++; strzaly1++; }
			//ruch(2);
			//wynik2 = ruch(2);
			if (wynik2 == 1){ zatopienia2++, strzaly2++; }
			if (wynik2 == 2){ strzaly2++; }
			if (wynik2 == 3){ pudla2++; strzaly2++; }
		} while (zatopienia1 == 4 || zatopienia2 == 4);
	}
	else if (typ_rozgr == 2)
	{
		ustaw_statki(1);
		set_planszekomp(strategia);
		cout << "\n\n\n";
		wyswietl_plansze(1, '0');
		cout << "\t\t\t";
		nick2 = "wrog";
		wyswietl_plansze(2, '0');
		do{
			//ruch(1);
			//wynik1 = ruch(1);
			if (wynik1 == 1){ zatopienia1++, strzaly1++; }
			if (wynik1 == 2){ strzaly1++; }
			if (wynik1 == 3){ pudla1++; strzaly1++; }
			//ruch_komp()
			//wynik2=ruch_komp()
			if (wynik2 == 1){ zatopienia2++, strzaly2++; }
			if (wynik2 == 2){ strzaly2++; }
			if (wynik2 == 3){ pudla2++; strzaly2++; }
		} while (zatopienia1 == 4 || zatopienia2 == 4);
	}

	/*
	bool czy_zatopiony(int w, int k)////sprawdza, czy maszty okretu sa zatopione-- wywolana w obu funkcjach ruch
	int ruch(int gracz);      || gracz lub komputer strzela, wywołuję funkcje czy_zatopiony, jezeli trafi.
	int ruch_komp(int gracz); ||return(wynik) wynik=1=>zatopienia++, ruchy++; 2=> ruchy++; 3=> ruchy++, pudlo++
	*/
		if (zatopienia1 == 4)
			nick == nick1;
		else
			nick == nick2;
		cout << "Zwyciezyl gracz\n" << nick << "\n\n Plansza gracza " << nick1 << "\n\n";
		wyswietl_plansze(1, '5');
		cout << "\n\n Plansza gracza" << nick2 << "\n\n";
		wyswietl_plansze(2, '5');

	
	getchar();
	return(0);
}

Nie rozumiem dlaczego, po odpaleniu gry ze środowiska i wybraniu opcji gracz vs komputer, podaniu koordynatów nie wyświetla się plansz gry. poprzednio(w bardzo uproszczonej wersji funkcji wyswietl(..), samo wyświetlenie planszy nie powodowało problemu)

program nie zamyka mi się znikąd, wszystko sie kompiluje, poprosztu pojawiają mi się dwa razy puste plansze(ze znaków białych) nadpisane 'plansza gracza nick1( np agata)

Zamiast poprawnie wypisanych planszy gracza i komputera, nadpisanych 'plansza agata' i 'plansza wrog'

Jak kogos zainteresuje temat, to proszę, niech na niego ze mną podywaguje(:
Ostatnio zmieniony 14 sty 2016, o 20:41 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
ODPOWIEDZ