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:



viernes, 4 de octubre de 2013

Juego Conecta 4: Paso a Paso (2). La Clase ClassTablero(1)

Juego Conecta 4:

 Paso a Paso (2). La Clase ClassTablero(1)


En esta entrada iré comentando las clases principales y su código.
Se va a comentar el código de la version 0.0.4 (se encuentra en la entrada http://jsbsan.blogspot.com.es/2013/09/juego-conecta4-inteligencia-artificial.html , al final de la entrada en Notas: Actualizaciones 3/10/2013).



Empezamos con la clase:
ClassTablero.
Propiedades:
El tablero lo vamos a definir como una matriz de 7x7 elementos, y usaremos un array de dos dimensiones del tipo integer, para manejarlo en el programa. Lo definimos como la propiedad "casillas":



- Como detalle importante, la propiedad se define como Integer[], pero la variable privada hcasillas hay que definirla como de dos dimensiones y con el tamaño de la matriz: New Integer[7,7]

Métodos:
El método _New: 
Es el "método constructor" y  va a ser llamado cada vez que instanciamos una nueva clase ClassTablero.


- Como veis, en la definición tiene un parámetro opcional, que nos va a permitir que el método se comporte de distinta forma si le pasamos un argumento ("t" es otro objeto del tipo ClassTablero) o si no le pasamos ningún argumento (toma valor nulo).
Si el no hay argumento pasado, "t" toma el valor Null y hacemos que todos los valores de las casillas se pongan a 0. Esto indica que la casilla esta vacía. Para recorrer las casillas una a una, usamos dos bucles For...Next.
En caso contrario, que se haya pasado argumento, lo que se hace es copiar los valores del objeto "t" a la variable interna hcasillas, (que es la que usa la propiedad casillas)
Con esto conseguimos que este método nos sirva tanto para iniciar un tablero en blanco (complentamente vacio) como que nos permita copiar un tablero que nos pasen como argumento.

El método muestra:
Incialmente este médodo lo diseñe para mostar el estado del tablero en la consola (por eso hay tantas ordenes print comentadas). Pero luego lo use para que me devolviera el array de las casillas.


El método copia:
Sirve para devolver una copia de las casillas del actual objeto., Este método esta en des huso, porque su función la puede hacer también el uso del constructor _New,



El método insertaficha:
Es el encargado de colocar la ficha en el tablero, indicándole como argumentos la columna donde hay que colocar la ficha y el jugador al que pertenece. El se encarga de comprobar cual es la primera casilla de la columna que este vacia y cuando la encuentra, asigna el valor de la casilla  al jugador.



- Es importante que veais cual es el criterio seguido para insertar una ficha. Lo podemos ver en estos esquemas:
Matriz [ i, j ]: sentido de la caida de una ficha
Matriz [i , j]: ejemplo del llenado de una columna


Como podéis ver el en código, el dato de  la columna esta en el 2º termino de la matriz. Y es el primer termino de la matriz es el que va tomando los valores empezando desde el 6 hasta llegar a 0, buscando la celda que esté vacía (cuyo valor sea 0). 
Si la encuentra vacía, cambia el valor de la celda al jugador dado, y además cambia la variable ok a True, saliendo del bucle (orden Break) y devolviendo el valor de la variable ok  (Return ok).
Como veis el "relleno" matemático de las columnas del  tablero se va haciendo de derecha a izquierda.

Nota:
Como veis el tablero esta "girado" 90º hacia la izquierda, y esto es importante saberlo, para tenerlo en cuenta a la hora de representarlo gráficamente.

¿para que se usa la variable "ok"?
Si una columna esta llena,  la variable "ok", mantiene su valor inicial (definida como False), y devolverá False, esto nos va a indicar que no ha sido posible poner una ficha en dicha columna.
Si esta función no devolviera ningún valor, no sabríamos si ha sido posible insertar la ficha en el tablero.

Nota:
Como veis el tablero esta "girado" 90º hacia la izquierda, y esto es importante saberlo, para tenerlo encuenta a la hora de representarlo gráficamente.

El método deshacer:
Deshace un movimiento (quita la ficha) sabiendo la columna donde fue insertada.


-Mediante un bucle For...Next, va recorriendo la columna de izquierda a derecha (i=0,1,2,3...6), hasta encontrar una casilla que no este vacia (<>0) , y la deja vacía (me.casillas[i,columas]=0).
Una ver hecho esto, sale del bucle y del método.


Método GameOver()
Este método se encarga de indicar si se ha terminado la partida. La partida termina cuando uno de los dos jugadores ha ganado o se ha producido tablas.


- Primero lo que hace es comprobar si hay ganador que se sea igual a a "0", comparando la salida del  método .ganador() con "0". Si es asñi hace un recorrido por el tablero, para averiguar si hay casillas vacias, si es asi , devuelve "False"  , para indicar que no hay ganador.
En el caso de que haya algun ganador (1 o -1) devuelve TRUE



El método jugadasPosibles()
Es el método que nos devuelve las jugadas que son posible.





 Esto lo hace, comprobando la última fila del tablero. Como lo tenemos girado 90º matemáticamente, es la siguiente:

Las jugadas que sean posibles, se pueden devolver con un array integer[] (de una dimensión), ya que indicaría las columnas libres, que pueden ser usadas para insertar una ficha.

En la próxima entrada veremos los métodos :

  • ganador()
  • comprueba_linea()
  • comprueba_linea_Cuadro()
  • comparaCuaternaElemento()

Saludos
 
Nota:
Diferencia entre un parámetro y un argumento:
Parámetros
  • Un parámetro representa un valor que el procedimiento espera que se transfiera cuando es llamado.  La declaración del procedimiento define sus parámetros.
  • Cuando se define un procedimiento Function o Sub, se especifica una lista de parámetros entre paréntesis que va inmediatamente después del nombre de procedimiento. 
Argumentos
  • Un argumento representa el valor que se transfiere a un parámetro del procedimiento cuando se llama al procedimiento. El código de llamada proporciona los argumentos cuando llama al procedimiento.
  • Cuando se llama al procedimiento Function o Sub, se incluye una lista de argumentos entre paréntesis que van inmediatamente después del nombre del procedimiento. Cada argumento se corresponde con el parámetro situado en la misma posición de la lista.