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

lista enum w grze kółko i krzyżyk

VPS Starter Arubacloud
0 głosów
380 wizyt
pytanie zadane 24 listopada 2019 w C i C++ przez thirdman Nowicjusz (120 p.)

Witam. Przerabiam właśnie książkę Alexa Allaina -Przewodnik dla początkujących. Jest tam takie zadanie praktyczne: "Napisz grę w kółko i krzyżyk, w której dwie osoby grają przeciw sobie. Jeśli to możliwe, użyj typu wyliczeniowego enum w celu przechowywania wartości pól planszy."  Udało mi się napisać tę grę, ale niestety nie umiałem wykorzystać tego typu wyliczeniowego, i nie wiem tak naprawdę jak on by mi mógł tu pomóc, w książce było to słabo wyjaśnione. Mógłby mi ktoś podpowiedzieć, w jaki sposób mógłbym go wykorzystać w tej grze?

#include <iostream>
#include <Windows.h>


using namespace std;

char plansza[3][3] = { '-', '-', '-', '-', '-', '-', '-', '-', '-' };
char  znak = 'X';
int xw = 0;
int ow = 0;

void Rysuj()
{
	for (int i = 0; i <= 2; i++)
	{
		for (int j = 0; j <= 2; j++)
		{
			cout << plansza[i][j];
		}
		cout << endl;
	}
}

void Gracz()
{
	int a;
	cin >> a;

	switch (a)
	{
	case 1:
		if (plansza[0][0] == '-')
		{
			plansza[0][0] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;

	case 2:
		if (plansza[0][1] == '-')
		{
			plansza[0][1] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 3:
		if (plansza[0][2] == '-')
		{
			plansza[0][2] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 4:
		if (plansza[1][0] == '-')
		{
			plansza[1][0] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 5:
		if (plansza[1][1] == '-')
		{
			plansza[1][1] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 6:
		if (plansza[1][2] == '-')
		{
			plansza[1][2] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 7:
		if (plansza[2][0] == '-')
		{
			plansza[2][0] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 8:
		if (plansza[2][1] == '-')
		{
			plansza[2][1] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;
	case 9:
		if (plansza[2][2] == '-')
		{
			plansza[2][2] = znak;
		}
		else
		{
			cout << "To pole jest zajete!\a";
			Sleep(600);
			Gracz();
		}
		break;

	default:
		cout << "Sprobuj jeszcze raz!\a" << endl;
		Sleep(600);
		Gracz();
	}
	system("cls");
}


void ZmianaGracza()
{

	switch (znak)
	{
	case'X':
		cout << "Kolej gracza O\n\n";
		znak = 'O';

		break;

	case 'O':
		cout << "Kolej gracza X\n\n";
		znak = 'X';
		break;
	}
}

void SprawdzWygrana()
{

	// gracz X
	if (plansza[0][0] == 'X' && plansza[0][1] == 'X' && plansza[0][2] == 'X' ||
		plansza[0][0] == 'X' && plansza[1][0] == 'X' && plansza[2][0] == 'X' ||
		plansza[1][0] == 'X' && plansza[1][1] == 'X' && plansza[1][2] == 'X' ||
		plansza[2][0] == 'X' && plansza[2][1] == 'X' && plansza[2][2] == 'X' ||
		plansza[0][1] == 'X' && plansza[1][1] == 'X' && plansza[2][1] == 'X' ||
		plansza[0][0] == 'X' && plansza[1][1] == 'X' && plansza[2][2] == 'X' ||
		plansza[2][0] == 'X' && plansza[1][1] == 'X' && plansza[0][2] == 'X' ||
		plansza[0][2] == 'X' && plansza[1][2] == 'X' && plansza[2][2] == 'X')
	{
		Rysuj();
		cout << "\nwygral gracz X!" << endl;
		xw++;
		cout << "\nGracz X wygral " << xw << " razy" << endl;

		string w;
		cout << "\nAby kontynuowac gre wpisz dowolny znak, aby zakonczyc wpisz 0..." << endl;
		cin >> w;
		if (w == "0")
		{
			exit(0);
		}
		else
		{
			system("cls");
			cout << "Kolej gracza O\n\n";
			for (int i = 0; i <= 2; i++)
			{
				for (int j = 0; j <= 2; j++)
				{
					plansza[i][j] = '-', '-', '-', '-', '-', '-', '-', '-', '-';
				}

			}
		}
	}

	//Gracz O
	if (plansza[0][0] == 'O' && plansza[0][1] == 'O' && plansza[0][2] == 'O' ||
		plansza[0][0] == 'O' && plansza[1][0] == 'O' && plansza[2][0] == 'O' ||
		plansza[1][0] == 'O' && plansza[1][1] == 'O' && plansza[1][2] == 'O' ||
		plansza[2][0] == 'O' && plansza[2][1] == 'O' && plansza[2][2] == 'O' ||
		plansza[0][1] == 'O' && plansza[1][1] == 'O' && plansza[2][1] == 'O' ||
		plansza[0][0] == 'O' && plansza[1][1] == 'O' && plansza[2][2] == 'O' ||
		plansza[2][0] == 'O' && plansza[1][1] == 'O' && plansza[0][2] == 'O' ||
		plansza[0][2] == 'O' && plansza[1][2] == 'O' && plansza[2][2] == 'O')
	{
		Rysuj();
		cout << "\nwygral gracz O!" << endl;
		ow++;
		cout << "\nGracz O wygral " << ow << " razy" << endl;

		string w;
		cout << "\nAby kontynuowac gre wpisz dowolny znak, aby zakonczyc wpisz 0..." << endl;
		cin >> w;
		if (w == "0")
		{
			exit(0);
		}
		else
		{

			system("cls");
			cout << "Kolej gracza X\n\n";
			for (int i = 0; i <= 2; i++)
			{
				for (int j = 0; j <= 2; j++)
				{
					plansza[i][j] = '-', '-', '-', '-', '-', '-', '-', '-', '-';

				}

			}
		}

	}

	//Remis
	if (plansza[0][0] != '-' && plansza[0][1] != '-' && plansza[0][2] != '-' && plansza[1][0] != '-' && plansza[1][1] != '-' && plansza[1][2] != '-' &&
		plansza[2][0] != '-' && plansza[2][1] != '-' && plansza[2][2] != '-')
	{

		Rysuj();
		cout << "\nREMIS!!!" << endl;

		string w;
		cout << "\nAby kontynuowac gre wpisz dowolny znak, aby zakonczyc wpisz 0..." << endl;
		cin >> w;
		if (w == "0")
		{
			exit(0);
		}
		else
		{
			system("cls");
			cout << "Kolej gracza X\n\n";
			for (int i = 0; i <= 2; i++)
			{
				for (int j = 0; j <= 2; j++)
				{
					plansza[i][j] = '-', '-', '-', '-', '-', '-', '-', '-', '-';

				}

			}
		}


	}
}


int main()
{
	cout << "Witaj w grze Kolko i Krzyzyk!\n";
	cout << "Gracz X rozpoczyna!" << endl;


	while (true)
	{
		Rysuj();
		Gracz();
		ZmianaGracza();
		SprawdzWygrana();
	}


	return 0;
}

 

1
komentarz 24 listopada 2019 przez tkz Nałogowiec (42,000 p.)
1
komentarz 24 listopada 2019 przez j23 Mędrzec (194,920 p.)
edycja 24 listopada 2019 przez j23

@thirdman, uprościłem Ci funkcję Gracz, żebyś wiedział, jak pisać krótszy kod:

void Gracz()
{
	int position, x, y;

	while(cin >> position) {
		switch (position) {
		case 1: y = 0; x = 0; break;
		case 2: y = 0; x = 1; break;
		case 3: y = 0; x = 2; break;
		case 4: y = 1; x = 0; break;
		case 5: y = 1; x = 1; break;
		case 6: y = 1; x = 2; break;
		case 7: y = 2; x = 0; break;
		case 8: y = 2; x = 1; break;
		case 9: y = 2; x = 2; break;
		default: 
			std::cout << "Sprobuj jeszcze raz!\a\n";
			continue;
		}

		if (plansza[y][x] == '-') {
			plansza[y][x] = znak;
			break;
		} else {
			std::cout << "To pole jest zajete!\a";
			Sleep(600);
		}
	}
	
	system("cls");
}

W sumie nie wiem, dlaczego nie zrobiłeś tak, by gracz podawał pozycję x i y zamiast numeru pola.

komentarz 24 listopada 2019 przez thirdman Nowicjusz (120 p.)
Dzięki!! Musiałem chwilę na to popatrzeć, żeby zrozumieć:D Ale rzeczywiście ten kod dużo przyjemniejszy, będę pamiętał na przyszłość :)

1 odpowiedź

+1 głos
odpowiedź 24 listopada 2019 przez mmarszik Mądrala (7,390 p.)

Mniej więcej tak:

enum POLE {
PUSTE,
KOLKO,
KRZYZYK
};

char plansza[3][3] = { PUSTE,PUSTE,...,PUSTE};
char  znak = 'X';

 

komentarz 24 listopada 2019 przez thirdman Nowicjusz (120 p.)
edycja 24 listopada 2019 przez thirdman

Dobra coś takiego zrobiłem z tym enumem całym, i działa, ale czy jest poprawne? :D

#include <iostream>
#include <Windows.h>


using namespace std;

enum pole {puste='-',kolko='O',krzyzyk='X'};
char plansza[3][3] = { puste,puste,puste,puste,puste,puste,puste,puste,puste};
char znak = krzyzyk;
int xw = 0;
int ow = 0;

void Rysuj()
{
	for (int i = 0; i <= 2; i++)
	{
		for (int j = 0; j <= 2; j++)
		{
			cout << plansza[i][j];
		}
		cout << endl;
	}
}

void Gracz()
{
	 int position, x, y;
 
    while(cin >> position) {
        switch (position) {
        case 1: y = 0; x = 0; break;
        case 2: y = 0; x = 1; break;
        case 3: y = 0; x = 2; break;
        case 4: y = 1; x = 0; break;
        case 5: y = 1; x = 1; break;
        case 6: y = 1; x = 2; break;
        case 7: y = 2; x = 0; break;
        case 8: y = 2; x = 1; break;
        case 9: y = 2; x = 2; break;
        default: 
            std::cout << "Sprobuj jeszcze raz!\a\n";
            continue;
        }
 
        if (plansza[y][x] == puste) {
            plansza[y][x] = znak;
            break;
        } else {
            std::cout << "To pole jest zajete!\a";
            Sleep(600);
        }
    }
     
    system("cls");
}


void ZmianaGracza()
{

	switch (znak)
	{
	case krzyzyk:
		cout << "Kolej gracza O\n\n";
		znak = kolko;
		break;

	case kolko:
		cout << "Kolej gracza X\n\n";
		znak = krzyzyk;
		break;
	}
}

void SprawdzWygrana()
{

	// gracz X
	if (plansza[0][0] == krzyzyk && plansza[0][1] == krzyzyk && plansza[0][2] == krzyzyk ||
		plansza[0][0] == krzyzyk && plansza[1][0] == krzyzyk && plansza[2][0] == krzyzyk ||
		plansza[1][0] == krzyzyk && plansza[1][1] == krzyzyk && plansza[1][2] == krzyzyk ||
		plansza[2][0] == krzyzyk && plansza[2][1] == krzyzyk && plansza[2][2] == krzyzyk ||
		plansza[0][1] == krzyzyk && plansza[1][1] == krzyzyk && plansza[2][1] == krzyzyk ||
		plansza[0][0] == krzyzyk && plansza[1][1] == krzyzyk && plansza[2][2] == krzyzyk ||
		plansza[2][0] == krzyzyk && plansza[1][1] == krzyzyk && plansza[0][2] == krzyzyk ||
		plansza[0][2] == krzyzyk && plansza[1][2] == krzyzyk && plansza[2][2] == krzyzyk)
	{
		Rysuj();
		cout << "\nwygral gracz X!" << endl;
		xw++;
		cout << "\nGracz X wygral " << xw << " razy" << endl;

		string w;
		cout << "\nAby kontynuowac gre wpisz dowolny znak, aby zakonczyc wpisz 0..." << endl;
		cin >> w;
		if (w == "0")
		{
			exit(0);
		}
		else
		{
			system("cls");
			cout << "Kolej gracza O\n\n";
			for (int i = 0; i <= 2; i++)
			{
				for (int j = 0; j <= 2; j++)
				{
					plansza[i][j] = puste;
				}

			}
		}
	}

	//Gracz O
	if (plansza[0][0] == kolko && plansza[0][1] == kolko && plansza[0][2] == kolko ||
		plansza[0][0] == kolko && plansza[1][0] == kolko && plansza[2][0] == kolko ||
		plansza[1][0] == kolko && plansza[1][1] == kolko && plansza[1][2] == kolko ||
		plansza[2][0] == kolko && plansza[2][1] == kolko && plansza[2][2] == kolko ||
		plansza[0][1] == kolko && plansza[1][1] == kolko && plansza[2][1] == kolko ||
		plansza[0][0] == kolko && plansza[1][1] == kolko && plansza[2][2] == kolko ||
		plansza[2][0] == kolko && plansza[1][1] == kolko && plansza[0][2] == kolko ||
		plansza[0][2] == kolko && plansza[1][2] == kolko && plansza[2][2] == kolko)
	{
		Rysuj();
		cout << "\nwygral gracz O!" << endl;
		ow++;
		cout << "\nGracz O wygral " << ow << " razy" << endl;

		string w;
		cout << "\nAby kontynuowac gre wpisz dowolny znak, aby zakonczyc wpisz 0..." << endl;
		cin >> w;
		if (w == "0")
		{
			exit(0);
		}
		else
		{

			system("cls");
			cout << "Kolej gracza X\n\n";
			for (int i = 0; i <= 2; i++)
			{
				for (int j = 0; j <= 2; j++)
				{
					plansza[i][j] = puste;

				}

			}
		}

	}

	//Remis
	if (plansza[0][0] != puste && plansza[0][1] != puste && plansza[0][2] != puste && plansza[1][0] != puste && plansza[1][1] != puste && 
		plansza[1][2] != puste && plansza[2][0] != puste && plansza[2][1] != puste && plansza[2][2] != puste)
	{

		Rysuj();
		cout << "\nREMIS!!!" << endl;

		string w;
		cout << "\nAby kontynuowac gre wpisz dowolny znak, aby zakonczyc wpisz 0..." << endl;
		cin >> w;
		if (w == "0")
		{
			exit(0);
		}
		else
		{
			system("cls");
			cout << "Kolej gracza X\n\n";
			for (int i = 0; i <= 2; i++)
			{
				for (int j = 0; j <= 2; j++)
				{
					plansza[i][j] = puste;

				}

			}
		}


	}
}




int main()
{
	cout << "Witaj w grze Kolko i Krzyzyk!\n";
	cout << "Gracz X rozpoczyna!" << endl;


	while (true)
	{
		Rysuj();
		Gracz();
		ZmianaGracza();
		SprawdzWygrana();
	}


	return 0;
}

 

komentarz 29 kwietnia 2020 przez Eriss69 Gaduła (4,470 p.)
Na moje oko jest poprawnie :)

Podobne pytania

0 głosów
1 odpowiedź 471 wizyt
0 głosów
0 odpowiedzi 263 wizyt
pytanie zadane 26 stycznia 2022 w C i C++ przez kwkstein Nowicjusz (150 p.)
0 głosów
1 odpowiedź 565 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...