Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



martes, 6 de enero de 2015

Desarrollo de Juegos de Tablero (1): Movimientos de fichas en tableros de rutas

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