CC3001 - Algoritmos y Estructuras de Datos Tarea 4: Árboles de Expresión Profesores: Patricio Poblete (Sección 1) - Nelson Baloian (Sección 2) Fecha de entrega: 2 de Abril, a las 23:59 El juego “Barredor de minas” o mines sweeper consiste en ubicar la posición de las minas en un campo minado sin hacer explotar ninguna. El campo minado se representa por una matriz de M×N posiciones en los que puede haber o no una mina. En el computador se muestra una ventana con un cuadriculado que representa el campo minado (ver figura) donde al principio todas las posiciones están ocultas. El usuario puede abrir una posición haciendo click con el mouse sobre ésta. Si en el lugar que el usuario destapa había una bomba, el programa termina el juego ahí. Si no, entonces abre el lugar y cuenta el número de bombas que hay en las posiciones vecinas (8). Si este número no es cero entonces el programa pone este número en la posición y espera la siguiente jugada del usuario. Si es cero, no pone nada pero para cada posición vecina se cuentan las vecinas y se procede recursivamente. Fig. 1: Juego de Mines Sweeper (barredor de minas) Este juego, como casi todos, se puede ganar o perder. El jugador gana cuando ha destapado todas las posiciones que no contienen una bomba, y pierde cuando destapa una bomba. En ambos casos el juego se detiene, indicando el resultado. Una funcionalidad muy útil que tiene este juego es que permite marcar posiciones sin destaparlas si el usuario estima que ahí se encuentra una bomba. Para eso, el usuario debe clickear sobre la posición con el botón derecho del mouse. Si el usuario cambia de opinión (piensa que no hay una bomba en esa posición) puede clickear de nuevo con el botón derecho sobre la celda y la marca se borra. En esta tarea usted debe implementar la lógica de este juego de modo que un usuario pueda jugarlo. Para ello usted puede usar una clase llamada Campo que cuenta con las siguientes funciones: Campo(int x, int y): constructor de la clase, inicializa un objeto con x (ancho) por y (alto) elementos y lo muestra en una ventana. actualizar(int[][]): recibe una matriz que debe tener las mismas dimensiones con las cuales fue creado el objeto y muestra el campo según las siguientes reglas: Si en un elemento de la matriz que se pasa como parámetro hay un -1, entonces muestra la posición respectiva del campo como “oculta”, es decir, la celda correspondiente aparece de color gris claro. Si en un elemento de la matriz que se pasa como parámetro hay un 0, entonces muestra la posición respectiva del campo como “despejada”, es decir, la celda correspondiente aparece de color blanco. - - Si en un elemento de la matriz que se pasa como parámetro hay un número entre 1 y 8, entonces muestra la posición respectiva del campo como “despejada”, es decir, la celda correspondiente aparece de color blanco pero se muestra el número, el cual corresponde a las bombas que hay en las celdas vecinas. Si en un elemento de la matriz que se pasa como parámetro hay un número 9 entonces muestra la posición respectiva del campo como “oculta”, es decir, la celda correspondiente aparece de color gris claro pero con una bandera sobre ella. Una vez que se crea un objeto de la clase Campo, el programa espera que el usuario haga un click sobre una de las celdas de la ventana, ya sea con el botón derecho o izquierdo del mouse. Cada vez que esto suceda se llamará a un método public static void oprimido(int x, int y, int z) de la clase Tarea1. Los dos primeros parámetros son respectivamente las coordenadas x e y de la celda sobre la cual se ha hecho click, enumerando desde 0 (desde la esquina superior izquierda). El tercer parámetro indica el botón del mouse con el que el usuario hizo click (1 es el botón izquierdo, 2 es el central, y 3 el derecho). Es en este método donde usted debe programar la lógica del juego. Como base, se incluye una versión del archivo Tarea1.java que usted debe modificar, agregando la lógica del juego. No necesita modificar el archivo Campo.java. Su programa debe empezar por preguntar las dimensiones que debe tener el campo minado, y luego por la cantidad de minas que el programa se encargará de repartir aleatoriamente entre las posiciones del campo (en java la función Math.random() genera un número aleatorio entre 0 al 0.99999). Su programa debe asegurar que hay exactamente la cantidad de minas que introdujo el usuario. Nota: para que las clases Tarea1 y Campo funcionen correctamente debe ponerlas en el mismo directorio junto con el archivo flag.png.