• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ - break nie powoduje przestania działania programu

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
235 wizyt
pytanie zadane 14 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
edycja 14 stycznia 2017 przez heros22pt

Witam, mam mały problem.. Napisałem prostą grę kółko i krzyżyk, której kod podaje niżej. Problem dotyczy tego, że po zakończeniu gry, wyświetla komunikat "wygrał gracz_1", ale gra się nie kończy, mimo iż zastosowałem po informacji o wygranej "break" .. Opisany problem jest w scoupie "void gra(...)"

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>


using namespace std;
void wypelnij_pole(vector<vector<char>> &do_wypelnienia)
{
	

	int number_of_rows = 3;
	int number_of_cols = 3;
	for (int i = 0; i < number_of_rows; i++)
	{
		// dla każdego wiersza tworzymy nowy wektor  
		vector<char> v_row;
		// wypełniamy stworzony wektor wartościami
		for (int j = 0; j < number_of_cols; j++)
		{
			v_row.push_back('-');
		}
		// dodajemy nowy wiersz do głównego wektora
		do_wypelnienia.push_back(v_row);
	}
}
void wyswietl(vector<vector<char>>pole)
{
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			cout << pole[i][j] << "  ";
		}
		cout << endl;
	}
}
void modyfikacja_planszy(vector<vector<char>>&plansza, int row, int cols, char znak)
{
	plansza[row][cols] = znak;
}
bool czy_bylo(vector<vector<char>> plansza, int row, int cols)
{
	if ((plansza[row-1][cols-1] == 'x')||(plansza[row-1][cols-1]=='o'))
	{
		return true;
	}
	else
	{
		return false;
	}

}
bool czy_dopuscic(int row, int cols, vector<vector<char>> plansza)
{
	if (cols>3)
	{
		return false;
	}
	else
	{
		if (row > 3)
		{
			return false;
		}
		else
		{
			if (czy_bylo(plansza, row, cols) == true)
			{
				return false;
			}
		}
	}
	return true;
}
void wprowadzenie_zmian(vector<vector<char>> &plansza, char znak)
{
	int row, cols;

	cout << "podaj numer wiersza: "; row; cin >> row;
	cout << "podaj numer kolumny: "; cols; cin >> cols;
		while (czy_dopuscic(row, cols,plansza) == false)
		{
			cout << "podales zle wzpolzedne! \n\n";
			cout << "podaj numer wiersza: "; row; cin >> row;
			cout << "podaj numer kolumny: "; cols; cin >> cols;
			
		}

	modyfikacja_planszy(plansza, row - 1, cols - 1, znak);
}
bool czy_wygral(vector<vector<char>>plansza,char znak)
{
	int zmienna1 = 0, zmienna2=0;
	for (int i = 0; i < 3; i++)
	{
		if ((plansza[i][0] == znak)&&(plansza[i][1]==znak) &&( plansza[i][2]==znak))
		{
			return true;
		}
		else
		{
			if ((plansza[0][i] == znak)&&(plansza[1][i] == znak) &&(plansza[2][i] == znak))
			{
				return true;
			}
			else
			{
				if (plansza[i][i] == znak)
				{
					zmienna1++;
				}
				else
				{
					if (plansza[2 - i][i] == znak)
					{
						zmienna2++;
					}
				}
			}
		}
	}
	if (zmienna1 == 3 || zmienna2 == 3)
	{
		return true;
	}
	return false;

}
void gra(vector<vector<char>> &plansza)
{
	wyswietl(plansza);
	char znak;
	string gracz = "       ";

	for (int i = 0; i < 9; i++)
	{
		if (i % 2 == 0)
		{
			znak = 'x';
			gracz = "gracz_1";
		}
		else
		{
			znak = 'o';
			gracz = "gracz_2";
		}
		cout << "teraz " << gracz<<" wstawia znak: "<<znak<<endl;
		wprowadzenie_zmian(plansza, znak);

		system("cls");
		if (czy_wygral(plansza, znak) == true)
		{
			wyswietl(plansza);
			cout << "Wygral "<<gracz;
			break;
		}
		wyswietl(plansza);
	}
	//cout << "REMIS!!!";
}
void menu(vector<vector<char>> &plansza)
{
	int wybor;
	cout << "MENU\n1-Nowa Gra\n0-Wyjscie  ";
	cin >> wybor;
	system("cls");
	do
	{
		switch (wybor)
		{
		case 1:
		{
			wypelnij_pole(plansza);
			gra(plansza);
		}
		case 0:
		{
			break;
		}
		}
	} while (wybor != 0);
}
int main()
{
	vector<vector<char>> plansza;
	menu(plansza);

	system("pause");
}

 

1 odpowiedź

+1 głos
odpowiedź 14 stycznia 2017 przez niezalogowany
edycja 30 sierpnia 2017
 
Najlepsza

Problem leży tutaj:

void menu(vector<vector<char>> &plansza)
{
    int wybor;
    do // inny poczatek petli gdy funkcja wypelnij_pole przestanie dzialac
    {

        cout << "MENU\n1-Nowa Gra\n0-Wyjscie  ";
        cin >> wybor;
        system("cls");
// Gdy petla zaczynala sie tutaj to po breaku w wypelnij_pole 
// nastapil natychmiastowy wybor '1', bo taki był ostatnio zapisany
        switch (wybor)
        {
        case 1:
        {
            wypelnij_pole(plansza);
            gra(plansza);
        }
        case 0:
        {
            break;
        }
        }
    } while (wybor != 0);
}
komentarz 14 stycznia 2017 przez niezalogowany
Wtedy nastąpi powrót do menu i trzeba by wyzerować pamięć poprzedniej rozgrywki...
komentarz 14 stycznia 2017 przez heros22pt Użytkownik (950 p.)
Dzięki, rzeczywiście nie zauważyłem dość prostego błędu. NAJ!

Podobne pytania

+2 głosów
1 odpowiedź 721 wizyt
pytanie zadane 12 lutego 2022 w C i C++ przez Yacob Nowicjusz (190 p.)
0 głosów
0 odpowiedzi 653 wizyt
pytanie zadane 7 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 702 wizyt
pytanie zadane 25 listopada 2018 w C i C++ przez pawel33335555 Początkujący (440 p.)

93,439 zapytań

142,431 odpowiedzi

322,677 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...