2015-11-03 10 views
17

Znalazłem ten roztwór roboczy:Czy możliwe jest sprawdzenie zwycięskiego stanu gry TicTacToe za pomocą jGraphT?

private int[] winningPatterns = { 0b111000000, 0b000111000, 0b000000111, // rows 
     0b100100100, 0b010010010, 0b001001001, // cols 
     0b100010001, 0b001010100 // diagonals 
}; 

/** Returns true if thePlayer wins */ 
private boolean hasWon(int thePlayer) { 
    int pattern = 0b000000000; // 9-bit pattern for the 9 cells 
    for (int row = 0; row < 3; ++row) { 
     for (int col = 0; col < 3; ++col) { 
      if (cells[row][col].content == thePlayer) { 
       pattern |= (1 << (row * 3 + col)); 
      } 
     } 
    } 
    for (int winningPattern : winningPatterns) { 
     if ((pattern & winningPattern) == winningPattern) 
      return true; 
    } 
    return false; 
} 

ale chciałbym wiedzieć, czy istnieje bardziej eleganckie rozwiązanie za pomocą wykresu logiki.

Aktualizacja: Zajmuję się również wykorzystaniem mojej wiedzy w różnych i większych wariantach planszy 3x3 i uważam, że takie podejście nie jest dobrze estetyczne.

Na przykład: https://en.wikipedia.org/wiki/Teeko

+4

To wydaje się dużo bardziej eleganckie - co ty jesteś szukasz? –

+0

Chciałbym zainwestować więcej w konfigurację wykresu, a następnie móc po prostu wywołać myGraph.isItWon() –

+0

to podejście jest ładne i skaluje się do 64 komórek (np. 8x8) z łatwością –

Odpowiedz

2

do 25 przez 25 deska Myślę, że metoda, że ​​masz to opłacalne, ale kilka sposobów, aby poprawić to są następujące.

  1. Tworzenie wzorca, gdy użytkownik dodaje kawałki, bo wtedy to zajmie tylko czas potrzebny, aby przejść przez tablicę winningPatterns.

  2. Aby poprawić drugą część, można spróbować ją skuteczniej przechowywać. Przechowuj zwycięskie wzorce w taki sposób, aby można było sprawdzić ich wiele w tym samym czasie. Na przykład, jeśli pierwsza pozycja to 0, to może usunąć 3 możliwości z wygrywających wzorców zamiast jednego (111 000 000, 100 100 100, 100 010 001).

  3. Możesz poprawić średnią wielkość, sprawdzając pozycję, która ma największe prawdopodobieństwo, że ma rację. Na przykład istnieją 4 sposoby, w jakie gracz mógłby wygrać od umieszczenia kawałka na środku, więc sprawdź w tej kolejności.

  4. Jeśli przechowujesz pozycje gracza w oddzielnej tablicy, gdzie p1Tiles i p2Tiles. To może znacznie zwiększyć przeciętny przypadek, ponieważ w większości przypadków tablica będzie dość pusta. Będzie on pełny tylko dla 1 instancji tej gry, zanim płyta zostanie zresetowana.

  5. Nie musisz sprawdzać wszystkich elementów, które gracz wygrał, wystarczy, że sprawdzisz, czy element, który aktualnie gracz umieszcza, wygrywa. Tak więc tą metodą wystarczy sprawdzić najgorszy przypadek 12 innych miejsc, nawet jeśli tablica ma rozmiar 99..999 na 99..999. (12, ponieważ wszystkie szczeliny wokół aktualnej szczeliny PLUS jeśli są dwa tego samego koloru obok siebie, więc trzeba by spojrzeć na poniższy slot)

Powiązane problemy