Desarrollo de Juegos de Tablero (1): Movimientos de fichas en tableros de rutas
Voy a dedicar varias entradas del blog a la programación de un juego de tablero. Y esta entrada va dedicada a como mover las fichas por un tablero.
Hay juegos donde los movimientos son bastante simples de programar, ya que consisten en cambiar la fila y/o de columna, mediante movimientos diagonales, horizontales o combinando ambos. Un ejemplo de ello son los juegos de damas o ajedrez:
Pero para otros juegos donde los movimientos de las piezas son caminos o rutas a seguir, el problema se complica:
Juego de la Oca: el camino de la fichas es una espiral |
Tablero de un juego de carreras de coches |
En estos casos, cada casilla tiene una coordenada donde se pueden colocar la pieza (o varias piezas). Incluso dependiendo de la ficha que usemos (un coche, una nave espacial) una dirección hacia donde avanza.
En el siguiente vídeo podéis ver como uso un pequeño programa para:
1) Tomar datos del tablero, para saber donde esta cada casilla donde irán colocada cada ficha del juego.
2) Cargar los datos del tablero y poder mover una pieza por este.
El código fuente lo podéis descargar al final del articulo.
Lo más interesante del código es la clase "Pieza":
- Mediante su constructor ( _new() ) que recibe el nombre del archivo donde estan los datos de las casillas y posiciones, el picturebox que usa como ficha que se va a desplazar, y el picturebox que contiene el tablero actual. Este médoto se encarga de cargar la información y poner la pieza en la casilla "0"
- Método Mueve(): traslada la posición de la ficha a una casilla indicada,
- Método recoretablero(): mueve la ficha por todo el recorrido del tablero, osea por todas las casillas.
Descripción del código de la clase Pieza:
'
Gambas class file
Private
hcoordenadas
As
String[]
Private
picttmp
As
Picturebox
Private
hptableroActual
As
PictureBox
Private
TableroOriginalNombre
As
String
Private
TableroOriginalAncho
As
Integer
Private
TableroOriginalAlto
As
Integer
Private
TableroOriginalX
As
Integer
Private
TableroOriginalY
As
Integer
Property
Posicion
As
Integer
'devuelve
la casilla donde esta la pieza
Private
hposicion
As
Integer
Public
Sub
_new(fichero
As
String,
p
As
PictureBox,
ptablero
As
PictureBox)
Dim
contenido
As
String
Dim
datosfichero
As
String
Dim
arrayDatosFichero
As
String[]
'tratamiento
de fichero
contenido
=
File.Load(fichero)
datosfichero
=
Between(contenido,
"[Tablero]",
"[/Tablero]")
datosfichero
=
Replace$(datosfichero,
"\n",
"")
arrayDatosFichero
=
Split(datosfichero,
"|")
TableroOriginalNombre
=
arrayDatosFichero[0]
TableroOriginalAncho
=
arrayDatosFichero[1]
TableroOriginalAlto
=
arrayDatosFichero[2]
TableroOriginalX
=
arrayDatosFichero[3]
TableroOriginalY
=
arrayDatosFichero[4]
hcoordenadas
=
Split(Between(contenido,
"[casillas]",
"[/casillas]"),
"\n",
"",
True)
picttmp
=
p
hptableroActual
=
ptablero
hposicion
=
0
dibuja(hposicion)
End
Public
Sub
dibuja(casilla
As
Integer)
'aplicando
coeficientes del tablero actual frente al que se guardaron los datos
picttmp.x
=
(Split(hcoordenadas[casilla],
"|")[1]
-
TableroOriginalX)
*
hptableroActual.w
/
TableroOriginalAncho
+
hptableroActual.x
picttmp.y
=
(Split(hcoordenadas[casilla],
"|")[2]
-
TableroOriginaly)
*
hptableroActual.h
/
TableroOriginalAlto
+
hptableroActual.y
End
Public
Sub
MUEVE(CASILLA
As
Integer)
Dim
casillafinalX
As
Integer
Dim
casillafinaly
As
Integer
Dim
casillaInicialX
As
Integer
Dim
casillaInicialY
As
Integer
Dim
difx
As
Float
Dim
dify
As
Float
Dim
a
As
Integer
Dim
puntos
As
Integer
=
10
'para
ver el movimiento de la pieza poco a poco
If
casilla
<>
0
Then
casillaInicialX
=
(Split(hcoordenadas[casilla
-
1],
"|")[1]
-
TableroOriginalX)
*
hptableroActual.w
/
TableroOriginalAncho
+
hptableroActual.x
casillaInicialY
=
(Split(hcoordenadas[casilla
-
1],
"|")[2]
-
TableroOriginalY)
*
hptableroActual.h
/
TableroOriginalAlto
+
hptableroActual.y
Endif
casillafinalX
=
(Split(hcoordenadas[casilla],
"|")[1]
-
TableroOriginalX)
*
hptableroActual.w
/
TableroOriginalAncho
+
hptableroActual.x
casillafinalY
=
(Split(hcoordenadas[casilla],
"|")[2]
-
TableroOriginaly)
*
hptableroActual.h
/
TableroOriginalAlto
+
hptableroActual.y
difx
=
(casillafinalX
-
casillaInicialX)
/
puntos
dify
=
(casillafinaly
-
casillaInicialy)
/
puntos
For
a
=
1
To
puntos
picttmp.x
=
casillaInicialX
+
difx
*
a
picttmp.y
=
casillaInicialY
+
dify
*
a
Wait
0.02
Next
'
Print "fichero:", (Split(hcoordenadas[casilla], "|")[1]),
(Split(hcoordenadas[casilla], "|")[2])
'
Print "pieza:", picttmp.X, picttmp.Y
'
Print "casilla final:", casillafinalX, casillafinaly
picttmp.X
=
casillafinalX
picttmp.y
=
casillafinaly
hposicion
=
casilla
End
Public
Sub
recorretablero()
Dim
c
As
String
Dim
contador
As
Integer
For
Each
c
In
hcoordenadas
contador
=
Split(c,
"|")[0]
MUEVE(contador)
Wait
0.5
Next
End
Private
Function
Between(Datos
As
String,
Cadena1
As
String,
Cadena2
As
String)
As
String
Dim
iinf
As
Integer
Dim
isup
As
Integer
iinf
=
InStr(Datos,
Cadena1)
+
Len(Cadena1)
isup
=
InStr(Datos,
Cadena2,
iinf)
Return
Mid(Datos,
iinf,
isup
-
iinf)
End
Private
Function
Posicion_Read()
As
Integer
Return
hposicion
End
Private
Sub
Posicion_Write(Value
As
Integer)
hposicion
=
value
End
El formulario principal se encarga de:
1) Cargar el dibujo del tablero
2) Definir y guardar los datos de la ruta que seguirán las piezas
3) Cargar datos de una ruta (definida en el paso 2)
4) Mover la ficha a una casilla indicada
5) Recorrer con la ficha el tablero (para ver la ruta completa que seguirá la ficha)
6) Mostrar en que casilla esta nuestra ficha.
Este es el código fuente:
'
Gambas class file
Public
definir
As
Boolean
'define
Public
numeroCasilla
As
Integer
'contador para indicar la casilla donde esta el puntero del raton
Public
peon
As
Pieza
Public
Sub
_new()
End
Public
Sub
Form_Open()
PictureBoxTablero.tag
=
"pirata.jpg"
PictureBoxTablero.Picture
=
Picture.Load(PictureBoxTablero.tag)
End
Public
Sub
ButtonDefinirRuta_Click()
definir
=
True
numeroCasilla
=
0
TextAreaDatosRutas.text
=
""
TextAreaDatosRutas.text
=
"[Tablero]\n"
TextAreaDatosRutas.text
&=
PictureBoxTablero.tag
&
"|"
&
PictureBoxTablero.w
&
"|"
&
PictureBoxTablero.h
&
"|"
&
PictureBoxTablero.x
&
"|"
&
PictureBoxTablero.y
&
"\n"
TextAreaDatosRutas.text
&=
"[/Tablero]\n"
TextAreaDatosRutas.text
&=
"[casillas]\n"
End
Public
Sub
PictureBoxTablero_MouseDown()
If
definir
=
True
Then
TextAreaDatosRutas.text
&=
Str$(numeroCasilla)
&
"|"
&
Str$(Mouse.x)
&
"|"
&
Str$(Mouse.y)
&
"\n"
numeroCasilla
+=
1
SpinBoxDefinirPosicion.value
+=
1
Endif
End
Public
Sub
ButtonGuardarRuta_Click()
Dialog.Filter
=
["*.RutaTablero",
"Rutas
en Tableros"]
Dialog.path
=
File.BaseName(PictureBoxTablero.tag)
&
".RutaTablero"
If
Not
Dialog.SaveFile()
Then
TextAreaDatosRutas.text
&=
"[/casillas]"
File.Save(Dialog.Path,
TextAreaDatosRutas.text)
TextAreaDatosRutas.text
=
""
definir
=
False
Endif
End
Public
Sub
ButtonLeerCoordenadas_Click()
Dialog.Filter
=
["*.RutaTablero",
"Rutas
en Tableros"]
If
Not
Dialog.OpenFile()
Then
Peon
=
New
Pieza(Dialog.Path,
PictureBoxPeonTablero,
PictureBoxTablero)
Endif
End
Public
Sub
ButtonDesplazaPorTablero_Click()
peon.mueve(SpinBoxIrA.value
-
1)
End
Public
Sub
ButtonRecorreTablero_Click()
peon.recorretablero()
End
Public
Sub
Form_Close()
peon
=
Null
Wait
0.3
End
Public
Sub
ButtonCambiarTablero_Click()
Dialog.Filter
=
["*.png;*.jpg;*.jpeg;*.bmp",
"Picture
files"]
If
Not
Dialog.OpenFile()
Then
PictureBoxTablero.tag
=
Dialog.Path
PictureBoxTablero.Picture
=
Picture.Load(PictureBoxTablero.tag)
Endif
End
Public
Sub
ButtonPosicionFicha_Click()
Message.Info("La
pieza esta en la casilla: "
&
Str$(peon.Posicion
+
1))
End
Enlace de descarga: enlace a google drive
En el siguiente articulo veremos como aplicar reglas cuando cae en una determinada casilla (preguntas, saltos a otra parte del tablero, etc).
Referencias de tableros:
http://www.aulapt.org/2014/04/05/juego-de-cartas-reforzamos-las-medidas-de-longitud/
http://kleuteridee.nl/spelletjes/
http://www.mamaestudianteyamadecasa.com/2014/03/diy-increible-juego-de-mesa-educativo.html
http://labsk.net/index.php?topic=135416.0