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

Wykrywanie wygranej w grze kółko i krzyżyk dla dowolnej ilości pól

Object Storage Arubacloud
0 głosów
486 wizyt
pytanie zadane 6 czerwca 2016 w C i C++ przez Galadrim Nowicjusz (240 p.)

Napisałem program na poprawę oceny(2 klasa liceum) kółko i krzyżyk z tym że to gracz wybiera jak duże ma być pole. Mam jednak jeden problem, mianowicie program nie wykrywa wygranej dla drugiego diagonala i nie mogę znaleźć błędu może komus się uda

//Poni¿szy program to kó³ko i krzy¿yk z opcj¹ wybranie wielkosci planszy
//Program zawiera pe³n¹ obs³ugê b³êdów
//Ze wzglêdów estetycznych nie mo¿na wybraæ wiêkszej planszy ni¿ 10
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <conio.h>
using namespace std;

void PokazMenu (char &znak, string &rozmiar);
void RysujPlansze (char znak, int rozmiar, char **pole, char kto);
void RuchGracza (char **pole, string rozmiar, char znak);
bool CzyWygrana (char **pole, int rozmiar);
bool CzyPoprawnePole (string x, string y, char **pole, string rozmiar);
bool CzyPoprawneMenu (string rozmiar, string brzeg);
bool CzyLiczba (string liczba);
string ToString(const int& obj);
int stoi(string A);
bool CzyKoniec();

main()
{
    char znak;
    string rozmiar;
    do
    {
       PokazMenu(znak, rozmiar);
       int roz = stoi(rozmiar);

       char **pole = new char *[roz];

       for(int i = 0; i < roz; i++)
       {
           pole[i] = new char [roz];

           for(int j = 0; j < roz; j++)
           {
               pole[i][j] = 'e';
           }
       }

       RysujPlansze(znak, roz, pole, '\0');
       RuchGracza(pole, rozmiar, znak);

       delete [] pole;

    } while (CzyKoniec() != true);
}
//--------------------------------------------------------------------------------
void PokazMenu(char &znak, string &rozmiar)
{
    system("cls");
    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 RysujPlansze(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;

    }
    cout << endl;
}
//--------------------------------------------------------------------------------
bool CzyWygrana(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;
            }

            else
            {
                licznik[x] = 0;
            }
        }

        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;
            }

            else
            {
                licznik[x] = 0;
            }
        }

        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 '\'
   {
       int x = 0, i = 0;

       for(; x < N; x++)
       {
           if(pole[x][x] == pole[x + 1][x + 1] && pole[x][x] != 'e' )
           {
               licznik[x] = 1;
           }

           else
           {
               licznik[x] = 0;
           }
       }

       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 /
     {
       int x = 0, i = 0, y = N;

       for(; x < N; x++, y--)
       {
           if(pole[y][x] == pole[y - 1][x + 1] && pole[y][x] != 'e' )
           {
               licznik[x] = 1;
           }

           else
           {
               licznik[x] = 0;
           }
       }

       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 RuchGracza(char **pole, string rozmiar, char znak)
{
    int roz = stoi(rozmiar);
    char kto = 'o';
    string sX, sY;
    int i = 0;
    do
    {
        if(i == roz*roz)
        {
           cout << "Remis";
           break;
        }
        do
        {
            cout << "Ruch gracza '" << kto
                 << "'\nPodaj wspolrzedne: ";
            cin >> sX >> sY;
        } while(!CzyPoprawnePole(sX, sY, pole, rozmiar));

        int x = stoi(sX), y = stoi(sY);

        if (kto == 'o')
        {
            pole[y - 1][x - 1] = 'o';
            RysujPlansze(znak, roz, pole, kto);
            kto = 'x';
        }
        else if (kto == 'x')
        {
            pole[y - 1][x - 1] = 'x';
            RysujPlansze(znak, roz, pole, kto);
            kto = 'o';
        }

        i++;
    } while(!CzyWygrana(pole, roz));

}
//--------------------------------------------------------------------------------
bool CzyPoprawnePole(string sX, string sY, char **pole, string rozmiar)
{
    int roz = stoi(rozmiar);
    int x = stoi(sX), y = stoi(sY);

    if(!CzyLiczba(sX) || !CzyLiczba(sY))
    {
        cout << "\nTo nie jest liczba!\n"
             << "Sprobuj jeszcze raz.\n\n";
        return 0;
    }

    if(x > roz || y > roz || x < 1 || y < 1)
    {
        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 (string rozmiar, string brzeg)
{
   int roz = stoi(rozmiar);
   if(!CzyLiczba(rozmiar))
    {
        cout << brzeg << "  To nie jest liczba!\n"
             << brzeg << "  Sprobuj jeszcze raz.\n";
        return 0;
    }

    if(roz <= 0 || roz > 9)
    {
        cout << brzeg << "  Podales nie poprawne dane!\n"
             << brzeg << "  Sprobuj jeszcze raz.\n";
        return 0;
    }

    return 1;
}
//--------------------------------------------------------------------------------
bool CzyLiczba(string liczba)
{
   for( int i = 0; i < liczba.length(); i++ )
   {
        if (!isdigit (liczba[i]))
        {
            return 0;
        }
   }

   return 1;
}
//--------------------------------------------------------------------------------
bool CzyKoniec()
{
   getch();
   int Koniec;

   while(true)
   {
      system("cls");
      cout << "     **MENU**\n\n"
           << "1. Zagraj jeszcze raz\n"
           << "2. Koniec gry\n";

      Koniec = getch();

      if(Koniec == '1')
      {
         return 0;
      }

      else if(Koniec == '2')
      {
         return 1;
      }

      else
      {
         cout << "Nie poprawny znak. Sprobuj jeszcze raz";
      }
   }

}
//--------------------------------------------------------------------------------
int stoi(string str)
{
    return atoi(str.c_str());
}

 

1 odpowiedź

0 głosów
odpowiedź 7 czerwca 2016 przez katolik6 Dyskutant (8,140 p.)
Sprubuję pomóc. Na cpp 11 masz przeładowane stoi();
komentarz 7 czerwca 2016 przez katolik6 Dyskutant (8,140 p.)
edycja 7 czerwca 2016 przez katolik6
Aplikacja ma problemy przy postawieniu 2 znaków, których przedłużenie wychodzi poza planszę. Błąd występuje przed sprawdzaniem wygranej. Komunikat: bad_alloc.
komentarz 7 czerwca 2016 przez katolik6 Dyskutant (8,140 p.)
Problem występuje tylko przy wielkości planszy 9, najprościej ograniczyć bardziej wielkość.
komentarz 7 czerwca 2016 przez katolik6 Dyskutant (8,140 p.)
:D linijka 270

Cout najlepszym debugerem.
komentarz 8 czerwca 2016 przez Galadrim Nowicjusz (240 p.)
Nie do końca rozumiem co powoduje ten błąd, czy mógłbys napisać jeszcze raz i błąd z nie wykrywaniem wygranej działa również dla mniejszych plansz.

A ta nazwa stoi(), tylko dlatego że nie wiedziałem jak mam korzystać z c++ 11 w codeblocksie, więc napisałem sobie własną funkcję.
komentarz 15 czerwca 2016 przez katolik6 Dyskutant (8,140 p.)
Wiesz już co jest nie tak z linią 270? Nie pisałem, że nie wykrywa wygranej, to wiadome + patrz zdanie wcześniej. Problem to crash. Postaw takie same znaki w 1x1 i 2x1 na wielkości 9. Więcej napisać nie mogę, zalecenia z góry.

Podobne pytania

0 głosów
3 odpowiedzi 981 wizyt
+1 głos
2 odpowiedzi 1,385 wizyt
0 głosów
1 odpowiedź 407 wizyt
pytanie zadane 24 listopada 2019 w C i C++ przez thirdman Nowicjusz (120 p.)

92,536 zapytań

141,376 odpowiedzi

319,451 komentarzy

61,920 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...