Você está na página 1de 12

Unidad BMLogica {Declaraciones de las acciones y funciones visibles para quienes utilizan esta unidad} Interface Usa MatrizDinamica

{Declaraciones de tipos} Lxico Mina = -1 ModosMapa = (modoeditar, modojugar) AccionesMapaMina = (ponerMina, quitarMina) mapa Tmatriz totalMina,totalBandera,espVisible entero cols,fils entero {Funciones que devuelve la cantidad de Columnas y filas respectivamente. Para ocultar a quien la usa, el acceso directo a la Mapa de datos } Funcin MapaCantCols Funcin MapaCantFils entero; entero;

{Modifica la posicin x,y del Mapa segn la accin (quitar o poner) y recalcula su entorno} Accin MapaModificarMina (dato x,y entero; dato accion AccionesMapaMina)

{Modifica la posicin x,y de la mscara segn el estado indicado} Accin MascaraMapaModificar (dato x,y entero; dato estado EstadosMascara)

{Modifica la posicin x,y del mapa segn el valor indicado} Accin MapaModificar (dato x,y entero; dato valor entero) {Devuelve el valor de una posicin de un mapa} Funcin MapaObtenerValor (dato x,y entero) entero {-1 mina, 0..n, minas colindantes}

{Devuelve el estado de una posicin de la mscara} Funcin MascaraMapaObtenerValor (dato x,y entero) EstadosMascara

{Procedimiento recursivo ej. para descubrir todos las celdas relacionadas con la indicada, siempre y cuando tengan valor 0} Accin BuenosVecinos(dato x,y entero) {Inicializa la lgica segn el modo del mapa deseado} Accin Inicializar(dato modo ModosMapa) {Devuelve el modo actual del programa} Funcin ModoActual ModosMapa

Accin CargarMapaAleatorio (dato m entero) Funcin Ganar Logico

Accin LeerValor (dato f caracter; datoResultado cols,fils,cant entero) Accin CantMinasEnJuego( dato num entero; datoResultado totalMina entero) Accin CantBanderasEnJuego(dato num entero; datoResultado totalBandera entero) Accin MapaInicializar(dato fil,col entero) Accin MapaModificarTamano(dato fil,col entero) Accin EspacioVisibles (dato num entero; datoResultado espVisible entero) Funcin minas Funcin banderas entero entero Entero

Funcin espacioVisible

{Implementacin del Mdulo} Implementacin {Declaracin del Tamao de la Mapa (se declara como constante as, en caso de ser necesario puede modificarse) } {Declaracin del tamao de mapa especificado} Lexico modoMapa ModosMapa {indicador del modo del juego, editando o jugando}

{Inicializa la mscara en ocultos para comenzar el juego} Accin MapaInicializarJugar LexicoLocal i,j entero Inicio Para i desde 1 hasta MapaCantCols con paso 1 hacer Para j desde 1 hasta MapaCantFils con paso 1 hacer MascaraMapaModificar(i,j,oculto) FinPara FinPara Fin {Pone el mapa todo en 0 (sin minas) y la mscara todo en visible} Accin MapaInicializarEditar LxicoLocal i,j entero Inicio Para i desde 1 hasta MapaCantCols con paso 1 hacer Para j desde 1 hasta MapaCantFils con paso 1 hacer MascaraMapaModificar(i,j,visible) MapaModificar(i,j,0) {en caso de inicializacin de Edicin quito todas las minas} FinPara FinPara Fin

Accin EspacioVisibles (dato num dato entero; datoResultado espVisible entero) Inicio espVisible Fin Accin MapaInicializar(dato fil, col entero) Inicio MatrizInicializar (mapa,fil,col) Fin Accin MapaModificarTamano(dato fil, col entero) Inicio MatrizModsiicarTamano(mapa,fil,col) Fin Funcin MapaCantCols Inicio Matrizfils(mapa) Fin Funcin MapaCantFils Inicio Matrizcols(mapa) Fin {accin local para recalcular el cuadrante a recalcular ojo con los bordes} {xi = x izquierdo,ys = y superior, xd = x derecho,yi = y inferior} Accin DefinirCuadranteValido (dato x,y entero; dato xi,ys,xd,yi entero) Inicio xi xd x-1 x+1 entero entero espVisible+num

ys yi

y-1 y+1

Si (xi < 1) Entonces xi FinSi Si (ys < 1) Entonces ys FinSi Si (xd > MapaCantCols) Entonces xd FinSi Si (yi > MapaCantFils) Entonces yi FinSi {fin Eliminar} Fin Accin MapaModificarMina (dato x,y entero; dato accion AccionesMapaMina) y { ve el cuadrante inferior si es vlido} x { ve el cuadrante derecho si es vlido} y { ve el cuadrante superior si es vlido} x { ve el cuadrante izquierdo si es vlido}

{accin local para recalcular los indicadores de minas del mapa} Accin RecalcularColindantes(dato x,y entero; dato valor entero) {valor -1 o 1} LxicoLocal xi,ys,xd,yi entero {determinan el cuadrante afectado (xizq,ysuperior),} {(xder,yinferiror)} i,j entero {ndices para recorrer el mapa} Inicio DefinirCuadranteValido(x,y,xi,ys,xd,yi) {afecto el cuadrante excepto la posicin de la mina}

Para i desde xi hasta xd con paso 1 hacer Para j desde ys hasta yi con paso 1 hacer Si ((i<>x) o (j<>y)) y (mapaObtenerValor(i,j)<>-1) Entonces MapaModificar(i,j,MapaObtenerValor(i,j)+valor) FinSi FinPara FinPara Fin Funcin CantColindantes (dato x,y entero) LxicoLocal xi,ys,xd,yi,i,j entero {determinan el cuadrante afectado (xizq,ysuperior), (xder,yinferiror)} Inicio DefinirCuadranteValido(x,y,xi,ys,xd,yi) 0 Para i desde xi hasta xd con paso 1 hacer Para j desde ys hasta yi con paso 1 hacer Si MapaObtenerValor(i,j) = -1 Entonces {para sacar la cantidad de minas colindantes} CantColindantes + 1 FinSi FinPara FinPara Fin Inicio Si (accion = ponerMina) y (MapaObtenerValor (x,y) <> -1) Entonces {si quiero poner y no haba} entero

MapaModificar(x,y,-1)

{hay mina} {sumar 1 a los colindantes}

RecalcularColindantes(x,y,1) FinSi

Si (accion = quitarMina) y (MapaObtenerValor (x,y) = -1) Entonces {si quiero quitar y si haba} MapaModificar(x,y,0) MapaModificar(x,y,CantColindantes(x,y)) {recalculo cuantas minas hay alrededor poner en 0 para los alumnos} RecalcularColindantes(x,y,-1) {quitar 1 a los colindantes} FinSi Fin

Funcin MalosVecinos( dato x,y entero) Inicio

logico

Si (((MapaObtenerValor(x+1,y) =0) y (x+1 <= MapaCantCols)) o ((MapaObtenerValor(x-1,y) =0) y (x-1 >= 1) ) o ((MapaObtenerValor(x,y+1) =0) y (y+1 <= MapaCantFils)) o ((MapaObtenerValor(x,y-1) =0) y (y-1 >= 1) )) entonces verdadero SiNo falso FinSi Fin

{procedimiento recursivo que calcula la clausura transitiva de la relacin ser vecino 0 de una celda con 0} Accin BuenosVecinos( dato x,y entero)

LxicoLocal xi,ys,xd,yi entero {determinan el cuadrante afectado (xizq,ysuperior), (xder,yinferiror)}

i,j entero {ndices para recorrer el mapa} Inicio MascaraMapaModificar ( x,y,visible) {marco la actual, debera ser 0} DefinirCuadranteValido(x,y,xi,ys,xd,yi) {calculo el cuadrante valido } Si (MapaObtenerValor(x,y) = 0) Entonces Para i desde xi hasta xd con paso 1 hacer Para j desde ys hasta yi con paso 1 hacer Si ((i<>x) o (j<>y)) y (MalosVecinos(i,j) o (MapaObtenerValor(i,j)=0)) y (MascaraMapaObtenerValor(i,j)=oculto) Entonces BuenosVecinos(i,j) FinSi FinPara FinPara Fin Accin MascaraMapaModificar (dato x,y entero; dato estado EstadosMascara) LxicoLocal aux Inicio Si((estado = visible) y ((MatrizObtVal(mapa,x,y)).masc<>visible)) Entonces EspacioVisibles (1,espVisible) FinSi aux.num aux.masc MapaObtenerValor(x,y) estado TCelda

MatrizInsertValor (mapa,aux,x,y)

Fin Accion MapaModificar (dato x,y entero;dato valor entero) LxicoLocal aux TCelda Inicio aux.num aux.masc valor MascaraMapaObtenerValor(x,y)

MatrizInsertValor (mapa, aux,x,y) Fin Funcin MapaObtenerValor ( dato x,y entero) Inicio MatrizObtVal(mapa,x,y).num Fin Funcin MascaraMapaObtenerValor (dato x,y entero) Inicio {la lgica se encarga a travs de esta funcin de mostrar u ocultar cuando sea necesario independ. a la interfaz} Si ModoActual=modoeditar Entonces visible {si estoy editando lo muestro siempre} Si No MatrizObtVal(mapa,x,y).masc {si est jugando depende si ya lo examino o no} FinSi Fin Accin Inicializar(dato modo ModosMapa) Inicio modoMapa modo EstadosMascara entero {-1 mina, 0..n, minas colindantes}

Segn modoMapa =modojugar : MapaInicializarJugar modoMapa = modoeditar : MapaInicializarEditar FinSegun espVisible Fin Funcin ModoActual Inicio modoMapa Fin Accion CargarMapaAleatorio ( dato m entero) LxicoLocal posx,posy entero Inicio Si (m <= (MapaCantFils*MapaCantCols)) Entonces MapaInicializarEditar randomize Mientras 0<m Hacer posy posx random (MapaCantFils)+1 random (MapaCantCols)+1 ModosMapa 0

Si (MapaObtenerValor(posx,posy)<>-1) Entonces {fija que no alla una mina en el lugar que va a poner} m m-1 {coloca la mina

MapaModificarMina(posx,posy,ponerMina) aleatoria} FinSi

FinMientras MapaInicializarJugar; FinSi Fin Accin CantMinasEnJuego (doto num Entero; datoresultado totalMina entero) Inicio totalMina Fin Accin CantBanderasEnJuego ( dato num Entero; datoreultado totalBandera entero) Inicio totalBandera Fin Accin LeerValor ( dato f caracter; datoresultado cols,fils,cant entero) Inicio Segn f ='1' : cant 10 cols 10 fils 10 totalBandera + num {la cantidad de bandera que ponga} totalMina+num

f = '2' : cant 30 cols 12 fils 12 f = '3' : cant 80 cols 14 fils 14 f = '4' : cant 130

cols 16 fils 16 FinSegun Fin Funcin minas Inicio totalmina Fin Funcin espacioVisible Inicio espVisible Fin Funcin banderas Inicio totalBandera Fin Funcin Ganar Inicio Si ((MapaCantCols * MapaCantFils) = (minas + espacioVisible)) Entonces True Si No False { se fija si gano} FinSi Fin logico entero entero entero

Você também pode gostar