Kółko i krzyżyk sprawdzanie wygranej

0

Witam,
mam problem z sprawdzaniem wygranej w grze kółko i krzyżyk. Program zacina się wykonując tą pętlę

for(int i=1; i<=rozmiar; i++)
    {
        if(T[i][i]==T[i+1][i+1] && T[i+1][i+1]==T[i+2][i+2] && T[i][i]=='O') bGameO=false;
        else if(T[i][i]==T[i+1][i+1] && T[i+1][i+1]==T[i+2][i+2] && T[i][i]=='X') bGameX=false;
        for(int j=1; j<=rozmiar; j++){
            if((T[i][j]==T[i][j+1] && T[i][j+1]==T[i][j+2] && T[i][j]=='O') || (T[i][j]==T[i+1][j] && T[i+1][j]==T[i+1][j] && T[i][j]=='O')) bGameO=false;
            else if((T[i][j]==T[i][j+1] && T[i][j+1]==T[i][j+2] && T[i][j]=='X') || (T[i][j]==T[i+1][j] && T[i+1][j]==T[i+1][j] && T[i][j]=='X')) bGameX=false;

        }
    } 

Natomiast działa jeśli wstawię taką pętlę która ma szukać tylko w poziomie

 
for(int i=1; i<=rozmiar; i++)
    {
        for(int j=1; j<=rozmiar; j++){
            if(T[i][j]==T[i][j+1] && T[i][j+1]==T[i][j+2] && T[i][j]=='O') bGameO=false;
            else if(T[i][j]==T[i][j+1] && T[i][j+1]==T[i][j+2] && T[i][j]=='X') bGameX=false;

        }
    }

Wie ktoś może gdzie w tej pierwszej pętli jest błąd?

0

Po wstawieniu znaku sprawdzaj tylko wygraną dla tego znaku oraz tylko przechodzące przez to pole pion/poziom/ukośna:

win=false;
unsigned count;
char ch;
ch=T[y][x];
count=1;
for(int i=0;(i<2)&&(x-i>=0)&&(T[y][x-i]==ch);++i) ++count;
for(int i=0;(i<2)&&(x+i<3)&&(T[y][x+i]==ch);++i) ++count;
if(count>=3) win=true; // poziom
count=1;
for(int i=0;(i<2)&&(y-i>=0)&&(T[y-i][x]==ch);++i) ++count;
for(int i=0;(i<2)&&(y+i<3)&&(T[y+i][x]==ch);++i) ++count;
if(count>=3) win=true; // pion
...
0

Chyba nie ma potrzeby sprawdzać tego specjalnie.

Przecież tu każdym ruchu obliczamy kolejny najlepszy, więc to i tak wyjdzie z tych obliczeń.

0
faranhait napisał(a):

Chyba nie ma potrzeby sprawdzać tego specjalnie.

Przecież tu każdym ruchu obliczamy kolejny najlepszy, więc to i tak wyjdzie z tych obliczeń.

Bzdury.
Jeżeli gra komputer z komputerem - to może owszem podczas ruchu nie trzeba, ale i tak dal obliczenia kolejnego najlepszego - trzeba umieć sprawdzić ...

0

Niby po co chcesz sprawdzać osobno jeden, jedyny specjalny przypadek, który zdarza się tylko raz na każdą rozgrywkę?

W każdym kroku wyliczasz optymalny ruch, więc to samo i tak, czy inaczej wyjdzie...
o ile to w ogóle grać potrafi, choćby prymitywnie;
a jeśli tego nie potrafi, no to i cały ten biznes nie ma sensu - nie ma o czym gadać.

0

Jeśli nie przeszkadza CI JAVA, to tu masz rozwiązanie:

http://stackoverflow.com/questions/1056316/algorithm-for-determining-tic-tac-toe-game-over

Tak przy okazji, znacie gdzieś "zasady gry" w kółko i krzyżyk na planszach o większych rozmiarach (4x4 czy 5x5, 6x6, itd......)?? Chodzi o zapewnienie możliwości ukończenia gry (wygrania przez jedną ze stron), interesuje mnie konieczna liczba np. krzyżyków w linii potrzebna do wygrania w zależności od wielkości planszy (czyli 3 w planszy 3x3, ?? w planszy nxn).

0

@mizeriowy, a teraz sobie wyobraź że już program działa ale teraz trzeba go przerobić na plansze 25x25 oraz 5-ka wygrywa.
Policz ile będzie wierszy w tablice WIN?

0

Mówię że brednie tworzycie.

W grach planszowych, zwłaszcza złożonych typu szachy, wyliczamy wartość sytuacji
po każdym posunięciu, np. 100 oznacza: wygrana, a: -100 przegrana.

Zaczynamy od zera oczywiście,
i w kółko i krzyżyk - w wersji 5, i z nieograniczoną planszą byłoby powiedzmy tak:

xxx = 5
xx x = 5
...

xxxx = 100, bo to jest już faktycznie przegrana/wygrana...
no, pod warunkiem że przeciwnik nie ma 4 kółek otwartych...

a takie coś:
xxxxx - nie ma sensu tego sprawdzać... po ptokach.

1

@_13th_Dragon nie ma co kopać się z koniem. Słowa @faranhait wskazują na dwa możliwe fakty: zupełnie nie rozumie o czym piszesz, albo nigdy w życiu nie implementował minmaxa i opiera się na swoich "przeczuciach". W każdym z przypadków tracisz czas na odpowiadanie mu i udowadnianie że białe jest białe, a … .

0

Znalazłem Kółko i Krzyżyk z planszą 4x4 napisane w JAVA - kod: https://github.com/brycesandlund/4x4TicTacToe/tree/master/src

Bardzo ładnie napisane.

0
MarekR22 napisał(a):

@_13th_Dragon nie ma co kopać się z koniem. Słowa @faranhait wskazują na dwa możliwe fakty: zupełnie nie rozumie o czym piszesz, albo nigdy w życiu nie implementował minmaxa i opiera się na swoich "przeczuciach". W każdym z przypadków tracisz czas na odpowiadanie mu i udowadnianie że białe jest białe, a … .

Zrób pełną grę - w wersji do 5... a wtedy pogadamy.

Wiesz jak znajdujemy przysłowiową igłę w stogu siana?
Podpalasz ten stos... :)

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