Zastosowałem się do udzielonych porad jednak nadal mam dwa problemy. Kiedy zamiast cyfry podam liczbę nie wyswietla się jeden dobry komunikat, tylko zły i zapętlony w nieskończonosc.
Po drugie nie działa wykrywanie wygranej w drugim diagonalu.
#include <iostream>
#include <cstdlib>
#include <sstream>
using namespace std;
void pokaz_menu (char &znak, int &rozmiar);
void rysuj_plansze (char znak, int rozmiar, char **pole, char kto);
void ruch_gracza (char **pole, int rozmiar, char znak);
bool czy_wygrana (char **pole, int rozmiar);
bool czyPoprawnePole (int x, int y, char **pole, int rozmiar);
bool czyPoprawneMenu (int rozmiar, string brzeg);
bool czyLiczba (string liczba);
string to_string(const int& obj);
main()
{
char znak;
int rozmiar;
pokaz_menu(znak, rozmiar);
char **pole = new char *[rozmiar];
for(int i = 0; i < rozmiar; i++)
{
pole[i] = new char [rozmiar];
for(int j = 0; j < rozmiar; j++)
{
pole[i][j] = 'e';
}
}
rysuj_plansze(znak, rozmiar, pole, '\0');
ruch_gracza(pole, rozmiar, znak);
delete []pole;
}
//--------------------------------------------------------------------------------
void pokaz_menu(char &znak, int &rozmiar)
{
string brzeg = "[ ]\r[";
cout << brzeg << " Witaj w grze kolko i krzyzyk!\n"
<< brzeg << " Polecam zmienic czcionke na rastrowa\n"
<< brzeg << " Podaj rozmiar planszy ( <10 ):\n";
do
{
cout << brzeg << " ";
cin >> rozmiar;
} while(!czyPoprawneMenu(rozmiar, brzeg));
cout << brzeg << " Podaj wzor planszy\n"
<< brzeg << " ";
cin >> znak;
system("cls");
}
//---------------------------------------------------------
void rysuj_plansze(char znak, int rozmiar, char **pole, char kto)
{
int d = rozmiar*5 + 2;
system("cls");
for(int y = 0; y < d; y++)
{
for(int x = 0; x < d; x++)
{
if(y == 0 && !((x-2) % 5))
{
cout << x/5 + 1;
}
else if(x == 0 && !((y-2) % 5))
{
cout << y/5 + 1;
}
else if (x > 0 && y > 0 &&
((x-1) % 5 == 0 || (y-1) % 5 == 0))
{
cout << znak;
}
else
{
if(pole[(y-2)/5][(x-2)/5] == 'o')
{
if (((x - 3)%5 == 0 && (y - 3)%5 == 0) ||
((x - 4)%5 == 0 && (y - 4)%5 == 0))
{
cout << "/";
}
else if (((x - 3)%5 == 0 && (y - 4)%5 == 0) ||
((x - 4)%5 == 0 && (y - 3)%5 == 0))
{
cout << "\\";
}
else
{
cout << " ";
}
}
else if(pole[(y-2)/5][(x-2)/5] == 'x')
{
if (((x - 3)%5 == 0 && (y - 3)%5 == 0) ||
((x - 4)%5 == 0 && (y - 4)%5 == 0))
{
cout << "\\";
}
else if (((x - 3)%5 == 0 && (y - 4)%5 == 0) ||
((x - 4)%5 == 0 && (y - 3)%5 == 0))
{
cout << "/";
}
else
{
cout << " ";
}
}
else cout << " ";
}
}
cout << endl;
}
}
//--------------------------------------------------------------------------------
bool czy_wygrana(char **pole, int rozmiar)
{
int N = rozmiar - 1;
bool * licznik = new bool[N];
//Wygrana w poziomie
for(int y = 0; y < N + 1; y++)
{
int i = 0;
int x = 0;
for(; x < N; x++)
{
if(pole[y][x] == pole[y][x + 1] && pole[y][x] != 'e' )
licznik[x] = 1;
}
for(; i < N; i++)
{
if(licznik[i] != 1) break;
}
if(i == N)
{
if(pole[y][x] == 'o')
{
cout << "Wygrywa kolko";
return 1;
}
else
{
cout << "Wygrywa krzyzyk";
return 1;
}
}
}
//Wygrana w pionie
for(int x = 0; x < N + 1; x++)
{
int i = 0;
int y = 0;
for(; y < N; y++)
{
if(pole[y][x] == pole[y + 1][x] && pole[y][x] != 'e' )
licznik[y] = 1;
}
for(; i < N; i++)
{
if(licznik[i] != 1) break;
}
if(i == N)
{
if(pole[y][x] == 'o')
{
cout << "Wygrywa kolko";
return 1;
}
else
{
cout << "Wygrywa krzyzyk";
return 1;
}
}
}
//Wygrana diagonalna '\'
for(int x = 0; x < N; x++)
{
int i = 0;
if(pole[x][x] == pole[x + 1][x + 1] && pole[x][x] != 'e' )
{
licznik[x] = 1;
}
for(; i < N; i++)
{
if(licznik[i] != 1)
{
break;
}
}
if(i == N)
{
if(pole[x][x] == 'o')
{
cout << "Wygrywa kolko";
return 1;
}
else
{
cout << "Wygrywa krzyzyk";
return 1;
}
}
return 0;
}
//Wygrana diagonalna2 /
for(int x = 0, y = N; x < N; x++, y--)
{
int i = 0;
if(pole[y][x] == pole[y - 1][x + 1] && pole[y][x] != 'e' )
{
licznik[x] = 1;
}
for(; i < N; i++)
{
if(licznik[i] != 1)
{
break;
}
}
if(i == N)
{
if(pole[y][x] == 'o')
{
cout << "Wygrywa kolko";
return 1;
}
else
{
cout << "Wygrywa krzyzyk";
return 1;
}
}
return 0;
}
delete [] licznik;
}
//--------------------------------------------------------------------------------
void ruch_gracza(char **pole, int rozmiar, char znak)
{
char kto = 'o';
int x, y;
do
{
do
{
cout << "Ruch gracza '" << kto
<< "'\nPodaj wspolrzedne: ";
cin >> x >> y;
} while(!czyPoprawnePole(x, y, pole, rozmiar));
if (kto == 'o')
{
pole[y - 1][x - 1] = 'o';
rysuj_plansze(znak, rozmiar, pole, kto);
kto = 'x';
}
else if (kto == 'x')
{
pole[y - 1][x - 1] = 'x';
rysuj_plansze(znak, rozmiar, pole, kto);
kto = 'o';
}
} while(!czy_wygrana(pole, rozmiar));
}
//--------------------------------------------------------------------------------
bool czyPoprawnePole(int x, int y, char **pole, int rozmiar)
{
if(!czyLiczba(to_string(rozmiar)))
{
cout << "To nie jest liczba! Sprobuj jeszcze raz.\n";
return 0;
}
if(x > rozmiar || y > rozmiar || x < 0 || y < 0)
{
cout << "Podales nie poprawne dane! Sprobuj jeszcze raz.\n";
return 0;
}
if(pole[y - 1][x - 1] != 'e')
{
cout << "To pole jest zajete! Sprobuj jeszcze raz.\n";
return 0;
}
return 1;
}
//--------------------------------------------------------------------------------
bool czyPoprawneMenu (int rozmiar, string brzeg)
{
if(!czyLiczba(to_string(rozmiar)))
{
cout << brzeg << " To nie jest liczba!\n"
<< brzeg << " Sprobuj jeszcze raz.\n";
return 0;
}
if(rozmiar <= 0 || rozmiar > 9)
{
cout << brzeg << " Podales nie poprawne dane!\n"
<< brzeg << " Sprobuj jeszcze raz.\n";
return 0;
}
return 1;
}
//--------------------------------------------------------------------------------
bool czyLiczba(string liczba)
{
if(isdigit(liczba[0]))
{
return 1;
}
return 0;
}
string to_string(const int& obj)
{
stringstream ss;
ss << obj;
return ss.str();
}