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 |