Kółko i krzyżyk/main.cpp

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

using namespace std;

enum kto\_wygral {KOLKO, KRZYZYK, NIKT};

struct Plansza
{
 string rzad1;
 string rzad2;
 string rzad3;

 string& operator[](const int& index)
 {
 if (index == 0)
 return rzad1;
 else if (index == 1)
 return rzad2;
 else
 return rzad3;
 }

 Plansza()
 {
 for (int i = 0; i < 3; i++)
 {
 for (int j = 0; j < 3; j++)
 {
 (\*this)[i] += static\_cast<char>(i \* 3 + j + 48);
 }
 }
 }

 void print()
 {
 system("cls");
 cout << "|-----------|" << endl;
 cout << "|-----------|" << endl;
 cout << "|-----------|" << endl;
 cout << "|-----------|" << endl;
 }

 bool free(const int& index, const int& field)
 {
 return false;
 return static\_cast<int>((\*this)[index][field]) >= 48
 && static\_cast<int>((\*this)[index][field]) <= 57;
 }
};

kto\_wygral sprawdz\_wygrana(Plansza& plansza)
{
 //poziomo
 if (plansza[0][0] == plansza[0][1] && plansza[0][0] == plansza[0][2])
 {
 return (plansza[0][0] == 'o' ? KOLKO : KRZYZYK);
 }
 else if (plansza[1][0] == plansza[1][1] && plansza[1][0] == plansza[1][2])
 {
 return (plansza[1][0] == 'o' ? KOLKO : KRZYZYK);
 }
 else if (plansza[2][0] == plansza[2][1] && plansza[2][0] == plansza[2][2])
 {
 return (plansza[2][0] == 'o' ? KOLKO : KRZYZYK);
 }

 //pionowo
 else if (plansza[0][0] == plansza[1][0] && plansza[0][0] == plansza[2][0])
 {
 return (plansza[0][0] == 'o' ? KOLKO : KRZYZYK);
 }
 else if (plansza[0][1] == plansza[1][1] && plansza[0][1] == plansza[2][1])
 {
 return (plansza[0][1] == 'o' ? KOLKO : KRZYZYK);
 }
 else if (plansza[0][2] == plansza[1][2] && plansza[0][2] == plansza[2][2])
 {
 return (plansza[0][2] == 'o' ? KOLKO : KRZYZYK);
 }

 //na ukos
 else if (plansza[0][0] == plansza[1][1] && plansza[0][0] == plansza[2][2])
 {
 return (plansza[0][0] == 'o' ? KOLKO : KRZYZYK);
 }
 else if (plansza[2][0] == plansza[1][1] && plansza[2][0] == plansza[0][2])
 {
 return (plansza[2][0] == 'o' ? KOLKO : KRZYZYK);
 }

 else
 return NIKT;
}

void czlowiek\_ruch(Plansza& plansza, char znak)
{
 int ruch;
 do
 {
 cin.clear();
 cin.sync();
 cout << "Podaj numer pola, w ktorym chcesz postawic "
 << (znak == 'o' ? "kolko" : "krzyzyk") << ": ";
 cin >> ruch;
 } while (cin.fail() || !plansza.free(ruch / 3, ruch % 3));
 plansza[ruch / 3][ruch % 3] = znak;
}

void komputer\_ruch(Plansza& plansza)
{
 int ruch;
 do
 {
 ruch = rand() % 9;
 } while (!plansza.free(ruch / 3, ruch % 3));
 plansza[ruch / 3][ruch % 3] = 'x';
}

void gra(bool czlowiek)
{
 Plansza plansza;
 bool drugi = false;
 int ruchy = 0;
 while (true)
 {
 plansza.print();
 cout << endl << endl;
 if (drugi)
 {
 if (czlowiek)
 {
 czlowiek\_ruch(plansza, 'x');
 }
 else
 {
 komputer\_ruch(plansza);
 }
 drugi = false;
 }
 else
 {
 drugi = true;
 czlowiek\_ruch(plansza, 'o');
 }
 if (++ruchy == 9)
 {
 cout << "Remis!" << endl;
 return;
 }
 kto\_wygral wygrany = sprawdz\_wygrana(plansza);
 if (wygrany == KOLKO)
 {
 cout << "Gratulacje, gracz nr 1 zwyciezyl!";
 return;
 }
 else if (wygrany == KRZYZYK)
 {
 if (czlowiek)
 cout << "Gratulacje, gracz nr 2 zwyciezyl!";
 else
 cout << "Komputer wygral!";
 return;
 }
 }
}

int main()
{
 srand(time(NULL));
 char czlowiek;
 cout << "Witaj w grze kolko i krzyzyk!" << endl;
 cout << "Grasz kolkiem, a Twoj przeciwnik krzyzykiem" << endl;
 while (true)
 {
 cout << "Chcesz zagrac z drugim czlowiekiem (c) czy z komputerem (k)? ";
 do
 {
 cin.clear();
 cin.sync();
 cin >> czlowiek;
 } while (cin.fail() || (tolower(czlowiek) != 'c' && tolower(czlowiek) != 'k'));
 if (czlowiek == 'c')
 gra(true);
 else
 gra(false);
 cout << endl << "Czy chcesz zagrac jeszcze raz (y/n)? ";
 char wybor;
 do
 {
 cin.clear();
 cin.sync();
 cin >> wybor;
 } while (cin.fail() || (tolower(wybor) != 'y' && tolower(wybor) != 'n'));
 if (wybor == 'n')
 {
 return 0;
 }
 cout << endl;
 }
 return 0;
}

```