Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 1 | 11
Juego de Damas
Las damas es un juego de mesa para dos contrincantes. El juego consiste en mover las piezas en diagonal a travs de los cuadros negros o blancos de un tablero de 64 o 100 cuadros con la intencin de capturar (comer) las piezas del contrario saltando por encima de ellas. Existen varias modalidades, con distintos tableros y nmero de piezas. La versin internacional, tambin llamada damas polacas, est reglada por la Fdration Mondiale du Jeu de Dames (FMJD) y se juega en un tablero de 1010 cuadros con dos jugadores con 20 piezas cada uno.1
Reglas Tradicionales: Las damas es un juego para dos personas en un tablero de 64 casillas de 8 x 8 celdas. La casilla de la izquierda tiene que tener el color negro. Cada jugador dispone de 12 piezas de un mismo color (uno blanco y otro negro) que al principio de la partida se encuentran en las casillas negras de las tres filas ms prximas a l. El objetivo del juego de damas es capturar las fichas del oponente o acorralarlas para que los nicos movimientos que puedan realizar sean los que lleven a su captura, (excepto las damas rusas la variante poddavki que gana quin se queda sin fichas o tiene bloqueadas las que tiene). Se juega por turnos alternos. Empieza a jugar quien tiene las fichas oscuras (negras). En su turno cada jugador mueve una pieza propia. Las piezas se mueven (cuando no comen) una posicin adelante (nunca hacia atrs) en diagonal a la derecha o a la izquierda, a una posicin adyacente vaca.
Caractersticas: Jugar Damas con otra persona
Inconvenientes: -Slo jugador contra jugador -No permite saltos dobles y triples
Notas: -Probablemente podra haber hecho el cdigo un poco menos en la funcin CheckMove, pero lo hice de la manera que lo hice para que pueda realizar un seguimiento de mi cdigo
Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 2 | 11
A continuacin se muestra la impresin de pantalla del programa en ejecucin, as como tambin el cdigo completo del programa, el cual se encuentra lleno de comentarios para los que deseen y quieran estudiar el cdigo, aprender de las tcnicas de programacin orientada a objetos que se han utilizado y finalmente, si lo desean, modificar el cdigo o utilizarlo para las aplicaciones que quieran.
Form1.vb:
Public Class Form1
Private board(7, 7) As Panel Private p1turn As Boolean = True
Private Sub Load_Board()
'Bucle anidado de 0 a 7 para ambas dimensiones For x As Integer = 0 To board.GetUpperBound(0) For y As Integer = 0 To board.GetUpperBound(1)
'Un panel llevar a cabo nuestro corrector Dim pnl As New Panel With pnl 'Hacer que el patrn de cuadros comprobando si estamos en un par o impar 'Entonces, alternado con base si y es par o impar If CBool(x Mod 2) Then If CBool(y Mod 2) Then .BackColor = Color.SaddleBrown Else .BackColor = Color.Peru End If Else If CBool(y Mod 2) Then .BackColor = Color.Peru Else Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 3 | 11
.BackColor = Color.SaddleBrown End If End If .BorderStyle = BorderStyle.FixedSingle .Location = New Point(x * 55, y * 55) .Size = New Size(55, 55) End With
'Aadir al panel al tablero y a la forma board(x, y) = pnl Me.Controls.Add(pnl)
'Agregar el controlador de eventos click AddHandler pnl.Click, AddressOf pnl_click Next Next
End Sub
Private Sub Load_Checkers()
Dim x As Integer = 0 'Loop de 0 a los 2 o 3 filas superiores de nuestro tablero For y As Integer = 0 To 2 'Set x basado en que fila nosotros no lo queremos 'Las damas para estar en el panel de color equivocado If y = 1 Then x = 1 Else x = 0 End If
'Loop ya sea 0-3 o 1-4 For i As Integer = x To x + 3 'Configurar una nueva verificacin y establecer las propiedades Dim check As New Checker With check .BackColor = Color.Black .IsKing = False .IsSelected = False .Location = New Point(2, 2) .Player = 2 .Size = New Size(50, 50) End With
'Aadir el corrector al panel board(x, y).Controls.Add(check)
'Configurar el controlador de eventos AddHandler check.Click, AddressOf checker_click
'Incremento de x por dos, as que el prxima corrector no se sienta en el panel de color equivocado x += 2 Next
Next
'Haga lo mismo que el anterior, slo en los ltimos 3 filas de nuestro tablero x = 1 For y As Integer = 5 To 7 Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 4 | 11
If y = 6 Then x = 0 Else x = 1 End If
For i As Integer = x To x + 3 Dim check As New Checker With check .BackColor = Color.White .IsKing = False .IsSelected = False .Location = New Point(2, 2) .Player = 1 .Size = New Size(50, 50) End With
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'Establecer un nuevo juego Call NewGame()
'Cmo el ancho y la altura para el ttulo posteriormente establecer el tamao del formulario Dim title_wid As Integer = CInt(Me.Width - Me.ClientSize.Width) Dim title_hei As Integer = CInt(Me.Height - Me.ClientSize.Height)
'Establecer las propiedades del formulario With Me .Size = New Size(8 * 55 + title_wid, 8 * 55 + title_hei) .StartPosition = FormStartPosition.CenterScreen .Text = "Checkers" End With End Sub
Private selected_checker As Checker Private Sub pnl_click(sender As Object, e As EventArgs) 'Obtiene el panel que se acaba de hacer clic Dim pnl_clicked As Panel = DirectCast(sender, Panel)
If Not (IsNothing(selected_checker)) AndAlso CheckMove(selected_checker, pnl_clicked) Then MoveChecker(selected_checker, pnl_clicked) End If
End Sub
Private Sub checker_click(sender As Object, e As EventArgs) Dim checker_clicked As Checker = DirectCast(sender, Checker)
If Not (IsNothing(selected_checker)) Then If checker_clicked Is selected_checker Then Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 5 | 11
'Compruebe si el corrector se selecciona el que acaba se ha hecho clic 'Si lo fuera el corrector entonces simplemente se selecciona selected_checker.IsSelected = False selected_checker = Nothing Else 'Si no fuera el corrector que se acaba de hacer clic a continuacin, seleccinelo selected_checker = checker_clicked checker_clicked.IsSelected = True End If Else 'Si no fuera el corrector que se acaba de hacer clic a continuacin, seleccinelo selected_checker = checker_clicked checker_clicked.IsSelected = True End If End Sub
Private Function CheckMove(ByVal moving_checker As Checker, ByVal pnl_to_move_to As Panel) As Boolean 'Si el panel fue seleccionado tiene un corrector en el, entonces ignore el click 'Tambien seleccione para asegurarse que la seccion del corrector no es nada If pnl_to_move_to.Controls.Count = 0 AndAlso Not (IsNothing(moving_checker)) Then
'Obtener el x e y numero en el tablero para ambos paneles declarados anteriormente Dim x_sel, y_sel, x_cur, y_cur As Integer For col As Integer = 0 To board.GetUpperBound(0) For row As Integer = 0 To board.GetUpperBound(1) If board(col, row) Is pnl_to_move_to Then x_sel = col y_sel = row End If
If board(col, row) Is DirectCast(moving_checker.Parent, Panel) Then x_cur = col y_cur = row End If Next Next
'Ahora seleccionamos si el movimiento fue correcto If moving_checker.Player = 1 AndAlso p1turn Then If x_sel - x_cur = -1 AndAlso y_sel - y_cur = -1 Then 'Primero seleccionamos si el movimiento es uno a la izquierda y arriba Return True ElseIf x_sel - x_cur = -2 AndAlso y_sel - y_cur = -2 Then Dim pnl As Panel = DirectCast(board(x_sel + 1, y_sel + 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 2 Then 'Revisa si el movimiento es dos a la izquierda y arriba y el corrector que es uno a la izquierda y uno arriba is al jugador 2 corrector pnl.Controls.Clear() Return True Else Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 6 | 11
Return False End If ElseIf x_sel - x_cur = 1 AndAlso y_sel - y_cur = -1 Then 'Revisa si el movimiento es uno a la derecha y arriba Return True ElseIf x_sel - x_cur = 2 AndAlso y_sel - y_cur = -2 Then 'Revisa su ek moviemiento es dos a la derecha y arriba Dim pnl As Panel = DirectCast(board(x_sel - 1, y_sel + 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 2 Then 'Revisa si el moviemiento es dos a la izquierda y arriba y que el corrector que es uno a las derechay uno arriba es al jugador 2 checker pnl.Controls.Clear() Return True Else Return False End If
'------------------------------------------------------------ ------------------------------ '-------------------------Estos movientos son para el rey---- ---------------------- '------------------------------------------------------------ ------------------------------ ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = -1 AndAlso y_sel - y_cur = 1 Then 'Primero revisa si el movimiento es uno a la derecha y abajo Return True ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = -2 AndAlso y_sel - y_cur = 2 Then Dim pnl As Panel = DirectCast(board(x_sel + 1, y_sel - 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 2 Then 'Revisa si el movimiento es dos a la izqueirda y abajo y que el corrector es uno izquierda abajo es al jugador 2 checker pnl.Controls.Clear() Return True Else Return False End If ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = 1 AndAlso y_sel - y_cur = 1 Then 'Revisa si el movimiento es unos a la derecha y abajo Return True ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = 2 AndAlso y_sel - y_cur = 2 Then 'Revisa si el movimiento es dos a la derecha y abajo Dim pnl As Panel = DirectCast(board(x_sel - 1, y_sel - 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 2 Then 'Revisa si el mivimiento es dos a la izquierda y abajo y que el corrector es uno izquierda y uno arriba es al jugador 2 checker pnl.Controls.Clear() Return True Else Return False End If Else Return False Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 7 | 11
End If ElseIf moving_checker.Player = 2 AndAlso Not (p1turn) Then If x_sel - x_cur = -1 AndAlso y_sel - y_cur = 1 Then 'Primero revisa si el movimiento es uno a la izquierda y arriba Return True ElseIf x_sel - x_cur = -2 AndAlso y_sel - y_cur = 2 Then Dim pnl As Panel = DirectCast(board(x_sel + 1, y_sel - 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 1 Then 'Revisa si el movimiento es dos a la izquierda y arriba y que el corrector es uno a la izquierda y unno arriba para el jugador 2 checker pnl.Controls.Clear() Return True Else Return False End If ElseIf x_sel - x_cur = 1 AndAlso y_sel - y_cur = 1 Then 'Revisa si el moviemiento es uno a la derecha y abajo Return True ElseIf x_sel - x_cur = 2 AndAlso y_sel - y_cur = 2 Then 'Check if the move is two to the right and down Dim pnl As Panel = DirectCast(board(x_sel - 1, y_sel - 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 1 Then 'Check if the move is two to the left and up and that the checker that's one left/one up is a player 2 checker pnl.Controls.Clear() Return True Else Return False End If
'------------------------------------------------------------ ------------------------------ '-------------------------These next moves apply only to the king-------------------------- '------------------------------------------------------------ ------------------------------ ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = -1 AndAlso y_sel - y_cur = -1 Then 'First check if the move is one to the left and down Return True ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = -2 AndAlso y_sel - y_cur = -2 Then Dim pnl As Panel = DirectCast(board(x_sel + 1, y_sel + 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 1 Then 'Revisa si el movimiento es dos a la izquierda y arriba para el corrector que es uno a la izquierda y uno abajo para el jugador 2 checker pnl.Controls.Clear() Return True Else Return False End If ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = 1 AndAlso y_sel - y_cur = -1 Then 'Revisa si el movimiento es uno a la derecha y abajo Return True Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 8 | 11
ElseIf moving_checker.IsKing AndAlso x_sel - x_cur = 2 AndAlso y_sel - y_cur = -2 Then 'Revisa si el movimiento es dos a la derecha y abajo Dim pnl As Panel = DirectCast(board(x_sel - 1, y_sel + 1), Panel) If pnl.Controls.Count > -1 AndAlso DirectCast(pnl.Controls(0), Checker).Player = 1 Then 'revisa si el movimiento es dos a la izquierda y abajo y que el corrector es uno izquierda y uno arriba es al jugador 2 checker pnl.Controls.Clear() Return True Else Return False End If Else Return False End If Else Return False End If Else Return False End If
End Function
Private Sub MoveChecker(ByVal moving_checker As Checker, ByVal pnl_to_move_to As Panel) 'Deseleccionar el movimiento checker moving_checker.IsSelected = False
'Limpia los controles del viejo panel Dim moving_from_pnl As Panel = DirectCast(moving_checker.Parent, Panel) moving_from_pnl.Controls.Clear()
'Aade el correctos al nuevo panel pnl_to_move_to.Controls.Add(moving_checker)
'Obten y diminsion para ver si deberiamos hacerlo rey For x As Integer = 0 To board.GetUpperBound(0) For y As Integer = 0 To board.GetUpperBound(1) If board(x, y) Is pnl_to_move_to Then If moving_checker.Player = 1 AndAlso y = 0 Then moving_checker.IsKing = True ElseIf moving_checker.Player = 2 AndAlso y = 7 Then moving_checker.IsKing = True End If Exit For End If Next Next
'es el turno de otra persona p1turn = Not (p1turn)
'Establece selected_checker para nada selected_checker = Nothing
'Revisa si hay un winner chicken dinner al ganador Call CheckWin() End Sub
Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 9 | 11
Private Sub CheckWin() Dim p1_count As Integer = 0 Dim p2_count As Integer = 0
'Recorrer el tablero For x As Integer = 0 To board.GetUpperBound(0) For y As Integer = 0 To board.GetUpperBound(1) 'Revisa si el panel tiene un corrector If board(x, y).Controls.Count > 0 Then 'Revisar si el corrector es p1 o p2 Dim check As Checker = DirectCast(board(x, y).Controls(0), Checker)
If check.Player = 1 Then p1_count += 1 ElseIf check.Player = 2 Then p2_count += 1 End If End If Next Next
'Revisar si p1 o p2 is 0 If p1_count = 0 Then MessageBox.Show("Player2 wins!")
Call NewGame() ElseIf p2_count = 0 Then MessageBox.Show("Player1 wins!")
Call NewGame() End If
End Sub
Private Sub NewGame() Me.Controls.Clear()
Call Load_Board() Call Load_Checkers()
p1turn = True
End Sub
End Class
Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 10 | 11
Checker.vb Option Strict On Option Explicit On Public Class JuegodeDamas Inherits Control
Private king As Boolean Public Property IsKing() As Boolean Get Return king End Get Set(ByVal value As Boolean) king = value End Set End Property
Private selected As Boolean Public Property IsSelected() As Boolean Get Return selected End Get Set(ByVal value As Boolean) selected = value End Set End Property
Private _player As Integer Public Property Player() As Integer Get Return _player End Get Set(ByVal value As Integer) _player = value End Set End Property
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(e)
Dim path As New Drawing2D.GraphicsPath Dim rect As Rectangle = Me.DisplayRectangle
'Desinflar para dibujar el borde rect.Inflate(-1, -1)
'Dibujar el tablero e.Graphics.DrawEllipse(New Pen(Brushes.Black, 3), rect)
'Desinfle rellenar el corrector rect.Inflate(-1, -1)
'Llena el crculo e.Graphics.FillEllipse(New SolidBrush(Me.BackColor), rect)
'Inflar volver al tamao original rect.Inflate(2, 2)
'Aadir la elipse al trazado de grficos path.AddEllipse(rect)
Programacin Digital | Vctor Hernan Snchez Chirinos
P g i n a 11 | 11
'Establecer la regin Me.Region = New Region(path)
'Si se trata de un rey, a continuacin, dibuje una 'k' en l If king AndAlso Me.BackColor <> Color.Black Then e.Graphics.DrawString("K", Me.Font, Brushes.Black, New PointF(CSng(Me.Width / 2 - Me.FontHeight / 2), CSng(Me.Height / 2 - Me.FontHeight / 2))) ElseIf king AndAlso Me.BackColor = Color.Black Then e.Graphics.DrawString("K", Me.Font, Brushes.White, New PointF(CSng(Me.Width / 2 - Me.FontHeight / 2), CSng(Me.Height / 2 - Me.FontHeight / 2))) End If
If IsSelected Then Dim pnl As Panel = DirectCast(Me.Parent, Panel) pnl.BorderStyle = BorderStyle.Fixed3D Else Dim pnl As Panel = DirectCast(Me.Parent, Panel) pnl.BorderStyle = BorderStyle.FixedSingle End If End Sub