[ Foro de C ]

probllema en buscaminas

29-Jun-2016 21:00
Invitado (andrea)
0 Respuestas

He de hacer un trabajo para la asignatura de sistemas informáticos y nos han mandado hacer un buscaminas, para ello nos han dado una serie de instrucciones y de funciones a las que nos debemos ceñir, el caso es que en este buscaminas(de 15x15) el tablero es circular (pongo el texto del profesor para que resulte claro)

El tablero del buscaminas se vuelve circular. Esto supone modificaciones a la
hora de descubrir casillas vac ??as y al calcular los valores que hay en cada celda
del tablero.
4Grado en Ingenier ??a: Electr ?
onica Industrial y Autom ?atica
Inform ?atica
Al descubrir las casillas vac ??as implica que si las casillas que se est ?an compro-
bando alrededor de una vac ??a est ?an fuera de los m ?argenes del se consideren
las del extremo contrario. Por ejemplo, si el usuario ha seleccionado la posi-
ci ?
on [0][0] del tablero y su valor es un 0, deben comprobarse las que tenga
adyacentes. Es decir, deber ??a comprobar las posiciones [-1][-1], [-1][0], [-1][1],
[0][-1],[0][0],[0][1],[1][-1],[1][0] y [1][1]. Las posiciones con valores negativos est ?an
fuera del teclado y originalmente no se consideraban, en este caso ser ?an equi-
valentes a las del extremo opuesto. Es decir, la posici ?on [-1][-1] pasar ??a a ser
[15][15], la [-1][0] ser ??a equivalente [15][0], la [0][-1] ser ??a [0][15]. Ocurrir ??a algo
similar en el extremo contrario, por ejemplo al explorar la posici ?on [15][15] con
esta modificaci ?
on se explorar ??an entre otras tambi ?en [0][0].
En cuanto a calcular los valores de las casillas, es decir el n ?
umero de bombas
cercanas tendr ?
a que tenerse en cuenta lo mismo. Cuando una casilla est ?e en
un extremo deben considerarse tambi ?en las bombas del extremo opuesto. Por
ejemplo si hay una bomba en la posici ?on [15][4] y otra en la [0][4] el valor a
almacenar en la casilla [0][3] ser ??a un 2.

para esto ya he hecho la funcion de comprobar minas cercanas para calcular el numero que ha de ir en las posiciones que no son una mina, pero a la hora de la funcion  seleccion_casilla no se como adaptarla a un tablero circular (la tengo hecha para un buscaminas ordinario)

os pongo la funcion de comprobar y la de seleccionar, gracias ante todo

//Función para calcular de cuántas minas está rodeada cada posición
int comprueba_minas_cercanas(int fila_selec, int columna_selec, int tablero_partida[FILAS][COLUMNAS]){

int contador_minas_cercanas = 0;

if (tablero_partida[fila_selec][columna_selec] == 9){
return -1;
}

//Comprueba si hay minas (menos en la fila 16 y columna 16)
if ((fila_selec<(FILAS - 1))&&(columna_selec<(COLUMNAS - 1))){
//Comprueba casilla abajo
if (tablero_partida[fila_selec + 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla derecha
if (tablero_partida[fila_selec][columna_selec + 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal abajo-derecha
if (tablero_partida[fila_selec + 1][columna_selec + 1] == 9)
contador_minas_cercanas++;

//Comprobamos si la columna de la izquierda es válida
if (columna_selec != 0){
// Comprueba casilla izquierda
if (tablero_partida[fila_selec][columna_selec - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal abajo-izquierda
if (tablero_partida[fila_selec + 1][columna_selec - 1] == 9)
contador_minas_cercanas++;

}else {
// Comprueba casilla izquierda
if (tablero_partida[fila_selec][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal abajo-izquierda
if (tablero_partida[fila_selec + 1][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
}

//Comprobamos si la fila de arriba es válida
if (fila_selec != 0){
//Comprueba casilla arriba
if (tablero_partida[fila_selec - 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-derecha
if (tablero_partida[fila_selec - 1][columna_selec + 1] == 9)
contador_minas_cercanas++;

//Comprobamos si la columna de la izquierda es válida
if (columna_selec != 0){
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[fila_selec - 1][columna_selec - 1] == 9)
contador_minas_cercanas++;
} else{
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[fila_selec- 1][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
}
} else{
//Comprueba casilla arriba
if (tablero_partida[FILAS - 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-derecha
if (tablero_partida[FILAS - 1][columna_selec + 1] == 9)
contador_minas_cercanas++;

//Comprobamos si la columna de la izquierda es válida
if (columna_selec != 0){
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[FILAS - 1][columna_selec - 1] == 9)
contador_minas_cercanas++;
}else{
if (tablero_partida[FILAS - 1][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
}

//Comprobamos si es la última fila y no es la última columna
if ((fila_selec == (FILAS - 1))&&(columna_selec != (COLUMNAS - 1))){
//Comprueba mina arriba
if (tablero_partida[fila_selec - 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla derecha
if (tablero_partida[fila_selec][columna_selec + 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-derecha
if (tablero_partida[fila_selec - 1][columna_selec + 1] == 9)
contador_minas_cercanas++;

//Comprobamos si la columna de la izquierda es válida
if (columna_selec != 0){
//Comprueba casilla izquierda
if (tablero_partida[fila_selec][columna_selec - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[fila_selec - 1][columna_selec - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal abajo-izquierda
if (tablero_partida[0][columna_selec - 1] == 9)
contador_minas_cercanas++;

}else {
//Comprueba casilla izquierda
if (tablero_partida[fila_selec][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[fila_selec - 1][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal abajo-izquierda
if (tablero_partida[0][COLUMNAS - 1] == 9)
contador_minas_cercanas++;
}
//Comprueba mina abajo
if (tablero_partida[0][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla abajo-derecha
if (tablero_partida[0][columna_selec + 1] == 9)
contador_minas_cercanas++;


}

//Comprobamos si es la última columna y no es la última fila
if ((columna_selec == (COLUMNAS - 1))&&(fila_selec != (FILAS - 1))){
//Comprueba casilla abajo
if (tablero_partida[fila_selec + 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla izquierda
if (tablero_partida[fila_selec][columna_selec - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal abajo-izquierda
if (tablero_partida[fila_selec + 1][columna_selec - 1] == 9)
contador_minas_cercanas++;

//Comprobamos si la fila de arriba es válida
if (fila_selec != 0){
//Comprobar casilla arriba
if (tablero_partida[fila_selec - 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[fila_selec - 1][columna_selec - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla derecha
if (tablero_partida[fila_selec][0] == 9)
contador_minas_cercanas++;
}else{
// Comprobar casilla arriba
if (tablero_partida[FILAS - 1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla diagonal arriba-izquierda
if (tablero_partida[FILAS - 1][columna_selec - 1] == 9)
contador_minas_cercanas++;
//Comprueba casilla derecha
if (tablero_partida[0][0] == 9)
contador_minas_cercanas++;
}

//Comprueba casilla diagonal abajo-derecha
if (tablero_partida[fila_selec + 1][0] == 9)
contador_minas_cercanas++;
if (fila_selec != 0){
//Comprueba casilla diagonal arriba-derecha
if (tablero_partida[fila_selec - 1][0] == 9)
contador_minas_cercanas++;
}else {
//Comprueba casilla diagonal arriba-derecha
if (tablero_partida[FILAS - 1][0] == 9)
contador_minas_cercanas++;
}
}

//Comprobamos si es el último elemento
if ((fila_selec == (FILAS - 1))&&(columna_selec == (COLUMNAS - 1))){
// Comprueba casilla arriba
if(tablero_partida[fila_selec-1][columna_selec] == 9)
contador_minas_cercanas++;
//Comprueba casilla a la izquierda
if(tablero_partida[fila_selec][columna_selec-1] == 9)
contador_minas_cercanas++;
// Comprobar casilla diagonal arriba-izquierda
if(tablero_partida[fila_selec-1][columna_selec-1] == 9)
contador_minas_cercanas++;
// Comprobar casilla diagonal arriba-derecha
if(tablero_partida[fila_selec-1][0] == 9)
contador_minas_cercanas++;
// Comprobar casilla diagonal abajo-izquierda
if(tablero_partida[0][columna_selec-1] == 9)
contador_minas_cercanas++;
// Comprobar casilla diagonal abajo
if(tablero_partida[0][columna_selec] == 9)
contador_minas_cercanas++;
//Comprobar casilla derecha
if(tablero_partida[fila_selec][0] == 9)
contador_minas_cercanas++;
// Comprobar casilla diagonal abajo-derecha
if(tablero_partida[0][0] == 9)
contador_minas_cercanas++;
}
return contador_minas_cercanas;
}



int seleccion_casilla(int tablero[FILAS][COLUMNAS], int movimientos[FILAS][COLUMNAS], int fila, int columna) {

int posicion_arriba = 0, posicion_arribaD = 0,
posicion_arribaI = 0, posicion_derecha = 0,
posicion_abajoD = 0, posicion_abajo = 0,
posicion_abajoI = 0, posicion_izquierda = 0,
i = 1, minascercanas = 0, esmina=0;


//En caso de que se pulse una mina hacemos un return -1
esmina=comprueba_minas_cercanas(fila - 1, columna - 1, tablero);

00 if (esmina == 1) {
return -1;
}
// Busca y actualiza el numero de minas que hay alrededor de la posicion que hemos pulsado
minascercanas = comprueba_minas_cercanas(fila - 1, columna - 1, tablero);

//En caso de que la posición seleccionada sea 0
if (minascercanas == 0) {

//Al valer 0 le damos el valor 200 para mas tarde cambiarlo a un 0 (ya que el 0 se cambia por un cuadrado)
movimientos[fila - 1][columna - 1] = 200;

//Todas filas y columnas menos las últimas
if ((fila < (FILAS-1)) && (columna < (COLUMNAS-1)))
{
// Comprueba mina abajo
posicion_abajo = comprueba_minas_cercanas((fila - 1 + i), (columna - 1), tablero);
if (posicion_debajo != -1)
{
if ((posicion_debajo == 0) && (movimientos[fila - 1 + i][columna - 1] != 200)) {
seleccion_casilla(tablero, movimientos, fila + i, columna);
}
else{
if (posicion_debajo == 0){
posicion_debajo = 200;
}
movimientos[fila - 1 + i][columna - 1] = posicion_debajo;
}
}

// Comprueba mina derecha
posicion_derecha = comprueba_minas_cercanas((fila - 1), (columna - 1 + i), tablero);
if (posicion_derecha != -1)
{
if ((posicion_derecha == 0) && (movimientos[fila - 1][columna - 1 + i] != 200)) {
seleccion_casilla(tablero, movimientos, fila, columna + i);
}
else {
if (posicion_derecha == 0) {
posicion_derecha = 200;
}
movimientos[fila - 1][columna - 1 + i] = posicion_derecha;
}
}
// Comprobar mina diagonal abajo-derecha
posicion_debajoD = comprueba_minas_cercanas((fila - 1 + i), (columna - 1 + i), tablero);
if (posicion_debajoD != -1)
{
if ((posicion_debajoD == 0) && (movimientos[fila - 1 + i][columna - 1 + i] != 200)) {
seleccion_casilla(tablero, movimientos, fila + i, columna + i);
}
else {
if (posicion_debajoD == 0) {
posicion_debajoD = 200;
}
movimientos[fila - 1 + i][columna - 1 + i] = posicion_debajoD;
}
}

// Comprueba si es primera columna
if (columna != 1)
{
// Comprueba mina diagonal abajo-izquierda
posicion_debajoI = comprueba_minas_cercanas((fila - 1 + i), (columna - 1 - i), tablero);
if (posicion_debajoI != -1)
{
if ((posicion_debajoI == 0) && (movimientos[fila - 1 + i][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila + i, columna - i);
}
else {
if (posicion_debajoI == 0) {
posicion_debajoI = 200;
}
movimientos[fila - 1 + i][columna - 1 - i] = posicion_debajoI;
}
}
// Comprobar mina a la izquierda
posicion_izquierda = comprueba_minas_cercanas((fila - 1), (columna - 1 - i), tablero);
if (posicion_izquierda != -1)
{
if ((posicion_izquierda == 0) && (movimientos[fila - 1][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila, columna - i);
}
else {
if (posicion_izquierda == 0) {
posicion_izquierda = 200;
}
movimientos[fila - 1][columna - 1 - i] = posicion_izquierda;
}
}
}
// Comprobar si las filas de arriba pueden comprobarse
if (fila != 1)
{
// Comprobar la mina de encima
posicion_arriba = comprueba_minas_cercanas((fila - 1 - i), (columna - 1), tablero);
if (posicion_arriba != -1)
{
if ((posicion_arriba == 0) && (movimientos[fila - 1 - i][columna - 1] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna);
}
else {
if (posicion_arriba == 0) {
posicion_arriba = 200;
}
movimientos[fila - 1 - i][columna - 1] = posicion_arriba;
}

}
if (columna < COLUMNAS) {
// Comprobar mina diagonal arriba-derecha
posicion_arribaD = comprueba_minas_cercanas((fila - 1 - i), (columna - 1 + i), tablero);
if (posicion_arribaD != -1)
{
if ((posicion_arribaD == 0) && (movimientos[fila - 1 - i][columna - 1 + i] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna + i);
}
else {
if (posicion_arribaD == 0) {
posicion_arribaD = 200;
}
movimientos[fila - 1 - i][columna - 1 + i] = posicion_arribaD;
}

}
}
}
// Comprobar si la columna de la izquierda es valida
if ((columna != 1) && (fila !=1))
{
// Comprobar mina diagonal arriba-izquierda
posicion_arribaI = comprueba_minas_cercanas((fila - 1 - i), (columna - 1 - i), tablero);
if (posicion_arribaI != -1)
{
if ((posicion_arribaI == 0) && (movimientos[fila - 1 - i][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna - i);
}
else {
if (posicion_arribaI == 0) {
posicion_arribaI = 200;
}
movimientos[fila - 1 - i][columna - 1 - i] = posicion_arribaI;
}

}
}
}

// Comprobar si es la ultima fila
if (fila == (FILAS) && columna != (COLUMNAS))
{
// Comprobar mina de encima
posicion_arriba = comprueba_minas_cercanas((fila - 1 - i), (columna - 1), tablero);
if (posicion_arriba != -1)
{
if ((posicion_arriba == 0) && (movimientos[fila - 1 - i][columna - 1] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna);
}
else {
if (posicion_arriba == 0) {
posicion_arriba = 200;
}
movimientos[fila - 1 - i][columna - 1] = posicion_arriba;
}

}
// Comprobar mina diagonal arriba-derecha
posicion_arribaD = comprueba_minas_cercanas((fila - 1 - i), (columna - 1 + i), tablero);
if (posicion_arribaD != -1)
{
if ((posicion_arribaD == 0) && (movimientos[fila - 1 - i][columna - 1 + i] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna + i);
}
else {
if (posicion_arribaD == 0) {
posicion_arribaD = 200;
}
movimientos[fila - 1 - i][columna - 1 + i] = posicion_arribaD;
}

}
// Comprueba mina derecha
posicion_derecha = comprueba_minas_cercanas((fila - 1), (columna - 1 + i), tablero);
if (posicion_derecha != -1)
{
if ((posicion_derecha == 0) && (movimientos[fila - 1][columna - 1 + i] != 200)) {
seleccion_casilla(tablero, movimientos, fila, columna + i);
}
else {
if (posicion_derecha == 0) {
posicion_derecha = 200;
}
movimientos[fila - 1][columna - 1 + i] = posicion_derecha;
}

}

if (columna != 1)
{
// Comprobar mina diagonal arriba-izquierda
posicion_arribaI = comprueba_minas_cercanas((fila - 1 - i), (columna - 1 - i), tablero);
if (posicion_arribaI != -1)
{
if ((posicion_arribaI == 0) && (movimientos[fila - 1 - i][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna - i);
}
else {
if (posicion_arribaI == 0) {
posicion_arribaI = 200;
}
movimientos[fila - 1 - i][columna - 1 - i] = posicion_arribaI;
}

}
// Comprobar mina a la izquierda
posicion_izquierda = comprueba_minas_cercanas((fila - 1), (columna - 1 - i), tablero);
if (posicion_izquierda != -1)
{
if ((posicion_izquierda == 0) && (movimientos[fila - 1][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila, columna - i);
}
else {
if (posicion_izquierda == 0) {
posicion_izquierda = 200;
}
movimientos[fila - 1][columna - 1 - i] = posicion_izquierda;
}

}
}
}
// Comprobar si es la ultima columna
if (columna == (COLUMNAS) && fila != (FILAS))
{
// Comprobar mina a la izquierda
posicion_izquierda = comprueba_minas_cercanas((fila - 1), (columna - 1 - i), tablero);
if (posicion_izquierda != -1)
{
if ((posicion_izquierda == 0) && (movimientos[fila - 1][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila, columna - i);
}
else {
if (posicion_izquierda == 0) {
posicion_izquierda = 200;
}
movimientos[fila - 1][columna - 1 - i] = posicion_izquierda;
}

}
// Comprobar mina abajo-izquierda
posicion_debajoI = comprueba_minas_cercanas((fila - 1 + i), (columna - 1 - i), tablero);
if (posicion_debajoI != -1)
{
if ((posicion_debajoI == 0) && (movimientos[fila - 1 + i][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila + i, columna - i);
}
else {
if (posicion_debajoI == 0) {
posicion_debajoI = 200;
}
movimientos[fila - 1 + i][columna - 1 - i] = posicion_debajoI;
}

}

if (fila != 1) {
// Comprobar mina diagonal arriba-izquierda
posicion_arribaI = comprueba_minas_cercanas((fila - 1 - i), (columna - 1 - i), tablero);
if (posicion_arribaI != -1)
{
if ((posicion_arribaI == 0) && (movimientos[fila - 1 - i][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna - i);
}
else {
if (posicion_arribaI == 0) {
posicion_arribaI = 200;
}
movimientos[fila - 1 - i][columna - 1 - i] = posicion_arribaI;
}

}
// Comprobar mina de encima
posicion_arriba = comprueba_minas_cercanas((fila - 1 - i), (columna - 1), tablero);
if (posicion_arriba != -1)
{
if ((posicion_arriba == 0) && (movimientos[fila - 1 - i][columna - 1] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna);
}
else {
if (posicion_arriba == 0) {
posicion_arriba = 200;
}
movimientos[fila - 1 - i][columna - 1] = posicion_arriba;
}

}
}
// Comprobar mina abajo
posicion_debajo = comprueba_minas_cercanas((fila - 1 + i), (columna - 1), tablero);
if (posicion_debajo != -1)
{
if ((posicion_debajo == 0) && (movimientos[fila - 1 + i][columna - 1] != 200)) {
seleccion_casilla(tablero, movimientos, fila + i, columna);
}
else {
if (posicion_debajo == 0) {
posicion_debajo = 200;
}
movimientos[fila - 1 + i][columna - 1] = posicion_debajo;
}

}


}
// Comprobar si es el ultimo elemento
if (fila == (FILAS) && columna == (COLUMNAS))
{
// Comprobar mina a la izquierda
posicion_izquierda = comprueba_minas_cercanas((fila - 1), (columna - 1 - i), tablero);
if (posicion_izquierda != -1)
{
if ((posicion_izquierda == 0) && (movimientos[fila - 1][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila, columna - i);
}
else {
if (posicion_izquierda == 0) {
posicion_izquierda = 200;
}
movimientos[fila - 1][columna - 1 - i] = posicion_izquierda;
}

}
// Comprobar mina diagonal arriba-izquierda
posicion_arribaI = comprueba_minas_cercanas((fila - 1 - i), (columna - 1 - i), tablero);
if (posicion_arribaI != -1)
{
if ((posicion_arribaI == 0) && (movimientos[fila - 1 - i][columna - 1 - i] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna - i);
}
else {
if (posicion_arribaI == 0) {
posicion_arribaI = 200;
}
movimientos[fila - 1 - i][columna - 1 - i] = posicion_arribaI;
}

}
// Comprobar mina arriba
posicion_arriba = comprueba_minas_cercanas((fila - 1 - i), (columna - 1), tablero);
if (posicion_arriba != -1)
{
if ((posicion_arriba == 0) && (movimientos[fila - 1 - i][columna - 1] != 200)) {
seleccion_casilla(tablero, movimientos, fila - i, columna);
}
else {
if (posicion_arriba == 0) {
posicion_arriba = 200;
}
movimientos[fila - 1 - i][columna - 1] = posicion_arriba;
}

}
}
}
else {
movimientos[fila - 1][columna - 1] = minascercanas;
}

if (comprueba_juego_ganado(tablero, movimientos) == 1)
{

mostrar_tablero(tablero);
printf("\n\n¡Has ganado el juego! ¡Enhorabuena!\n\n");
return 1;
}

return 0;

}




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)