Desarrollo de Juegos de Tablero (8):
Aplicación Reglas y como programarlas
En este artículo explicaré como aplicar reglas y programarlas en el juego de tablero que estamos desarrollando. Para explicar la forma de programarlo, el juego va a tener unas reglas sencillas, así facilitará entender la forma de programarlo y en el futuro se podrá ampliar con toda la complejidad que queramos. Las reglas a programar serian las siguiente:
Empezamos:- Cada vez que un jugador caiga en una casilla, elige una carta de "suerte", y ejecuta lo que diga la carta. Hay 5 cartas de suerte:Tres de las cartas son de movimiento, osea avanzamos o retrocedemos un numero de casillas que indique. Y dos cartas son para los puntos de Vida, nos da puntos o nos lo quita.-Si por una carta de suerte, nos trasladamos a otra casilla, no cogeremos ninguna carta, pasando el turno al siguiente jugador.
1) Tenemos un archivo texto donde con varias secciones donde vamos a guardar:
Sección: [reglas casillas][/reglas casillas]
Contiene la información de lo que hay en la casilla. En este caso solo tenemos "coger una carta de suerte", y lo indicamos como "cartasuerte".
[reglas casillas]
1|cartasuerte
2|cartasuerte
....[/reglas casillas]
Nota: Si tuvieramos varias "barajas" de cartas o distintas opciones, lo indicaríamos.
Sección: [cartasuerte][/cartasuerte]
En esta sección definimos cada "carta": su texto, acción a realizar, y valor numérico para indicar número de casillas o puntos a sumar o restar:
2) Programas una nueva clase "Regla", que será la encargada de leer las reglas,
- [cartasuerte]
- Viento a favor !!! avanzas 5 casillas |avanza|5
- Viento en contra :( retrocede 2 casillas |retrocede|2
- Llueve y hace mal tiempo :( retrocede 1 casilla|retrocede|1
- Consigues Pescar, ganas 10 puntos de vida|puntosVida|10
- Pierdes mucha agua potable, pierdes 5 puntos de vida|puntosVida|-5
- [/cartasuerte]
Private lineasReglas As String[]Private ListaCartaSuerte As String[]
Public rutaCartas As String = "Reglas/CartasDeSuerte.txt"
Public Sub _new()
cargaCartasSuerte()cargaReglas()
End
Public Sub cargaCartasSuerte()
Dim contenido As StringDim datosfichero As String
contenido = File.Load(rutaCartas)'las cartas vienen definida por:"texto|accion|puntuacion"datosfichero = Between(contenido, "[cartasuerte]", "[/cartasuerte]")ListaCartaSuerte = Split(datosfichero, "\n", "", True)
End
Public Sub cargaReglas()
Dim contenido As StringDim datosfichero As String
contenido = File.Load(rutaCartas)datosfichero = Between(contenido, "[reglas casillas]]", "[/reglas casillas]")lineasReglas = Split(datosfichero, "\n", "", True)
End
y ejecutarlas cuando un jugador llegue a la casilla.
Public Sub llega(jug As Jugador, casilla As Integer)
Dim accion As String
accion = Split(lineasReglas[casilla - 1], "|")[1] 'leo la parte de accion del jugador
jug.CumpliendoRegla = TrueejecutaRegla(jug, accion)
End
Public Sub ejecutaRegla(j As Jugador, accion As String)
Select Case accionCase "cartasuerte"AccionCartaSuerte(j)Case "pregunta"AccionCartaPregunta(j)Default'no hacer nada...End Select
End
Private Sub AccionCartaSuerte(j As Jugador)
Dim elegida As Integer
Dim carta As String[] 'el valor 0 continee el texto, y el valor 1 contiene la puntuacion
elegida = Int(Rnd(0, ListaCartaSuerte.count))Print elegida, ListaCartaSuerte[elegida]carta = Split(ListaCartaSuerte[elegida], "|")
Message.Info(carta[0])
Select Case carta[1]
Case "avanza"If (j.CasillaDondeEstoy + Val(carta[2]) - 1) > lineasReglas.count Thenj.Mueve(lineasReglas.count)Elsej.Mueve(j.CasillaDondeEstoy + Val(carta[2]) - 1)EndifCase "retrocede"If j.CasillaDondeEstoy - Val(carta[2]) - 1 > 0 Thenj.Mueve(j.CasillaDondeEstoy - Val(carta[2]) - 1)Elsej.Mueve(0)EndifCase "puntosVida"j.puntosVida += Val(carta[2])
End Select
End
3) Modificamos la clase Control de Partida, para llamar una instancia de la clase regla, para llegue el jugador a una casilla:
Nota:Public Sub Observador_LLegue(jug As Object, NumeroCasilla As Integer)Dim mensaje As String'Llega a una casillaIf jug.cumpliendoRegla = False Then'no esta cumpliendo ninguna regla, tiene que leerlareglasTablero.llega(jug, NumeroCasilla)Else'ha llegado a una casilla, pero porque ha cumplido una regla, no hay que ejecutar otra reglajug.cumpliendoRegla = FalseEndifEnd
La nueva propiedad "cumpliendoRegla" de la clase jugador, nos facilita saber si el jugador a llegado a la casilla por una desplazamiento ordenado por los dados o por si ha llegado cumpliendo alguna regla.
Aqui os dejo un video para ver tanto el código como la ejecución del programa:
Enlace del código fuente: alojado en google drive
Ya prácticamente esta el 90% del juego de tablero....
En el próximo articulo veremos como añadir un "enemigo" al juego. También nos falta añadir detalles gráficos como una barra de puntos de cada jugador, mejora del formulario de mensajes, implementar el juego "por turnos" y un dado aleatorio.
Saludos.
Julio