Descargar

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