Pregunta

crearía 3 lista (de coordenadas) para

  • posición vacía
  • posición negra
  • posición blanca
¿

o simplemente recorriendo la matriz cuando sea necesario y jugando con el resultado cada vez?

¿Qué sería lo mejor? (en cuanto a velocidad)

¿Fue útil?

Solución

Sus dos opciones principales son entre velocidad y claridad de código.

Si la velocidad es su prioridad, entonces debe usar un tipo de datos de 64 bits para cada conjunto de piezas en el tablero (por ejemplo, peones blancos, reinas negras, peones passant). Luego puede aprovechar las operaciones bit a bit nativas al generar movimientos y probar la legalidad de los movimientos.

Si la claridad del código es la prioridad, entonces olvídate de la combinación aleatoria de bits y elige tipos de datos muy abstractos como otros ya han sugerido. Solo recuerde que si sigue este camino, probablemente alcanzará un límite de rendimiento.

Para comenzar, mire el código para Crafty (C) y SharpChess (C #).

(Publicado originalmente aquí )

Otros consejos

Lo que está buscando es una representación del tablero . El Wiki de programación de ajedrez tiene una sección muy detallada sobre el tema (definitivamente vale la pena leerlo si usted ' tome en serio la escritura de una IA), mientras que Wikipedia ofrece una buena descripción general sobre el tema .

Es importante ser muy cuidadoso al elegir la representación adecuada del tablero; todos ofrecen sus propias ventajas únicas (y dificultades), en gran medida que ver con la velocidad / ejecución de ciertas operaciones, como realizar movimientos y evaluar el estado del tablero (generalmente de O (1) a O (n) complejidad de tiempo dependiendo del método y la tarea). Hasta donde yo sé, todavía no hay consenso sobre el "mejor". representación de la junta, aunque algunas son generalmente preferidas sobre otras en la actualidad ( bitboards son casi imprescindibles, por ejemplo) . Esta es la razón por la cual es común que la mayoría de las IAs de ajedrez fuertes usen varias (hasta 4 o 5 incluso) representaciones de tablero diferentes al buscar movimientos.

Sugeriría una matriz de 64 elementos como:

byte [64] Squares;

De esta manera solo necesita representar una posición del tablero de ajedrez por un solo byte, es mucho más rápido.

Cuando se trata de un índice único para hacer referencia a las posiciones del tablero de ajedrez, hay ciertas cosas que uno debe saber para facilitar la vida. Por ejemplo, ¿cómo sabe que dos posiciones están en la misma fila o columna? Hay un truco fácil para resolverlo.

Fila

Para calcular la fila de una posición, divida la posición entre 8 y tome la parte entera del resultado. Por ejemplo, la posición 63 dividida por 8 es 7.875, que equivale a la fila 7. La posición 3 dividida por 8 es 0.375, entonces 0. En C # al convertir a un número entero siempre obtendrá solo la parte entera del número, por lo tanto:

Row = (int)(position / 8)

Columna

Para calcular la columna de una posición, utilice el operador de módulo realizando el módulo de posición 8. Por ejemplo, la posición 24 módulo 8 es la columna 0. La posición 15 módulo 8 es 7, por lo tanto

Column = position % 8

Armados con estos dos conceptos, podemos convertir cualquier posición en nuestro tablero cuadrado de 64 en una columna y fila.

Si desea obtener más información sobre cómo crear su propio motor de ajedrez, consulte http: //www.chessbin. com

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top