Hola fans de programar en Excel VBA, hoy he querido poneros un desafío que no requiere demasiado código. Se trata de analizar la capacidad de ataque de tus piezas dentro del tablero de ajedrez. Primero hablaré de las reglas para construir el código, y luego el razonamiento acerca de por qué será de gran interés para tí y tus amigos, y sobre todo, será de interés para la comunidad del ajedrez.
En unas cuantas horas podreis completarlo.
Cómo debe funcionar la macro
En el tablero de la izquierda tienes las piezas, y en el de la derecha la cantidad de piezas que amenazan una determinada casilla.
En este ejemplo puedes ver a una reina y las celdas que puede atacar. Como puedes ver hay dos piezas que evitan que su zona de influencia pueda extenderse. La idea es calcular estas zonas para todas las piezas de un bando. Al final vas a sumar todas las zonas de influencia (o región donde hay capacidad de ataque) de una pieza dada. Puedes usar estos ejemplos para validar tus resultados.
La suma de todos los valores de las casillas y la cantidad de casillas con números también debe estar allí. Mientras más casillas o mientras mayor sea la suma, mayor será la capacidad ofensiva de una disposición dada de piezas.
Además, en el tablero de la derecha, a como los valores sean mayores, tendrían que colorearse con un color más oscuro. Obviamente tendrás que limpiar los colores de las celdas al tener nuevas configuraciones de piezas.
Las razones para crear esta macro
El ajedrez es un juego que abstrae mucho, y a muchos jugadores les gusta ganar y no te dicen cómo. Encima el ajedrez no tiene comparación directa con un campo de batalla real en términos de movimientos y estrategias de ataque. Esto hace que para el novato, diseñar estrategias y ver vulnerabilidades, se complique mucho.
Te dicen que hay que "controlar el centro" y ese es uno de los más grandes engaños de los maestros que enseñan ajedrez a sus alumnos. En realidad lo que hay que hacer es expandir tu zona de influencia. Si eres maestro de ajedrez puede que quieras sentirte ofendido, pero no deberías, porque al final te daré la razón pero de una manera distinta. Es decir, el consejo es correcto, pero no como objetivo, sino como medio para lograr algo más.
Es que al final el ajedrez es igual que cualquier otro juego de estrategia y conquista. Lo que necesitas es conquistar territorio. Y la zona de influencia expande ese territorio. Y para muestra un botón, veamos algunas situaciones que justifican este razonamiento.
Entonces ¿qué implica controlar el centro? El centro es la zona desde la cual puedes extender tu influencia con más facilidad, pues las orillas te restringen. Entonces la lógica del centro no es del todo errada, pero no necesariamente es el mejor consejo. El mejor consejo es buscar la mejor manera de expandir la zona de influencia propia o mover o reducir la zona de influencia enemiga.
Hay situaciones donde un jugador se encuentra encerrado por sus propias piezas. En realidad no está encerrado, pues si puede moverse, pero no sin entrar en la zona de influencia enemiga y ser atacado. Tiene su zona de influencia restringida.
Cuando analizas los gambitos, se trata de "sacrificio" para conseguir una "posición" o "ganar tiempo". ¿Cómo sabes que una posición es o no valiosa? Es valiosa en la medida en que te ayuda a expandir tu zona de influencia o acercar esa zona al enemigo. ¿Cómo se gana tiempo? Le pones una carnada al enemigo para despejar una zona de influencia, y posiblemente reducir la zona de influencia enemiga, para realizar una movida.
Este modelo te permite representar visualmente las zonas de influencia.
Veamos este gambito donde un jugador regala el peón.
Visto desde la óptica del segundo jugador
Ahora el segundo jugador toma el regalo que le han dado.
Y para el segundo jugador, que toma el regalo, se mira así.
Y el primer jugador saca el caballo para cubrir la celda donde la reina enemiga podría atacar al rey.. Observa cómo es que a pesar de perder una pieza (y bajar su conteo de celdas), el jugador ha ganado en la suma. Y la zona de influencia del oponente no cambia ni en la suma ni en el conteo, peró si en su distribución, y ha perdido la capacidad de controlar el centro.
Entonces la conquista en ajedrez no es un tema de conquistar el centro, sino de mover o reducir zonas de influencia del enemigo. Reducirlas sirve para limitar la capacidad ofensiva enemiga, y moverlas sirve para despejar áreas y organizar ataques contra el rey.
¿Te parece interesante este desafío? ¿Te parece interesante las jugadas que puedes analizar con esta herramienta? Bienvenidos sean tus comentarios y los análisis que hagas de jugadas que hayas encontrado.
Este es el código usado. Necesitas un botón que eche a andar la subrutina ChessValue
Sub ChessValue() MiBando = CStr(Cells(11, 4)) ClearBoardColors For i = 2 To 9 For j = 2 To 9 Cells(i, j + 10) = "" Next j Next i For i = 2 To 9 For j = 2 To 9 c = Cells(i, j) Pieza = Left(c, 1) Bando = Right(c, 1) EvaluarPieza Pieza, Bando, i, j, MiBando Next j Next i ColorCells End Sub
Sub EvaluarPieza(Pieza, Bando, fila, col, MiBando) If Bando = MiBando Then D1 = DrawNumber(fila, col, True) Select Case Pieza Case "J" 'Alfil D1 = True D2 = True D3 = True D4 = True For i = 1 To 8 D1 = DrawNumber(fila + i, col + i, D1) D2 = DrawNumber(fila + i, col - i, D2) D3 = DrawNumber(fila - i, col + i, D3) D4 = DrawNumber(fila - i, col - i, D4) Next i Case "Q" 'Reina D1 = True D2 = True D3 = True D4 = True D5 = True D6 = True D7 = True D8 = True For i = 1 To 8 D1 = DrawNumber(fila + i, col + i, D1) D2 = DrawNumber(fila + i, col - i, D2) D3 = DrawNumber(fila - i, col + i, D3) D4 = DrawNumber(fila - i, col - i, D4) D5 = DrawNumber(fila, col + i, D5) D6 = DrawNumber(fila, col - i, D6) D7 = DrawNumber(fila - i, col, D7) D8 = DrawNumber(fila + i, col, D8) Next i Case "K" 'Rey D1 = DrawNumber(fila + 1, col + 1, True) D2 = DrawNumber(fila + 1, col - 1, True) D3 = DrawNumber(fila - 1, col + 1, True) D4 = DrawNumber(fila - 1, col - 1, True) D5 = DrawNumber(fila, col + 1, True) D6 = DrawNumber(fila, col - 1, True) D7 = DrawNumber(fila - 1, col, True) D8 = DrawNumber(fila + 1, col, True) Case "H" 'Caballo D1 = DrawNumber(fila + 2, col + 1, True) D2 = DrawNumber(fila + 2, col - 1, True) D3 = DrawNumber(fila - 2, col + 1, True) D4 = DrawNumber(fila - 2, col - 1, True) D5 = DrawNumber(fila - 1, col + 2, True) D6 = DrawNumber(fila + 1, col + 2, True) D7 = DrawNumber(fila - 1, col - 2, True) D8 = DrawNumber(fila + 1, col - 2, True) Case "T" 'Torre D1 = True D2 = True D3 = True D4 = True For i = 1 To 8 D1 = DrawNumber(fila, col + i, D1) D2 = DrawNumber(fila, col - i, D2) D3 = DrawNumber(fila - i, col, D3) D4 = DrawNumber(fila + i, col, D4) Next i Case "P" 'Peon If Bando = 2 Then D1 = DrawNumber(fila + 1, col + 1, True) D2 = DrawNumber(fila + 1, col - 1, True) ElseIf Bando = 1 Then D3 = DrawNumber(fila - 1, col + 1, True) D4 = DrawNumber(fila - 1, col - 1, True) End If End Select End If End Sub
Function DrawNumber(r, c, D) As Boolean DrawNumber = D If WithinBoard(r, c) Then If Cells(r, c) = "" And D Then Cells(r, c + 10) = Cells(r, c + 10) + 1 Else If DrawNumber Then Cells(r, c + 10) = Cells(r, c + 10) + 1 End If DrawNumber = False End If End If End Function
Function WithinBoard(row, col) As Boolean WithinBoard = row > 1 And row < 10 And col > 1 And col < 10 End Function
Sub ClearBoardColors() For i = 2 To 9 For j = 12 To 19 Cells(i, j).Select NoFill Next j Next i End Sub
Sub ColorCells() c = Array(0.799981688894314, 0.599993896298105, 0.399975585192419, -0.249977111117893, -0.499984740745262) Theme = xlThemeColorAccent4 For i = 2 To 9 For j = 12 To 19 v = Cells(i, j) If v > 0 Then If v > 5 Then v = 5 TintShade = c(v - 1) Cells(i, j).Select ThemeColor Theme, TintShade End If Next j Next i End Sub
Sub NoFill() With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub
Sub ThemeColor(Theme, TintShade) With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = Theme .TintAndShade = TintShade .PatternTintAndShade = 0 End With End Sub