Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Programación de un juego de damas en Visual Basic 2005 (página 4)




Enviado por jaimemontoya



Partes: 1, 2, 3, 4, 5, 6

Public Sub mouse_down(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

mover = True

'CType(sender, Panel).BorderStyle =
Windows.Forms.BorderStyle.Fixed3D

CType(sender,
Panel).BringToFront()

DX = e.X

DY = e.Y

pos_x = Me.Left

pos_y = Me.Top

'Se captura la fila y columna en que se
encuentra.

For f = 0
To 7

For c = 0
To 7

If Me.Location.X >= casilla(f,
c).Location.X And
Me.Location.X <= casilla(f,
c).Location.X + 75 And
Me.Location.Y >= casilla(f,
c).Location.Y And
Me.Location.Y <= casilla(f,
c).Location.Y + 75 Then

fila = f 'La variable
"fila" almacena la fila del tablero donde se hizo clic
(comenzando la cuenta de las filas desde 0 y de arriba hacia
abajo).

columna = c 'La variable
"columna" almacena la columna del tablero donde se hizo clic
(comenzando la cuenta de las columnas desde 0 y de izquierda a
derecha).

If casilla(f, c).jugador =
1 Then 'Si la casilla sobre la que se hizo clic tiene una
ficha del Jugador 1.

clicfichajug1 = True

End If

If casilla(f, c).jugador =
2 Then

clicfichajug2 = True
'Si la casilla sobre la que se hizo clic
tiene una ficha del Jugador 2.

End If

End If

Next

Next

End Sub

Public Sub mouse_up(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp

mover = False

si = 0 'Inicialmente se
pone esta variable en 0 para indicar que ningún movimiento ha
sido todavía posible. Si en el procedimiento
mover1(CType(sender, Panel)) o en el procedimiento
mover2(CType(sender, Panel)) esta variable cambia a tener
valor de 1,
entonces podrán crearse coronas.

CType(sender,
Panel).BorderStyle = Windows.Forms.BorderStyle.None

'Se verifica si se encuentra adentro del
tablero.

If Me.Location.X >= 357
And Me.Location.X <= 967
And Me.Location.Y >= 66 And Me.Location.Y <= 656
Then

Else

Me.Left = pos_x

Me.Top = pos_y

End If

'Se verifica si se encuentra en una
casilla válida.

For f = 0
To 7

For c = 0
To 7

If Me.Location.X >= casilla(f,
c).Location.X And
Me.Location.X <= casilla(f,
c).Location.X + 75 And
Me.Location.Y >= casilla(f,
c).Location.Y And
Me.Location.Y <= casilla(f,
c).Location.Y + 75 Then
'Gracias a los ciclos For anidados, se va a
ir evaluando casilla por casilla con este If, definiedo las
coordenadas para casa casilla, que son cuatro: izquierda,
derecha, arriba y abajo. Donde aparece "+ 75" es porque a la
coordenada de la izquierda se le agregan 75 pixeles y ya se tiene
la coordenada del límite derecho de una casilla, y lo
mismo para el caso del eje Y, que ya se tiene el límite
superior de la casilla y al sumarle 75 pixeles se obtiene el
límite inferior, pues en las coordenadas del formulario
las Y positivas van contando hacia abajo.

fila1 = f 'La variable
"fila1" almacena la fila del tablero donde se soltó el
clic o donde se desea posicionar una ficha (comenzando la cuenta
de las filas desde 0 y de arriba hacia abajo).

columna1 = c 'La variable
"columna1" almacena la columna del tablero donde se soltó
el clic o donde se desea posicionar una ficha (comenzando la
cuenta de las columnas desde 0 y de izquierda a
derecha).

End If

Next

Next

If (fila1 +
columna1) Mod 2 =
0 Then 'Porque la primer ficha está en la
posición (0, 0), (2,6), (3, 2), etc, es válido
porque la suma de los subíndices da par. Entonces si la
suma de los sunbíndices da impar, es porque en esas
casillas nunca podría haber una pieza.

'Se verifica que no esté ocupada
la casilla.

If casilla(fila1,
columna1).ocupada = True
Then 'Si la
casilla está ocupada, se regresa a las coordenadas de
donde venía cuando se dio el evento MouseDown.

Me.Left = pos_x

Me.Top = pos_y

Else 'Es
porque la casilla no está ocupada.

'Se establecen los
movimientos.

If turno = 1
Then 'Si el
turno de mover es para el Jugador 1.

If fila1 > fila
And clicfichajug1 =
True And (fila1 – fila <= 2)
Then 'fila1
almacena la fila donde se quiere ubicar la ficha. fila almacena
la fila donde se encontraba la ficha originalmente. Si
fila1>fila significa que la fila destino es mayor que la fila
origen, es decir que se trata de un movimiento del Jugador 1
hacia adelante (hacia abajo en la pantalla). La segunda
condición que se pone es que sobre la ficha que se hizo
clic tiene que pertenecerle al Jugador 1. La última
condición es para que la ficha no trate de avanzar tres
filas o más (pues se puede avanzar solamente una fila o
dos como máximo al comer).

mover1(CType(sender, Panel))

If si = 1
Then 'Si fue
posible efectuar el movimiento, ya sea mover una ficha o
comer.

If fila1 = 7
Then 'Porque
la posición hacia donde quieren mover las fichas que
vienen de arriba hacia abajo (Jugador 1) es la final de hasta
abajo del tablero (fila 8), y es un movimiento válido, lo
cual significa que una ficha se corona.

cposx = CType(sender, Panel).Left

cposy = CType(sender, Panel).Top

CType(sender,
Panel).Visible = False

crear_corona1()

End If

End If

Else 'Si
turno = 2.

Me.Left = pos_x

Me.Top = pos_y

End If

Else 'Si
turno = 2, es decir, si el turno de mover es para el Jugador 2 y
si sobre la ficha que se hizo clic le pertenece al Jugador
2.

If (fila1 < fila)
And clicfichajug2
And (fila – fila1 <=
2) Then 'fila1 almacena la fila donde se quiere ubicar la
ficha. fila almacena la fila donde se encontraba la ficha
originalmente. Si fila1<fila significa que la fila destino es
menor que la fila origen, es decir que se trata de un movimiento
del Jugador 2 hacia adelante (hacia arriba en la pantalla). La
segunda condición que se pone es que sobre la ficha que se
hizo clic tiene que pertenecerle al Jugador 2. La última
condición es para que la ficha no trate de avanzar tres
filas o más (pues se puede avanzar solamente una fila o
dos como máximo al comer).

mover2(CType(sender, Panel))

If si = 1
Then 'Si fue
posible realizar el movimiento, ya sea mover una ficha o
comer.

If fila1 = 0
Then 'Porque
la posición hacia donde quieren mover las fichas que
vienen de abajo hacia arriba (Jugador 2) es la final de hasta
arriba del tablero (fila 1), y es un movimiento válido, lo
cual significa que una ficha se corona.

cposx = CType(sender, Panel).Left

cposy = CType(sender, Panel).Top

CType(sender,
Panel).Visible = False

crear_corona2()

End If

End If

Else

Me.Left = pos_x

Me.Top = pos_y

End If

End If

End If

Else 'Si la
suma de los subíndices da impar, entonces la ficha se
regresa a la posición en la que estaba cuando se dio el
evento MouseDown, pues en estas casillas nunca podría
estar una pieza, ya que los movimientos son siempre diagonales,
entonces no hay manera de que queden piezas en casillas cuya suma
de subíndices son impares.

Me.Left = pos_x

Me.Top = pos_y

End If

Form1.TextBox1.Text = "Jugador" + Str(turno) 'Para que cuando se suelte el clic del mouse, que
aparezca en el TextBox1 a qué Jugador le corresponde el
turno del siguiente movimiento.

'Se les da valor False a las siguientes
2 variables para
que puedan volverse a poner en True solamente si cumplen la
condición señalada en el evento
mouse_down.

clicfichajug1 = False

clicfichajug2 = False

End Sub

Public Sub mouse_move(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

If mover
Then 'Equivale
a escribir "If mover = True Then". mover = True al ejecutar el
evento mouse_down; y mover = False al ejecutar el evento
mouse_up.

Me.Left = e.X +
Me.Left – DX

Me.Top = e.Y +
Me.Top – DY

End If

End Sub

Public Sub mover1(ByVal sender As Panel) 'Debido a las condiciones dadas en el código
antes de llamar este procedimiento, se sabe que cuando haya sido
llamado, el Jugador 1 está haciendo un movimiento hacia
adelante (hacia abajo en la pantalla), pero hace falta evaluar
cuántas posiciones se va a desplazar diagonalmente hacia
la derecha o hacia la izquierda, y así saber si el
movimiento es válido o no, y si se puede hacer el
movimiento, dependiendo de si hay una ficha o no, o si es posible
comer, etc.

If columna1 >
columna Then 'Si el movimiento es diagonalmente hacia la derecha de
la pantalla (izquierda del Jugador 1).

'Si el Jugador 1 mueve diagonalmente una
posición hacia la derecha de la pantalla (una
posición hacia la izquierda del Jugador 1).

If columna1 = columna +
1 Then

If casilla(fila1,
columna1).ocupada = False
Then

If fila1 = soplarfila1 +
1 And columna1 =
soplarcolumna1 + 1 And
soplar1 = True
Then 'Si se
tenía que soplar debido a que en vez de comer, el Jugador
1 movió una posición diagonalmente hacia la derecha
de la pantalla con la ficha que tenía la posibilidad de
comer.

'La pieza se regresa a la
posición en la que estaba.

Me.Left = pos_x

Me.Top = pos_y

'La pieza que ha sido regresada a la
posición en la que estaba con las líneas
anteriores, es soplada por no haber comido cuando tenía
que hacerlo.

comer1(soplarfila1, soplarcolumna1) 'Se quita esta ficha del tablero y se deja la casilla
vacía.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 2 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
2.

Else 'Si el
movimiento de una posición diagonalmente hacia la derecha
no fue por parte de una ficha que tenía que comer (y por
lo tanto no tiene que ser soplada).

If soplar1 =
True Then 'Si hay alguna ficha
del Jugador 1 que se tiene que soplar por no haber comido cuando
tuvo la oportunidad.

comer1(soplarfila1, soplarcolumna1) 'Se quita esta ficha del tablero y se deja la casilla
vacía.

'Para que se ponga en posición de
soplar una casilla en donde nunca podría haber una
ficha.

soplarfila1 = 0

soplarcolumna1 = 1

soplar1 = False
'Porque se acaba de soplar ya.

End If

casilla(fila, columna).ocupada = False 'Desaparece la ficha
de donde estaba porque va a ponerse en otra casilla.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la nueva casilla, pues se movió de donde
estaba.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 1 '1 para indicar que en esta casilla está una
ficha del Jugador 1.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 2 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
2.

End If

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento de una posición hacia la derecha de
la pantalla (izquierda del Jugador 1).

Me.Left = pos_x

Me.Top = pos_y

End If

'Si el Jugador 1 mueve diagonalmente dos
posiciones para comer a la derecha de la pantalla (dos posiciones
hacia la izquierda del Jugador 1).

ElseIf columna1 = columna +
2 Then

If casilla(fila + 1,
columna + 1).ocupada = False
Then 'No puede
moverse dos posiciones si no hay una pieza del otro equipo de por
medio para comérsela, entonces se regresa la ficha a la
posición en donde estaba.

Me.Left = pos_x

Me.Top = pos_y

Else 'Hay
una ficha de por medio, entonces podría darse el
movimiento de comer, pero si se cumple la condición de que
esa ficha sea del otro equipo.

If casilla(fila + 1,
columna + 1).jugador = 2 Then
'Si la ficha que hay de por medio es del
Jugador 2 (y sabiendo que el Jugador 1 es el que quiere hacer
este movimiento), entonces se puede comer la pieza y efectuar el
movimiento.

If casilla(fila1,
columna1).ocupada = False
Then 'Si la
posición destino (donde se quiere poner la ficha)
está desocupada.

casilla(fila, columna).ocupada = False 'Se quita la ficha
de donde estaba originalmente.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la posición de destino.

casilla(fila, columna).jugador = 0 '0 porque en estarán fichas de ningún
Jugador.

casilla(fila1, columna1).jugador = 1

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

comer1(fila + 1, columna + 1) 'Se quita la ficha que intermedia entre la
posición origen y la posición destino, es decir que
ésta ficha es comida.

comerdoble1(CType(sender, Panel)) 'Se llama al procedimiento para verificar si se puede
comer doble.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 2 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
2.

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento de dos posiciones hacia la derecha de la
pantalla (izquierda del Jugador 1).

Me.Left = pos_x

Me.Top = pos_y

End If

Else 'Si la
ficha que hay de por medio es del Jugador 1, el movimiento es
inválido porque un Jugador no puede comerse sus mismas
piezas, entonces la pieza regresa a la posición en la que
estaba y el movimiento no se puede hacer efectivo.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

Else 'Si el
Jugador 1 mueve diagonalmente tres o más posiciones hacia
la derecha de la pantalla (tres o más posiciones hacia la
izquierda del Jugador 1). En este caso, la ficha se vuelve a la
posición de origen en la que estaba y el movimiento no se
hace efectivo porque solamente una reina podría mover de
esa manera, moviéndose tres o más espacios en
diagonal.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

If columna1 <
columna Then 'Si el movimiento es diagonalmente hacia la izquierda
de la pantalla (derecha del Jugador 1).

'Si el Jugador 1 mueve diagonalmente una
posición hacia la izquierda de la pantalla (una
posición hacia la derecha del Jugador 1).

If columna1 = columna –
1 Then

If casilla(fila1,
columna1).ocupada = False
Then

If fila1 = soplarfila1 +
1 And columna1 =
soplarcolumna1 – 1 And
soplar1 = True
Then 'Si se
tenía que soplar debido a que en vez de comer, el Jugador
1 movió una posición diagonalmente hacia la
izquierda de la pantalla con la ficha que tenía la
posibilidad de comer.

'La pieza se regresa a la
posición en la que estaba.

Me.Left = pos_x

Me.Top = pos_y

'La pieza que ha sido regresada a la
posición en la que estaba con las líneas
anteriores, es soplada por no haber comido cuando tenía
que hacerlo.

comer1(soplarfila1, soplarcolumna1) 'Se quita esta ficha del tablero y se deja la casilla
vacía.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 2 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
2.

Else 'Si el
movimiento de una posición diagonalmente hacia la
izquierda no fue por parte de una ficha que tenía que
comer (y por lo tanto no tiene que ser soplada).

If soplar1 =
True Then 'Si hay alguna ficha
del Jugador 1 que se tiene que soplar por no haber comido cuando
tuvo la oportunidad.

'MsgBox("Se soplará la ficha del
Jugador 1" + " que se encuentra en la fila " + Str(soplarfila1 +
1) + " y columna " + Str(soplarcolumna1 + 1) + ".",
MsgBoxStyle.OkOnly, "Juego de
Damas") 'Mensaje para indicar la ficha que se va a
soplar.

comer1(soplarfila1, soplarcolumna1) 'Se sopla la ficha que no comió cuando tuvo la
oportunidad.

'Para que se ponga en posición de
soplar una casilla en donde nunca podría haber una
ficha.

soplarfila1 = 7

soplarcolumna1 = 0

soplar1 = False
'Porque se acaba de soplar ya.

End If

casilla(fila, columna).ocupada = False 'Desaparece la ficha
de donde estaba porque va a ponerse en otra casilla.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la nueva casilla, pues se movió de donde
estaba.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 1 '1 para indicar que en esta casilla está una
ficha del Jugador 1.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 2 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
2.

End If

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento de una posición hacia la izquierda
de la pantalla (derecha del Jugador 1).

Me.Left = pos_x

Me.Top = pos_y

End If

'Si el Jugador 1 mueve diagonalmente dos
posiciones para comer a la izquierda de la pantalla (dos
posiciones hacia la derecha del Jugador 1).

ElseIf columna1 = columna –
2 Then 'No puede moverse dos posiciones si no hay una pieza
del otro equipo de por medio para comérsela, entonces se
regresa la ficha a la posición en donde estaba.

If casilla(fila + 1,
columna – 1).ocupada = False
Then

Me.Left = pos_x

Me.Top = pos_y

Else 'Hay
una ficha de por medio, entonces podría darse el
movimiento de comer, pero si se cumple la condición de que
esa ficha sea del otro equipo.

If casilla(fila + 1,
columna – 1).jugador = 2 Then
'Si la ficha que hay de por medio es del
Jugador 2 (y sabiendo que el Jugador 1 es el que quiere hacer
este movimiento), entonces se puede comer la pieza y efectuar el
movimiento.

If casilla(fila1,
columna1).ocupada = False
Then 'Si la
posición destino (donde se quiere poner la ficha)
está desocupada.

casilla(fila, columna).ocupada = False 'Se quita la ficha
de donde estaba originalmente.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la posición de destino.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 1 '1 para indicar que en esta casilla está una
ficha del Jugador 1.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

comer1(fila + 1, columna – 1) 'Se quita la ficha que intermedia entre la
posición origen y la posición destino, es decir que
ésta ficho es comida.

comerdoble1(CType(sender, Panel)) 'Se llama al procedimiento para verificar si se puede
comer doble.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 2 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
2.

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento de dos posiciones hacia la izquierda de la
pantalla (derecha del Jugador 1).

Me.Left = pos_x

Me.Top = pos_y

End If

Else 'Si la
ficha que hay de por medio es del Jugador 1, el movimiento es
inválido porque un Jugador no puede comerse sus mismas
piezas, entonces la pieza regresa a la posición en la que
estaba y el movimiento no se puede hacer efectivo.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

Else 'Si el
Jugador 1 mueve diagonalmente tres o más posiciones hacia
la izquierda de la pantalla (tres o más posiciones hacia
la derecha del Jugador 1). En este caso, la ficha se vuelve a la
posición de origen en la que estaba y el movimiento no se
hace efectivo porque solamente una reina podría mover de
esa manera, moviéndose tres o más espacios en
diagonal.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

If columna =
columna1 Then 'Esto es inválido, pues no las piezas se deben
mover en diagonal, y esto sería como que el Jugador 1
quisiera mover hacia el frente o hacia adelante en línea
recta (hacia abajo de la pantalla pero recto, no diagonal, como
se mueven las torres o las reinas en el ajedrez. Por
lo tanto la pieza se regresa a su posición inicial y no se
hace efectivo el movimiento.

Me.Left = pos_x

Me.Top = pos_y

End If

End Sub

Public Sub mover2(ByVal sender As Panel) 'Debido a las condiciones dadas en el código
antes de llamar este procedimiento, se sabe que cuando haya sido
llamado, el Jugador 2 está haciendo un movimiento hacia
adelante (hacia arriba en la pantalla), pero hace falta evaluar
cuántas posiciones se va a desplazar diagonalmente hacia
la derecha o hacia la izquierda, y así saber si el
movimiento es válido o no, y si se puede hacer el
movimiento, dependiendo de si hay una ficha o no, o si es posible
comer, etc.

If columna1 >
columna Then 'Si el movimiento es diagonalmente hacia la derecha de
la pantalla (derecha del Jugador 2).

'Si el Jugador 2 mueve diagonalmente una
posición hacia la derecha de la pantalla (una
posición hacia la derecha del Jugador 2).

If columna1 = columna +
1 Then

If casilla(fila1,
columna1).ocupada = False
Then

If fila1 = soplarfila2 –
1 And columna1 =
soplarcolumna2 + 1 And
soplar2 = True
Then 'Si se
tenía que soplar debido a que en vez de comer, el Jugador
2 movió una posición diagonalmente hacia la derecha
de la pantalla con la ficha que tenía la posibilidad de
comer.

'La pieza se regresa a la
posición en la que estaba.

Me.Left = pos_x

Me.Top = pos_y

'La pieza que ha sido regresada a la
posición en la que estaba con las líneas
anteriores, es soplada por no haber comido cuando tenía
que hacerlo.

comer1(soplarfila2, soplarcolumna2) 'Se quita esta ficha del tablero y se deja la casilla
vacía.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 1 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
1.

Else 'Si el
movimiento de una posición diagonalmente hacia la derecha
no fue por parte de una ficha que tenía que comer (y por
lo tanto no tiene que ser soplada).

If soplar2 =
True Then 'Si hay alguna ficha
del Jugador 2 que se tiene que soplar por no haber comido cuando
tuvo la oportunidad.

comer1(soplarfila2, soplarcolumna2) 'Se sopla la ficha que no comió cuando tuvo la
oportunidad de hacerlo.

'Para que se ponga en posición de
soplar una casilla en donde nunca podría haber una
ficha.

soplarfila2 = 7

soplarcolumna2 = 0

soplar2 = False
'Porque se acaba de soplar ya.

End If

casilla(fila, columna).ocupada = False 'Desaparece la ficha
de donde estaba porque va a ponerse en otra casilla.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la nueva casilla, pues se movió de donde
estaba.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 2 '1 para indicar que en esta casilla está una
ficha del Jugador 2.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 1 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
1.

End If

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento de una posición hacia la derecha de
la pantalla (derecha del Jugador 2).

Me.Left = pos_x

Me.Top = pos_y

End If

'Si el Jugador 2 mueve diagonalmente dos
posiciones para comer a la derecha de la pantalla (dos posiciones
hacia la derecha del Jugador 2).

ElseIf columna1 = columna +
2 Then

If casilla(fila – 1,
columna + 1).ocupada = False
Then 'No puede
moverse dos posiciones si no hay una pieza del otro equipo de por
medio para comérsela, entonces se regresa la ficha a la
posición en donde estaba.

Me.Left = pos_x

Me.Top = pos_y

Else 'Hay
una ficha de por medio, entonces podría darse el
movimiento de comer, pero si se cumple la condición de que
esa ficha sea del otro equipo.

If casilla(fila – 1,
columna + 1).jugador = 1 Then
'Si la ficha que hay de por medio es del
Jugador 1 (y sabiendo que el Jugador 2 es el que quiere hacer
este movimiento), entonces se puede comer la pieza y efectuar el
movimiento.

If casilla(fila1,
columna1).ocupada = False
Then 'Si la
posición destino (donde se quiere poner la ficha)
está desocupada.

casilla(fila, columna).ocupada = False 'Se quita la ficha
de donde estaba originalmente.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la posición de destino.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 2 '1 para indicar que en esta casilla está una
ficha del Jugador 2.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

comer1(fila – 1, columna + 1) 'Se quita la ficha que intermedia entre la
posición origen y la posición destino, es decir que
ésta ficha es comida.

comerdoble2(CType(sender, Panel)) 'Se llama al procedimiento para verificar si se puede
comer doble.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 1 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
1.

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento diagonal de dos posiciones hacia la
derecha de la pantalla (derecha del Jugador 2).

Me.Left = pos_x

Me.Top = pos_y

End If

Else 'Si la
ficha que hay de por medio es del Jugador 2, el movimiento es
inválido porque un Jugador no puede comerse sus mismas
piezas, entonces la pieza regresa a la posición en la que
estaba y el movimiento no se puede hacer efectivo.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

Else 'Si el
Jugador 2 mueve diagonalmente tres o más posiciones hacia
la derecha de la pantalla (tres o más posiciones hacia la
derecha del Jugador 2). En este caso, la ficha se vuelve a la
posición de origen en la que estaba y el movimiento no se
hace efectivo porque solamente una reina podría mover de
esa manera, moviéndose tres o más espacios en
diagonal.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

If columna1 <
columna Then 'Si el movimiento es diagonalmente hacia la izquierda
de la pantalla (izquierda del Jugador 2).

'Si el Jugador 2 mueve diagonalmente una
posición hacia la izquierda de la pantalla (una
posición hacia la izquierda del Jugador 2).

If columna1 = columna –
1 Then

If casilla(fila1,
columna1).ocupada = False
Then

If fila1 = soplarfila2 –
1 And columna1 =
soplarcolumna2 – 1 And
soplar2 = True
Then 'Si se
tenía que soplar debido a que en vez de comer, el Jugador
2 movió una posición diagonalmente hacia la
izquierda de la pantalla con la ficha que tenía la
posibilidad de comer.

'La pieza se regresa a la
posición en la que estaba.

Me.Left = pos_x

Me.Top = pos_y

'La pieza que ha sido regresada a la
posición en la que estaba con las líneas
anteriores, es soplada por no haber comido cuando tenía
que hacerlo.

comer1(soplarfila2, soplarcolumna2) 'Se quita esta ficha del tablero y se deja la casilla
vacía.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 1 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
1.

Else 'Si el
movimiento de una posición diagonalmente hacia la
izquierda no fue por parte de una ficha que tenía que
comer (y por lo tanto no tiene que ser soplada).

If soplar2 =
True Then 'Si hay alguna ficha
del Jugador 2 que se tiene que soplar por no haber comido cuando
tuvo la oportunidad.

comer1(soplarfila2, soplarcolumna2) 'Se sopla la ficha que no comió cuando tuvo la
oportunidad.

'Para que se ponga en posición de
soplar una casilla en donde nunca podría haber una
ficha.

soplarfila1 = 7

soplarcolumna1 = 0

soplar2 = False
'Porque se acaba de soplar ya.

End If

casilla(fila, columna).ocupada = False 'Desaparece la ficha
de donde estaba porque va a ponerse en otra casilla.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la nueva casilla, pues se movió de donde
estaba.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 2 '1 para indicar que en esta casilla está una
ficha del Jugador 2.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 1 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
1.

End If

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento de una posición hacia la izquierda
de la pantalla (izquierda del Jugador 2).

Me.Left = pos_x

Me.Top = pos_y

End If

'Si el Jugador 2 mueve diagonalmente dos
posiciones para comer a la izquierda de la pantalla (dos
posiciones hacia la izquierda del Jugador 2).

ElseIf columna1 = columna –
2 Then

If casilla(fila – 1,
columna – 1).ocupada = False
Then 'No puede
moverse dos posiciones si no hay una pieza del otro equipo de por
medio para comérsela, entonces se regresa la ficha a la
posición en donde estaba.

Me.Left = pos_x

Me.Top = pos_y

Else 'Hay
una ficha de por medio, entonces podría darse el
movimiento de comer, pero si se cumple la condición de que
esa ficha sea del otro equipo.

If casilla(fila – 1,
columna – 1).jugador = 1 Then
'Si la ficha que hay de por medio es del
Jugador 1 (y sabiendo que el Jugador 2 es el que quiere hacer
este movimiento), entonces se puede comer la pieza y efectuar el
movimiento.

If casilla(fila1,
columna1).ocupada = False
Then 'Si la
posición destino (donde se quiere poner la ficha)
está desocupada.

casilla(fila, columna).ocupada = False 'Se quita la ficha
de donde estaba originalmente.

casilla(fila1, columna1).ocupada = True 'Se pone la ficha en
la posición de destino.

casilla(fila, columna).jugador = 0 '0 para indicar que en esta casilla no está la
ficha de ningún Jugador.

casilla(fila1, columna1).jugador = 2 '1 para indicar que en esta casilla está una
ficha del Jugador 2.

sender.Top = casilla(fila1, columna1).Top +
12.5

sender.Left = casilla(fila1, columna1).Left +
12.5

comer1(fila – 1, columna – 1) 'Se quita la ficha que intermedia entre la
posición origen y la posición destino, es decir que
ésta ficha es comida.

comerdoble2(CType(sender, Panel)) 'Se llama al procedimiento para verificar si se puede
comer doble.

si = 1 'Indica que
sí fue posible realizar el movimiento de la
ficha.

turno = 1 'Para que luego
de efectuar este movimiento, que el turno sea para el Jugador
1.

Else 'La
ficha se devuelve a la posición de origen, pues no se pudo
efectuar un movimiento diagonal de dos posiciones hacia la
izquierda de la pantalla (izquierda del Jugador 2).

Me.Left = pos_x

Me.Top = pos_y

End If

Else 'Si la
ficha que hay de por medio es del Jugador 2, el movimiento es
inválido porque un Jugador no puede comerse sus mismas
piezas, entonces la pieza regresa a la posición en la que
estaba y el movimiento no se puede hacer efectivo.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

Else 'Si el
Jugador 2 mueve diagonalmente tres o más posiciones hacia
la izquierda de la pantalla (tres o más posiciones hacia
la izquierda del Jugador 2). En este caso, la ficha se vuelve a
la posición de origen en la que estaba y el movimiento no
se hace efectivo porque solamente una reina podría mover
de esa manera, moviéndose tres o más espacios en
diagonal.

Me.Left = pos_x

Me.Top = pos_y

End If

End If

If columna =
columna1 Then 'Esto es inválido, pues no las piezas se deben
mover en diagonal, y esto sería como que el Jugador 1
quisiera mover hacia el frente o hacia adelante en línea
recta (hacia arriba de la pantalla pero recto, no diagonal, como
se mueven las torres o las reinas en el ajedrez. Por lo tanto la
pieza se regresa a su posición inicial y no se hace
efectivo el movimiento.

Me.Left = pos_x

Me.Top = pos_y

End If

End Sub

Public Sub comer1(ByVal i As Integer, ByVal j As Integer) 'Este procedimiento requiere de dos argumentos, que
representan la casilla que se va a dejar sin nada después
de comerse la ficha que estaba ahí.

'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

Private Sub InitializeComponent()

Me.SuspendLayout()

Me.ResumeLayout(False)

End Sub

Private Sub comerdoble1(ByVal sender As Panel) 'Procedimiento para que cuando el Jugador 1 haya comido
una ficha, evaluar si hay oportunidad para que esa ficha siga
comiendo (comer doble).

Dim variablemensaje =
0

If fila1 < 6
Then 'Ese 6
equivale a decir fila 7 (pues el subíndice 0 es la fila
1). Esta condición se hace porque desde la fila 7 o desde
la fila 8 (contando filas de arriba hacia abajo) ya no puede
comer el Jugador 1, entonces en las evaluaciones daría
problema el código con los subíndices, pues
buscaría posiciones que no existen.

If soplar1 =
True Then

'Dim mensaje As Integer 'Variable que
almacenará el valor devuelto por la función
MsgBox().

'Para Jugador 1, comer hacia su derecha
(izquierda de la pantalla).

If columna1 > 1
Then

If casilla(fila1 + 1,
columna1 – 1).jugador = 2 Then

If casilla(fila1 + 2,
columna1 – 2).ocupada = False
Then

MsgBox("Se debe seguir
comiendo.", MsgBoxStyle.OkOnly, "Juego de Damas") 'Mensaje para indicar que se debe seguir
comiendo.

'If mensaje = 0 Then 'La función
MsgBox devuelve un valor, el cual ha sido almacenado en la
variable "mensaje". Los valores
devueltos pueden ser 1, 2, 3, 4, 5, 6 o 7. El valor 6 significa
que se ha hecho clic en el botón Yes.

casilla(fila1, columna1).ocupada = False

casilla(fila1 + 2, columna1 – 2).ocupada =
True

casilla(fila1, columna1).jugador = 0

casilla(fila1 + 2, columna1 – 2).jugador = 1

sender.Top = casilla(fila1 + 2, columna1 – 2).Top +
12.5

sender.Left = casilla(fila1 + 2, columna1 – 2).Left +
12.5

comer1(fila1 + 1, columna1 – 1)

variablemensaje += 1

'Código para comer triple (si
fuera posible).

posibilidad_soplar() 'Actualizar valores y
determinar si hay posibilidad de comer una tercera vez (que le
soplen la ficha si no come) para el Jugador 1, luego de haber
comido doble.

If (soplarfila1 = fila1 +
2) And (soplarcolumna1
= columna1 – 2) And
(soplar1 = True) Then 'Si la ficha del
Jugador 1 que acaba de terminar de comer doble tiene posibilidad
de seguir comiendo o de comer triple (pues las variables la
tienen amenazada de ser soplada).

'If soplar1 = True Then

'fila1 = soplarfila1 'Para que luego de
haber comido doble, que la posición de las filas se
actualice a la fila donde se encuentra la ficha luego de haber
comido doble.

'columna1 = soplarcolumna1 'Actualizar
el valor de la columna donde se encuentra la ficha que acaba de
comer doble, para que cuando se llame el procedimiento
comertriple1(CType(sender, Panel)), que se tenga el valor
actualizado de la columna donde se encuentra la ficha del Jugador
1 que acaba de comer doble.

comertriple1(CType(sender, Panel)) 'Se llama al procedimiento para verificar si el Jugador
1 puede seguir comiendo (comer triple).

End If

'Condición para controlar si con
la comida doble la ficha se llega a coronar.

If fila1 = 5
Then

fila1 = 7 'Cuando una ficha
del Jugador 1 está en la fila 8 (contando filas de arriba
hacia abajo), se corona.

End If

End If

End If

End If

'Para Jugador 1, comer hacia su
izquierda (derecha de la pantalla).

If variablemensaje =
0 Then 'Para que si ya comió doble con el If anterior,
que ya no entre a este If.

If columna1 < 6
Then

If casilla(fila1 + 1,
columna1 + 1).jugador = 2 Then

If casilla(fila1 + 2,
columna1 + 2).ocupada = False
Then

MsgBox("Se debe seguir
comiendo.", MsgBoxStyle.OkOnly, "Juego de Damas") 'Mensaje para indicar que se debe seguir
comiendo.

casilla(fila1, columna1).ocupada = False

casilla(fila1 + 2, columna1 + 2).ocupada =
True

casilla(fila1, columna1).jugador = 0

casilla(fila1 + 2, columna1 + 2).jugador = 1

sender.Top = casilla(fila1 + 2, columna1 + 2).Top +
12.5

sender.Left = casilla(fila1 + 2, columna1 + 2).Left +
12.5

comer1(fila1 + 1, columna1 + 1)

'Código para comer triple (si
fuera posible).

posibilidad_soplar() 'Actualizar valores y determinar si hay posibilidad de
comer una tercera vez (que le soplen la ficha si no come) para el
Jugador 1, luego de haber comido doble.

If fila1 + 2 =
soplarfila1 And
columna1 + 2 = soplarcolumna1 And soplar1 = True Then
'Si la ficha del Jugador 1 que acaba de
terminar de comer doble tiene posibilidad de seguir comiendo o de
comer triple (pues las variables la tienen amenazada de ser
soplada).

comertriple1(CType(sender, Panel)) 'Se llama al procedimiento para verificar si el Jugador
1 puede seguir comiendo (comer triple).

End If

'Condición para controlar si con
la comida doble la ficha se llega a coronar.

If fila1 = 5
Then

fila1 = 7 'Cuando una ficha
del Jugador 1 está en la fila 8 (contando filas de arriba
hacia abajo), se corona.

End If

End If

End If

End If

End If

End If

End If

variablemensaje = 0 'Se
reinicia en 0 esta variable, que sirve para que solamente se
entre a uno de los If anteriores para comer doble, no a los dos,
pues o se come a la izquierda o se come a la derecha, pues no se
puede comer a ambos lados en un solo movimiento.

End Sub

Private Sub comerdoble2(ByVal sender As Panel) 'Procedimiento para que cuando el Jugador 2 haya comido
una ficha, evaluar si hay oportunidad para que esa ficha siga
comiendo (comer doble).

Dim variablemensaje =
0

If fila1 > 1
Then 'Ese 1
equivale a decir fila 2 (pues el subíndice 0 es la fila
1). Esta condición se hace porque desde la fila 0 o desde
la fila 1 (contando filas de arriba hacia abajo) ya no puede
comer el Jugador 2, entonces en las evaluaciones daría
problema el código con los subíndices, pues
buscaría posiciones que no existen.

If soplar2 =
True Then

'Para Jugador 2, comer hacia su
izquierda (izquierda de la pantalla).

If columna1 > 1
Then

If casilla(fila1 – 1,
columna1 – 1).jugador = 1 Then

If casilla(fila1 – 2,
columna1 – 2).ocupada = False
Then

MsgBox("Se debe seguir
comiendo.", MsgBoxStyle.OkOnly, "Juego de Damas") 'Mensaje para indicar que se debe seguir
comiendo.

casilla(fila1, columna1).ocupada = False

casilla(fila1 – 2, columna1 – 2).ocupada =
True

casilla(fila1, columna1).jugador = 0

casilla(fila1 – 2, columna1 – 2).jugador = 2

sender.Top = casilla(fila1 – 2, columna1 – 2).Top +
12.5

sender.Left = casilla(fila1 – 2, columna1 – 2).Left +
12.5

comer1(fila1 – 1, columna1 – 1)

variablemensaje += 1

'Código para comer triple (si
fuera posible).

posibilidad_soplar() 'Actualizar valores y determinar si hay posibilidad de
comer una tercera vez (que le soplen la ficha si no come) para el
Jugador 2, luego de haber comido doble.

If fila1 – 2 =
soplarfila2 And
columna1 – 2 = soplarcolumna2 And soplar2 = True Then
'Si la ficha del Jugador 2 que acaba de
terminar de comer doble tiene posibilidad de seguir comiendo o de
comer triple (pues las variables la tienen amenazada de ser
soplada).

comertriple2(CType(sender, Panel)) 'Se llama al procedimiento para verificar si el Jugador
1 puede seguir comiendo (comer triple).

End If

'Condición para controlar si con
la comida doble la ficha se llega a coronar.

If fila1 = 2
Then

fila1 = 0 'Cuando una ficha
del Jugador 2 está en la fila 1 (contando filas de arriba
hacia abajo), se corona.

End If

End If

End If

End If

'Para Jugador 2, comer hacia su derecha
(derecha de la pantalla).

If variablemensaje =
0 Then 'Para que si ya comió doble con el If anterior,
que ya no entre a este If.

If columna1 < 6
Then

If casilla(fila1 – 1,
columna1 + 1).jugador = 1 Then

Partes: 1, 2, 3, 4, 5, 6
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter