Gra kolko i krzyzyk - pomoc w znalezieniu bledu

0

Witam,
jestem poczatkujacym programista i w kolejnym etapie nauki natrafilem na problem z dzialaniem programu. Ma spelniac zadanie gry w kolko i krzyzyk, program nie posiada praktycznie, zadnego ui, jest sam szkielet, ktory niestety nie dziala. Wykonywalem juz kroki ku znalezieniu przyczyny, ale niestety nadal wystepuje jakis blad w moim rozumowaniu.

Ponizej naglowek oraz czesc glowna programu

 
enum STAN_GRY {WIN, LOSE, DRAW,START};
enum GRACZ {GRACZ1,GRACZ2};
enum POLE  {WOLNE=0, KOLKO=1, KRZYZYK=2};
POLE plansza[3][3];
const int plansza_wygrane [8][3][2] = { { {0,0}, {0,1}, {0,2} },
                                        { {1,0}, {1,1}, {1,2} },
                                        { {2,0}, {2,1}, {2,2} },
                                        { {0,0}, {1,0}, {2,0} },
                                        { {1,1}, {2,1}, {1,2} },
                                        { {0,1}, {1,1}, {2,1} },
                                        { {0,0}, {1,1}, {2,2} },
                                        { {0,2}, {1,1}, {2,0} } };

STAN_GRY STAN = START;
GRACZ OBECNY_GRACZ = GRACZ1;

 int tablica_pozycji [9][2] = {{0,0},
                               {0,1},
                               {0,2},
                               {1,0},
                               {1,1},
                               {1,2},
                               {2,0},
                               {2,1},
                               {2,2}};

int position;
int pX,pY;
int zgodneK, zgodneKRZ;
#include <iostream>
#include "kolko_krzyzyk.h"
using namespace std;

int main()
{

    for (int j=0; j<3; j++)
    {
        for (int i=0; i<3; i++)
        {
            plansza[j][i]=WOLNE;
        }
    }



    std::cout << "0 1 2" << std::endl;
    std::cout << "3 4 5" << std::endl;
    std::cout << "6 7 8" << std::endl << std::endl << std::endl;

    zgodneK=0;
    zgodneKRZ=0;

    int licznik=0;
    OBECNY_GRACZ=GRACZ1; //GRACZ1 to kolko

    do {
    std::cout << "Ruch gracza : ";
    std::cin >> position;



    int tymczasowa=position;
    pX=tablica_pozycji[tymczasowa][0];
    pY=tablica_pozycji[tymczasowa][1];

    std::cout << "Px = " << pX << std::endl;
    std::cout << "Py = " << pY << std::endl;

    if (plansza[pX][pY]== WOLNE && OBECNY_GRACZ==GRACZ1)
    plansza[pX][pY]=KOLKO;

    if (plansza[pX][pY]== WOLNE && OBECNY_GRACZ==GRACZ2)
    plansza[pX][pY]=KRZYZYK;




    for (int a=0; a<8; a++)
    {
        for (int b=0; b<3; b++)
        {
            if (OBECNY_GRACZ == GRACZ1 && plansza_wygrane[a][b][0] == pX && plansza[pX][pY]== KOLKO && plansza_wygrane[a][b][1] == pY)
            zgodneK++;
            else 
            zgodneK=0;


            if (OBECNY_GRACZ == GRACZ2 && (plansza_wygrane[a][b][0] == pX) && plansza[pX][pY]== KRZYZYK && plansza_wygrane[a][b][1] == pY)
            zgodneKRZ++;
            else
            zgodneKRZ=0;
        }
    }

    if (zgodneK == 3)
    {
        std::cout << "GRACZ1 - KOLKO WYGRAL!" << std::endl;
        STAN=WIN;
    }
      if (zgodneKRZ == 3)
    {
        std::cout << "GRACZ2 - KRZYZYK WYGRAL!" << std::endl;
        STAN=WIN;
    }

    if (OBECNY_GRACZ == GRACZ1)
    OBECNY_GRACZ=GRACZ2;
    else
    OBECNY_GRACZ=GRACZ1;

    licznik++;
    }while (STAN!=WIN);



    return 0;
}
 

Wiem, ze kod nie jest zoptymalizowany, a pewne rozwiazania nienajlepsze badz zle, ale na chwile obecna chcialbym zeby zadzialal.

Z gory dziekuje i pozdrawiam

0

A co jest z tym kodem nie tak?
Nie kompiluje się (jaki błąd?), nie działa (ale co nie działa?)?

0

Kompiluje sie, chodzi o to, ze w momencie 3 zgodnych pol z plansza_wygrane powinien licznik zgodneK==3 lub zgodneKRZ, sledzilem zmienne zgodneK i zgodneKRZ i maja ciagle wartosci 0, a chyba nie powinny.

Moje IDE to Code::blocks.

0
    for (int a=0; a<8; a++)
    {
        for (int b=0; b<3; b++)
        {

A dokładniej:

for (int a=0; a<8; a++)

Na pewno warunek ma być a<8?

0

Tak, tablica plansza_wygrane jest trójwymiarowa gdzie pierwszy wymiar = 8, drugi ma trzy pozycje, ktore musza byc spelnione do 'zaliczenia' wygranej, a ostatniy wymiar przyjmuje wspolrzedne X i Y.

3

Źle zliczasz:

    std::cout << "Px = " << pX << std::endl;
    std::cout << "Py = " << pY << std::endl;

    // przyda się taka zmienna, będzie mniej "if (OBECNY_GRACZ == ..."
    POLE obecne_pole = (OBECNY_GRACZ == GRACZ1) ? KOLKO : KRZYZYK;

    plansza[pX][pY] = obecne_pole;

    int zgodne = 0;
    for (int a = 0; a < 8 && zgodne < 3; a++) // '&& zgodne < 3' bo przerywamy pętlę jeśli znajdziemy pasującą linię
    {
        zgodne = 0; // zerujemy licznik przed testem każdej linii
        for (int b = 0; b < 3; b++)
        {
            // zliczamy ilość trafionych pól
            // to miałeś źle
            // trzeba sprawdzić czy na danym polu linii jest kółko/krzyżyk
            // ty natomiast sprawdzałeś czy jego współrzędne to pX i pY :)
            int x = plansza_wygrane[a][b][0];
            int y = plansza_wygrane[a][b][1];
            if (plansza[x][y] == obecne_pole) zgodne++;
        }
    }

    if (zgodne == 3)
    {
        std::cout << (OBECNY_GRACZ == GRACZ1 ? "GRACZ1 - KOLKO WYGRAL!" : "GRACZ2 - KRZYZYK WYGRAL!") << std::endl;
        STAN = WIN;
    }
1

Ja tylko tak się wtrącę:
-znak nowej linii: "\n"
-wyrzucenie danych ze strumienia + znak nowej linii: endl; (to samo co: "\n" + flush, czyli jak widać, o niepotrzebny flush za duzo!)

Kiedy potrzebujesz tylko znak nowej linii, używaj "\n". Jak będziesz potrzebował wyrzucić dane ze strumienia to wtedy flush lub endl, w przypadku potrzeby dorzucenia znaku nowej linii.

0

Dziękuję wszystkim za poswiecony czas i udzielenie sie w temacie. Teraz juz bedzie wszystko dobrze.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1