Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zwycięstwo w gomoku - 5 po skosie

Ostatnio zmodyfikowano 2016-05-01 17:28
Autor Wiadomość
Gibas11
Temat założony przez niniejszego użytkownika
Zwycięstwo w gomoku - 5 po skosie
» 2016-05-01 13:19:23
Hej, piszę gomoku w C++/Qt/SFML, ale mam problem przy sprawdzeniu czy ktoś wygrał układając 5 pionków po skosie, na prawej-dolnej połowie planszy (układ przypominający ten znak – '/'), cała reszta działa a tutaj popełniłem pewnie jakiś prosty błąd.

Kodzik:
C/C++
for( int y = 0; y < 11; y++ )
{
    unsigned B = 0, W = 0;
    bool comboB = true, comboW = true;
   
    unsigned Y = 14, X = y;
    while( X < 14 )
    {
        if( fields[ X ][ Y ] == fields[ X + 1 ][ Y - 1 ] )
        {
            if( fields[ X ][ Y ] == EMPTY )
            {
                comboB = false;
                comboW = false;
            }
            else if( fields[ X ][ Y ] == WHITE )
            {
                if( !comboW )
                     W = 0;
               
                W++;
               
                comboB = false;
                comboW = true;
            }
            else if( fields[ X ][ Y ] == BLACK )
            {
                if( !comboB )
                     B = 0;
               
                B++;
               
                comboB = true;
                comboW = false;
            }
        }
       
        Y--;
        X++;
    }
}

I (bardzo) krótka legenda:
fields
 - dwuwymiarowa tablica typu FIELD (mój enum, może przyjąć EMPTY, BLACK lub WHITE) 15x15.

W założeniach chciałem sprawdzić czy występuje nieprzerwany ciąg 5 pionków (6 lub więcej zgodnie z zasadami też nie daje zwycięstwa).
P-147822
Gibas11
Temat założony przez niniejszego użytkownika
» 2016-05-01 13:22:49
Nom, miałem rację, bardzo proty błąd. D: Algorytm jest w porządku, po prostu zapomniałem dodać kawałek reagujący na te 5 pionków (o którym wszędzie indziej pamiętałem), wystarczy na końcu pętli for dokleić to:
C/C++
if( W == 4 )
     return WHITE;

if( B == 4 )
     return BLACK;

i działa.

Tematu nie zamykam, może ktoś pochwali się innym sposobem znajdywania zwycięzców po skosie, bo moje rozwiązanie jest proste i działa, ale zdaje się być trochę toporne.
P-147823
Rashmistrz
» 2016-05-01 17:22:50
Plansza do Gomoku "teoretycznie" jest nieskończona.

Sprawdzaj po linii w jedną stronę ile razy
powtarzają się znaki ostatniego gracza,
a potem jeszcze raz tylko, że w przeciwną.

(pogrubiony to ostatnio
postawiony znak):
-xXxxx-
Na prawo zasięg = 3,
a na lewo zasięg = 1,
czyli mamy odcinek złożony
z 5 takich samych znaków,
czyli grający "X"em wygrał.

(4 + ten od którego zaczęliśmy)

(w zasadzie suma zasięgów w linii
może być większa niż 4 z obu stron,
gdyż np po lewej i po prawej może
być po 4 znaki tego gracza
bez wcześniejszej wygranej:
-xxxxXxxxx-)

Zrób tak poziomo, pionowo
i na dwa różne skosy...
P-147830
Gibas11
Temat założony przez niniejszego użytkownika
» 2016-05-01 17:28:34
Wikipedyjny opis mówi, że plansza powinna mieć 15x15 pól a czasami 19x19, tak czy inaczej taką właśnie mam zaimplementować.

Rzeczywiście, bardzo dobre rozwiązanie. Nawet z uwzględnieniem krawędzi planszy jest dużo prostsze od tego co miałem teraz, dzięki. :D
P-147831
« 1 »
  Strona 1 z 1