Вы находитесь на странице: 1из 12

PROGRAMACIN DIGITAL

Vctor Hernan Snchez Chirinos


3333


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

board(x, y).Controls.Add(check)
AddHandler check.Click, AddressOf checker_click

x += 2
Next

Next
End Sub

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


End Class

Вам также может понравиться