Zwycięstwo w gomoku - 5 po skosie
Ostatnio zmodyfikowano 2016-05-01 17:28
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: 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). |
|
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: 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. |
|
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... |
|
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 |
|
« 1 » |