Next
If fila + columna <> fila1 + columna1 Then 'Con esto se verifica si el movimiento no ha sido diagonal, pues por ejemplo si la corona estuviera originalmente en la posición (0, 6), la suma de la fila más la columna da 6; entonces la suma de los subíndices de la posición destino deben sumar 6 para asegurar que el movimiento fue diagonal, por ejemplo: (1, 5), (2, 4), (3, 3), (4, 2), (5, 1) y (6, 0) son movimientos diagonales válidos hacia el Suroeste. Si la posición destino tuviera los subíndices (3, 5), (5, 5), (7, 5), (5, 3), (7, 1), (3, 1) y (1, 3) por ejemplo, la suma de los subíndices de la posición destino no da 6 (que es la suma de los subíndices de la posición de origen para este ejemplo), por lo tanto, el movimiento no habría sido diagonal y sería inválido. Si el movimiento no fue válido (fue hacia el Suroeste pero no fue un movimiento diagonal), la corona se regresará a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Noroeste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug1 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 1
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 2 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 2.
End If
If numdefichasjug2 = 1 Then 'Si hay 1 ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 1
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 2 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 2.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug1 = 1 Then 'Si hay una ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
End If
If fila1 < fila Then 'fila1 contiene la fila a la que se quiere ir a poner la corona. fila contiene la fila donde estaba la corona. Debido a que esto está dentro del procedimiento es mover1(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 1, entonces esta línea condiciona que el Jugador 1 mueve hacia atrás del Jugador 1 (hacia arriba en la pantalla); hacia el Norte
If columna1 < columna Then 'columna1 contiene la columna a la que se quiere ir a poner la corona. columna contiene la columna donde estaba la corona. Debido a que esto está dentro del procedimiento mover1(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 1, y a la vez por la línea anterior se sabe que el movimiento ha sido hacia atrás Jugador 1 (hacia arriba en la pantalla), entonces esta línea condiciona que el Jugador 1 mueve hacia su derecha (hacia la izquierda en la pantalla); hacia el Oeste.
'Se sabe entonces que el movimiento ha sido diagonalmente hacia el Noroeste.
'Declaración de variables que se utilizarán en el próximo ciclo For que aparece.
Dim numdefichas As Integer = 0 'Número de fichas que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug1 As Integer = 0 'Número de fichas del Jugador 1 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug2 As Integer = 0 'Número de fichas del Jugador 2 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim ieliminar As Integer 'Valor de la fila a eliminar o comer.
Dim jeliminar As Integer 'Valor de la columna a eliminar o comer.
j = columna1
'Con el ciclo For presentado a continuación se van a evaluar las fichas que hay (si las hubiera) entre la posición inicial y la posición final del movimiento que se quiere hacer de la corona, para determinar si es posible el movimiento y si es posible también comer.
For i = fila1 To fila – 1
If casilla(i, j).ocupada = True Then 'Si la casilla evaluada está ocupada por alguna ficha.
numdefichas += 1 'Equivale a escribir "numdefichas = numdefichas + 1".
If casilla(i, j).jugador = 1 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 1.
numdefichasjug1 += 1 'Equivale a escribir "numdefichasjug1 = numdefichasjug1 + 1".
End If
If casilla(i, j).jugador = 2 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 2.
numdefichasjug2 += 1 'Equivale a escribir "numdefichasjug2 = numdefichasjug2 + 1".
'Se almacenan los valores de fila y columna de la ficha que se tendría que eliminar en caso de cumplirse condiciones que se evaluarán posteriormente.
ieliminar = i
jeliminar = j
End If
End If
j += 1 'Equivale a escribir "j = j + 1".
If j = 8 Then 'Esto es para que no se evalúe una columna que no existe, evitando que el programa se trabe.
Exit For 'Salida inmediata del ciclo For aunque no haya terminado el número de iteraciones que se le habían programado.
End If
Next
If fila + columna <> fila1 + columna1 + ((columna – columna1) * 2) Then 'Con esto se verifica si el movimiento no ha sido diagonal. Para que el movimiento haya sido diagonal (tomando en cuenta que ya se sabe que el movimiento es hacia el Noroeste) se debe cumplir la siguiente ecuación: "fila + columna = fila + columna + ((columna – columna1) * 2)". Por ejemplo, si la posición de inicio fue (7,7), la suma de esos subíndices es 14, entonces la posición destino (6,6) sería válida porque fila1+columna2+((columna-columna1)*2)=6+6+((7-6)*2)=14. Igualmente otras posiciones válidas para este ejemplo serían (5,5), (4,4), (3,3), (2,2). Algunas posiciones inválidas para este mismo ejemplo serían (7,5), (7,3), (6,0), (4,0), (3,1), (2,0). Si no se cumple esta ecuación, el movimiento hacia el Noroeste no sería diagonal y por lo tanto sería inválido. Por ello la corona se regresa a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Noroeste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug1 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 1
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 2 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 2.
End If
If numdefichasjug2 = 1 Then 'Si hay 1 ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 1
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 2 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 2.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug1 = 1 Then 'Si hay una ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
If columna1 > columna Then 'columna1 contiene la columna a la que se quiere ir a poner la corona. columna contiene la columna donde estaba la corona. Debido a que esto está dentro del procedimiento mover1(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 1, y a la vez por la línea anterior se sabe que el movimiento ha sido hacia atrás del Jugador 1 (hacia arriba en la pantalla), entonces esta línea condiciona que el Jugador 1 mueve hacia su izquierda (hacia la derecha en la pantalla); hacia el Este.
'Se sabe entonces que el movimiento ha sido diagonalmente hacia el Noreste.
'Declaración de variables que se utilizarán en el próximo ciclo For que aparece.
Dim numdefichas As Integer = 0 'Número de fichas que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug1 As Integer = 0 'Número de fichas del Jugador 1 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug2 As Integer = 0 'Número de fichas del Jugador 2 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim ieliminar As Integer 'Valor de la fila a eliminar o comer.
Dim jeliminar As Integer 'Valor de la columna a eliminar o comer.
j = columna1
'Con el ciclo For presentado a continuación se van a evaluar las fichas que hay (si las hubiera) entre la posición inicial y la posición final del movimiento que se quiere hacer de la corona, para determinar si es posible el movimiento y si es posible también comer.
For i = fila1 To fila – 1
If casilla(i, j).ocupada = True Then 'Si la casilla evaluada está ocupada por alguna ficha.
numdefichas += 1 'Equivale a escribir "numdefichas = numdefichas + 1".
If casilla(i, j).jugador = 1 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 1.
numdefichasjug1 += 1 'Equivale a escribir "numdefichasjug1 = numdefichasjug1 + 1".
End If
If casilla(i, j).jugador = 2 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 2.
numdefichasjug2 += 1 'Equivale a escribir "numdefichasjug2 = numdefichasjug2 + 1".
'Se almacenan los valores de fila y columna de la ficha que se tendría que eliminar en caso de cumplirse condiciones que se evaluarán posteriormente.
ieliminar = i
jeliminar = j
End If
End If
j -= 1 'Equivale a escribir "j = j – 1".
If j = -1 Then 'Esto es para que no se evalúe una columna que no existe, evitando que el programa se trabe.
Exit For 'Salida inmediata del ciclo For aunque no haya terminado el número de iteraciones que se le habían programado.
End If
Next
If fila + columna <> fila1 + columna1 Then 'Con esto se verifica si el movimiento no ha sido diagonal, pues por ejemplo si la corona estuviera originalmente en la posición (7, 1), la suma de la fila más la columna da 8; entonces la suma de los subíndices de la posición destino deben sumar 8 para asegurar que el movimiento fue diagonal, por ejemplo: (6, 2), (5, 3), (4, 4), (3, 5) y (2, 6) son movimientos diagonales válidos hacia el Noreste. Si la posición destino tuviera los subíndices (4, 2), (3, 3), (5, 5) o (4, 6) por ejemplo, la suma de los subíndices de la posición destino no da 8 (que es la suma de los subíndices de la posición de origen para este ejemplo), por lo tanto, el movimiento no habría sido diagonal y sería inválido. Si el movimiento no fue válido (fue hacia el Noreste pero no fue un movimiento diagonal), la corona se regresará a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Noreste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug1 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 1
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 2 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 2.
End If
If numdefichasjug2 = 1 Then 'Si hay 1 ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 1
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 2 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 2.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug1 = 1 Then 'Si hay una ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
End If
'Si los movimientos no son diagonales sino que rectos, la corona se devuelve a su posición inicial o de origen.
If columna = columna1 Then
Me.Left = pos_x
Me.Top = pos_y
End If
If fila1 = fila Then
Me.Left = pos_x
Me.Top = pos_y
End If
End Sub
Public Sub mover2(ByVal sender As Panel)
'Para ubicarse en los movimientos, se hablará de Norte, Sur, Este y Oeste; donde uno se tiene que imaginar el tablero como si hubiera una brújula donde el Norte es arriba, el Sur es abajo, el Este es a la derecha y el Oeste es a la izquierda.
Dim i, j As Integer
If fila1 > fila Then 'fila1 contiene la fila a la que se quiere ir a poner la corona. fila contiene la fila donde estaba la corona. Debido a que esto está dentro del procedimiento es mover2(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 2, entonces esta línea condiciona que el Jugador 2 mueve hacia atrás del Jugador 2 (hacia abajo en la pantalla); hacia el Sur.
If columna1 > columna Then 'columna1 contiene la columna a la que se quiere ir a poner la corona. columna contiene la columna donde estaba la corona. Debido a que esto está dentro del procedimiento mover2(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 2, y a la vez por la línea anterior se sabe que el movimiento ha sido hacia adelante del Jugador 2 (hacia abajo en la pantalla), entonces esta línea condiciona que el Jugador 2 mueve hacia su derecha (hacia la derecha en la pantalla); hacia el Este.
'Se sabe entonces que el movimiento ha sido diagonalmente hacia el Sureste.
'Declaración de variables que se utilizarán en el próximo ciclo For que aparece.
Dim numdefichas As Integer = 0 'Número de fichas que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug1 As Integer = 0 'Número de fichas del Jugador 1 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug2 As Integer = 0 'Número de fichas del Jugador 2 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim ieliminar As Integer 'Valor de la fila a eliminar o comer.
Dim jeliminar As Integer 'Valor de la columna a eliminar o comer.
j = columna + 1
For i = fila + 1 To fila1
If casilla(i, j).ocupada = True Then 'Si la casilla evaluada está ocupada por alguna ficha.
numdefichas += 1 'Equivale a escribir "numdefichas = numdefichas + 1".
If casilla(i, j).jugador = 1 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 1.
numdefichasjug1 += 1 'Equivale a escribir "numdefichasjug1 = numdefichasjug1 + 1".
'Se almacenan los valores de fila y columna de la ficha que se tendría que eliminar en caso de cumplirse condiciones que se evaluarán posteriormente.
ieliminar = i
jeliminar = j
End If
If casilla(i, j).jugador = 2 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 2.
numdefichasjug2 += 1 'Equivale a escribir "numdefichasjug2 = numdefichasjug2 + 1".
End If
End If
j += 1 'Equivale a escribir "j = j + 1".
If j = 8 Then 'Esto es para que no se evalúe una columna que no existe, evitando que el programa se trabe.
Exit For 'Salida inmediata del ciclo For aunque no haya terminado el número de iteraciones que se le habían programado.
End If
Next
If columna – fila <> columna1 – fila1 Then 'Con esto se verifica si el movimiento no ha sido diagonal. Para que el movimiento haya sido diagonal (tomando en cuenta que ya se sabe que el movimiento es hacia el Sureste) se debe cumplir la siguiente ecuación: "columna – fila = columna1 – fila1". Por ejemplo, si la posición de inicio fue (4,0), la resta 0 – 4 da -4, entonces la posición destino (5,1) sería válida porque columna1+fila1=1-5=-4. Igualmente otras posiciones válidas para este ejemplo serían (6,2) y (7,3). Algunas posiciones inválidas para este mismo ejemplo serían (5,3), (6,6), (7,7), (7,5). Si no se cumple esta ecuación, el movimiento hacia el Sureste no sería diagonal y por lo tanto sería inválido. Por ello la corona se regresa a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Sureste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug2 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
End If
If numdefichasjug1 = 1 Then 'Si hay 1 ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug2 = 1 Then 'Si hay una ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
If columna1 < columna Then 'columna1 contiene la columna a la que se quiere ir a poner la corona. columna contiene la columna donde estaba la corona. Debido a que esto está dentro del procedimiento mover2(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 2, y a la vez por la línea anterior se sabe que el movimiento ha sido hacia adelante del Jugador 2 (hacia arriba en la pantalla), entonces esta línea condiciona que el Jugador 2 mueve hacia su izquierda (hacia la izquierda en la pantalla); hacia el Oeste.
'Se sabe entonces que el movimiento ha sido diagonalmente hacia el Suroeste.
'Declaración de variables que se utilizarán en el próximo ciclo For que aparece.
Dim numdefichas As Integer = 0 'Número de fichas que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug1 As Integer = 0 'Número de fichas del Jugador 1 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug2 As Integer = 0 'Número de fichas del Jugador 2 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim ieliminar As Integer 'Valor de la fila a eliminar o comer.
Dim jeliminar As Integer 'Valor de la columna a eliminar o comer.
j = columna – 1
'Con el ciclo For presentado a continuación se van a evaluar las fichas que hay (si las hubiera) entre la posición inicial y la posición final del movimiento que se quiere hacer de la corona, para determinar si es posible el movimiento y si es posible también comer.
For i = fila + 1 To fila1
If casilla(i, j).ocupada = True Then 'Si la casilla evaluada está ocupada por alguna ficha.
numdefichas += 1 'Equivale a escribir "numdefichas = numdefichas + 1".
If casilla(i, j).jugador = 1 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 1.
numdefichasjug1 += 1 'Equivale a escribir "numdefichasjug1 = numdefichasjug1 + 1".
'Se almacenan los valores de fila y columna de la ficha que se tendría que eliminar en caso de cumplirse condiciones que se evaluarán posteriormente.
ieliminar = i
jeliminar = j
End If
If casilla(i, j).jugador = 2 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 2.
numdefichasjug2 += 1 'Equivale a escribir "numdefichasjug2 = numdefichasjug2 + 1".
End If
End If
j -= 1 'Equivale a escribir "j = j – 1".
If j = -1 Then 'Esto es para que no se evalúe una columna que no existe, evitando que el programa se trabe.
Exit For 'Salida inmediata del ciclo For aunque no haya terminado el número de iteraciones que se le habían programado.
End If
Next
If fila + columna <> fila1 + columna1 Then 'Con esto se verifica si el movimiento no ha sido diagonal, pues por ejemplo si la corona estuviera originalmente en la posición (0, 6), la suma de la fila más la columna da 6; entonces la suma de los subíndices de la posición destino deben sumar 6 para asegurar que el movimiento fue diagonal, por ejemplo: (1, 5), (2, 4), (3, 3), (4, 2), (5, 1) y (6, 0) son movimientos diagonales válidos hacia el Suroeste. Si la posición destino tuviera los subíndices (3, 5), (5, 5), (7, 5), (5, 3), (7, 1), (3, 1) y (1, 3) por ejemplo, la suma de los subíndices de la posición destino no da 6 (que es la suma de los subíndices de la posición de origen para este ejemplo), por lo tanto, el movimiento no habría sido diagonal y sería inválido. Si el movimiento no fue válido (fue hacia el Suroeste pero no fue un movimiento diagonal), la corona se regresará a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Noroeste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug2 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
End If
If numdefichasjug1 = 1 Then 'Si hay 1 ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug2 = 1 Then 'Si hay una ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
End If
If fila1 < fila Then 'fila1 contiene la fila a la que se quiere ir a poner la corona. fila contiene la fila donde estaba la corona. Debido a que esto está dentro del procedimiento es mover2(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 2, entonces esta línea condiciona que el Jugador 2 mueve hacia adelante del Jugador 2 (hacia arriba en la pantalla); hacia el Norte.
If columna1 < columna Then 'columna1 contiene la columna a la que se quiere ir a poner la corona. columna contiene la columna donde estaba la corona. Debido a que esto está dentro del procedimiento mover2(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 2, y a la vez por la línea anterior se sabe que el movimiento ha sido hacia adelante del Jugador 2 (hacia arriba en la pantalla), entonces esta línea condiciona que el Jugador 2 mueve hacia su izquierda (hacia la izquierda en la pantalla); hacia el Oeste.
'Se sabe entonces que el movimiento ha sido diagonalmente hacia el Noroeste.
'Declaración de variables que se utilizarán en el próximo ciclo For que aparece.
Dim numdefichas As Integer = 0 'Número de fichas que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug1 As Integer = 0 'Número de fichas del Jugador 1 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug2 As Integer = 0 'Número de fichas del Jugador 2 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim ieliminar As Integer 'Valor de la fila a eliminar o comer.
Dim jeliminar As Integer 'Valor de la columna a eliminar o comer.
j = columna1
'Con el ciclo For presentado a continuación se van a evaluar las fichas que hay (si las hubiera) entre la posición inicial y la posición final del movimiento que se quiere hacer de la corona, para determinar si es posible el movimiento y si es posible también comer.
For i = fila1 To fila – 1
If casilla(i, j).ocupada = True Then 'Si la casilla evaluada está ocupada por alguna ficha.
numdefichas += 1 'Equivale a escribir "numdefichas = numdefichas + 1".
If casilla(i, j).jugador = 1 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 1.
numdefichasjug1 += 1 'Equivale a escribir "numdefichasjug1 = numdefichasjug1 + 1".
'Se almacenan los valores de fila y columna de la ficha que se tendría que eliminar en casi de cumplirse condiciones que se evaluarán posteriormente.
ieliminar = i
jeliminar = j
End If
If casilla(i, j).jugador = 2 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 2.
numdefichasjug2 += 1 'Equivale a escribir "numdefichasjug2 = numdefichasjug2 + 1".
End If
End If
j += 1 'Equivale a escribir "j = j + 1".
If j = 8 Then 'Esto es para que no se evalúe una columna que no existe, evitando que el programa se trabe.
Exit For 'Salida inmediata del ciclo For aunque no haya terminado el número de iteraciones que se le habían programado.
End If
Next
If fila + columna <> fila1 + columna1 + ((columna – columna1) * 2) Then 'Con esto se verifica si el movimiento no ha sido diagonal. Para que el movimiento haya sido diagonal (tomando en cuenta que ya se sabe que el movimiento es hacia el Noroeste) se debe cumplir la siguiente ecuación: "fila + columna = fila + columna + ((columna – columna1) * 2)". Por ejemplo, si la posición de inicio fue (7,7), la suma de esos subíndices es 14, entonces la posición destino (6,6) sería válida porque fila1+columna2+((columna-columna1)*2)=6+6+((7-6)*2)=14. Igualmente otras posiciones válidas para este ejemplo serían (5,5), (4,4), (3,3), (2,2). Algunas posiciones inválidas para este mismo ejemplo serían (7,5), (7,3), (6,0), (4,0), (3,1), (2,0). Si no se cumple esta ecuación, el movimiento hacia el Noroeste no sería diagonal y por lo tanto sería inválido. Por ello la corona se regresa a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Noroeste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug2 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
End If
If numdefichasjug1 = 1 Then 'Si hay 1 ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug2 = 1 Then 'Si hay una ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
If columna1 > columna Then 'columna1 contiene la columna a la que se quiere ir a poner la corona. columna contiene la columna donde estaba la corona. Debido a que esto está dentro del procedimiento mover2(ByVal sender As Panel), ya se sabe que el movimiento es para el Jugador 2, y a la vez por la línea anterior se sabe que el movimiento ha sido hacia adelante del Jugador 2 (hacia arriba en la pantalla), entonces esta línea condiciona que el Jugador 2 mueve hacia su derecha (hacia la derecha en la pantalla); hacia el Este.
'Se sabe entonces que el movimiento ha sido diagonalmente hacia el Noreste.
'Declaración de variables que se utilizarán en el próximo ciclo For que aparece.
Dim numdefichas As Integer = 0 'Número de fichas que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug1 As Integer = 0 'Número de fichas del Jugador 1 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim numdefichasjug2 As Integer = 0 'Número de fichas del Jugador 2 que hay entre la casilla donde se va a poner la corona y la casilla donde estaba (al hacer el movimiento diagonal).
Dim ieliminar As Integer 'Valor de la fila a eliminar o comer.
Dim jeliminar As Integer 'Valor de la columna a eliminar o comer.
j = columna1
'Con el ciclo For presentado a continuación se van a evaluar las fichas que hay (si las hubiera) entre la posición inicial y la posición final del movimiento que se quiere hacer de la corona, para determinar si es posible el movimiento y si es posible también comer.
For i = fila1 To fila – 1
If casilla(i, j).ocupada = True Then 'Si la casilla evaluada está ocupada por alguna ficha.
numdefichas += 1 'Equivale a escribir "numdefichas = numdefichas + 1".
If casilla(i, j).jugador = 1 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 1.
numdefichasjug1 += 1 'Equivale a escribir "numdefichasjug1 = numdefichasjug1 + 1".
'Se almacenan los valores de fila y columna de la ficha que se tendría que eliminar en casi de cumplirse condiciones que se evaluarán posteriormente.
ieliminar = i
jeliminar = j
End If
If casilla(i, j).jugador = 2 Then 'Si la casilla evaluada está ocupada por una ficha del Jugador 2.
numdefichasjug2 += 1 'Equivale a escribir "numdefichasjug2 = numdefichasjug2 + 1".
End If
End If
j -= 1 'Equivale a escribir "j = j – 1".
If j = -1 Then 'Esto es para que no se evalúe una columna que no existe, evitando que el programa se trabe.
Exit For 'Salida inmediata del ciclo For aunque no haya terminado el número de iteraciones que se le habían programado.
End If
Next
If fila + columna <> fila1 + columna1 Then 'Con esto se verifica si el movimiento no ha sido diagonal, pues por ejemplo si la corona estuviera originalmente en la posición (7, 1), la suma de la fila más la columna da 8; entonces la suma de los subíndices de la posición destino deben sumar 8 para asegurar que el movimiento fue diagonal, por ejemplo: (6, 2), (5, 3), (4, 4), (3, 5) y (2, 6) son movimientos diagonales válidos hacia el Noreste. Si la posición destino tuviera los subíndices (4, 2), (3, 3), (5, 5) o (4, 6) por ejemplo, la suma de los subíndices de la posición destino no da 8 (que es la suma de los subíndices de la posición de origen para este ejemplo), por lo tanto, el movimiento no habría sido diagonal y sería inválido. Si el movimiento no fue válido (fue hacia el Noreste pero no fue un movimiento diagonal), la corona se regresará a la posición inicial en que estaba.
Me.Left = pos_x
Me.Top = pos_y
Else 'Si el movimiento de la corona es válido (diagonalmente hacia el Noreste).
If numdefichas <= 1 Then 'Si hay 0 o 1 fichas entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
If numdefichasjug2 = 0 Then
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
End If
If numdefichasjug1 = 1 Then 'Si hay 1 ficha del Jugador 1 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se efectúa el movimiento.
casilla(fila, columna).ocupada = False
casilla(fila1, columna1).ocupada = True
casilla(fila, columna).jugador = 0
casilla(fila1, columna1).jugador = 2
sender.Top = casilla(fila1, columna1).Top + 12.5
sender.Left = casilla(fila1, columna1).Left + 12.5
turno = 1 'Para que luego de efectuar este movimiento, que el turno sea para el Jugador 1.
comer1(ieliminar, jeliminar) 'Para quitar la ficha del otro equipo que ha sido comida por la corona.
End If
If numdefichasjug2 = 1 Then 'Si hay una ficha del Jugador 2 entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza. Esto porque una corona no se puede saltar una ficha de su mismo equipo.
Me.Left = pos_x
Me.Top = pos_y
End If
Else 'Si hay más de una ficha entre la posición inicial y la posición final del movimiento diagonal que se quiere hacer.
'Se devuelve la corona a la posición inicial y el movimiento no se realiza.
Me.Left = pos_x
Me.Top = pos_y
End If
End If
End If
End If
'Si los movimientos no son diagonales sino que rectos, la corona se devuelve a su posición inicial o de origen.
If columna = columna1 Then
Me.Left = pos_x
Me.Top = pos_y
End If
If fila1 = fila Then
Me.Left = pos_x
Me.Top = pos_y
End If
End Sub
Public Sub comer1(ByVal i As Integer, ByVal j As Integer)
'En el módulo PRINCIPAL se ha declarado "Public casilla(7, 7) As CASILLAS", por lo cual la variable casillas(indice1, indice2) se encuentra disponible en cualquier parte.
casilla(i, j).ocupada = False 'La casilla donde estaba la pieza que acaba de ser comida, se pone en False para hacer que se encuentre desocupada.
casilla(i, j).jugador = 0 'Ningún Jugador tendrá ficha en esta casilla porque acaba de ser comida.
casilla(i, j).BringToFront() 'La casilla que fue desocupada con la línea anterior se trae al frente, pues si no se hiciera esto se seguiría viendo la ficha que fue comida. Con esta línea se hace que la ficha comida quede abajo y que no se vea porque se le pone encima la casilla sin ninguna pieza.
End Sub
End Class
FICHAS.vb
Public Class FICHAS
Inherits Panel
Private DX, DY As Integer
Private mover As Boolean
Private pos_x, pos_y As Integer
Private fila, columna As Integer 'fila almacena la fila de la posición al darse el evento mouse_down. columna almacena la columna de la posición al darse el evento mouse_up.
Public fila1, columna1 As Integer 'fila1 almacena la fila de la posición al darse el evento mouse_up. columna1 almacena la columna de la posición al darse el evento mouse_up. Aunque cuando se evalúen los procedimientos para comer doble y comer triple, éstas variables son actualizadas para determinar la posición actual de la ficha que se quiere evaluar que pueda comer doble o triple.
Private come As Boolean
Public si As Integer = 0 'Variable que cuando vale 1 significa que fue posible realizar un movimiento, ya sea simplemente mover una ficha o comer.
Private clicfichajug1 As Boolean 'Variable paradeterminar si se hizo clic sobre una ficha del Jugador 1.
Private clicfichajug2 As Integer 'Variable para determinar si se hizo clic sobre una ficha del Jugador 2.
Página anterior | Volver al principio del trabajo | Página siguiente |