usuario usando toe tic tateti tac servidor maquina juegos juego gato cliente java tic-tac-toe jgrapht

java - usando - ¿Es posible verificar la condición ganadora de un juego de TicTacToe utilizando jGraphT?



tic tac toe en java (1)

Encontré esta solución de trabajo:

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; }

pero me gustaría saber si hay una solución más elegante utilizando la lógica gráfica.

Actualización: También estoy estudiando el uso de mis conocimientos en variantes diferentes y más grandes de la placa 3x3 y creo que este enfoque no se adapta bien estéticamente.

Por ejemplo: https://en.wikipedia.org/wiki/Teeko


Para una tabla de 25 por 25, creo que el método que tiene es viable, pero algunas formas de mejorarlo son las siguientes.

  1. Cree el patrón mientras el usuario agrega las piezas, porque entonces solo tomará el tiempo necesario para pasar por la matriz winPatterns.

  2. Para mejorar la segunda parte puedes intentar almacenarla de manera más efectiva. Almacene los WinPatterns de una manera en la que pueda revisar varios de ellos al mismo tiempo. Por ejemplo, si la primera posición es 0, entonces puede eliminar 3 posibilidades de los patrones ganadores en lugar de solo una (111 000 000, 100 100 100, 100 010 001).

  3. Podría mejorar el caso promedio al verificar la posición que tiene la mayor probabilidad de que sea la correcta. Por ejemplo, hay 4 formas en que el jugador podría haber ganado al colocar la pieza en el centro, así que compruebe en ese orden.

  4. Si almacena las posiciones del jugador en una matriz separada, donde p1Tiles, y p2Tiles. Entonces, eso podría aumentar mucho el promedio de casos porque la mayoría de ellos estarán bastante vacíos. Solo estará lleno durante 1 instancia de este juego antes de que el tablero se reinicie.

  5. En realidad, no es necesario verificar que todas las piezas del jugador hayan ganado, solo debe verificar si la pieza que el usuario actual coloca gana. Por lo tanto, con este método, solo necesitaría revisar 12 casos más en el peor de los casos, incluso si el tablero tiene un tamaño de 99..999 por 99..999. (12 debido a todas las ranuras alrededor de la ranura actual MÁS si hay dos del mismo color uno al lado del otro, por lo que tendría que mirar la siguiente ranura)