Pascal/Turbo Pascal - Ayuda con procedimiento utilizando arreglos,

 
Vista:
sin imagen de perfil

Ayuda con procedimiento utilizando arreglos,

Publicado por Lore (1 intervención) el 15/11/2013 17:44:49
Hola Buenas tardes, he visto que has ayudado a mucha gente y despejado muchas dudas a traves de este foro, y espero que a mi me puedas ayudar tambien, estare muy agradecida,

Tengo que crear un juego, muy similar al candy crush pero obviamente no tan sofisticado,pero muy similar, lo unico que tengo que hacer es el motor, la interfaz me la dan, y son 9 procedimientos distintos, ya he avanzado mucho, pero hay uno es particular que no se como hacerlo, y es el de evaluar una jugada valida,
te muestro la letra de todo lo que tengo que hacer para que comprendas, pero lo unico que me esta faltando es el 6.7 el resto lo tengo casi todo, exceptuando detalles que una vez finalizados todos los arreglare.
Los tipos que tengo que utilizar son los siguientes:


TipoFicha = (FichaA, FichaB, FichaC, FichaD, FichaE, FichaF, FichaG, FichaH, FichaI);

TipoEstadoCelda = record
case vacia : boolean of
true : ();
false : (ficha : TipoFicha);
end;

RangoFila = 1..MAX_FILAS;
RangoColumna = 1..MAX_COLUMNAS;

TipoTablero = Array[RangoFila, RangoColumna] of TipoEstadoCelda;

Una posición en el tablero se representa con la siguiente estructura:

TipoPosicion = record
fila : RangoFila;
columna : RangoColumna;
end;
Para representar una bloque (o conjunto de celdas) utilizaremos el tipo TipoListaPosiciones, que es un arreglo con tope que tiene las posiciones de las celdas dentro del tablero, como se muestra a continuación:

TipoListaPosiciones = record
elems : array [1..MAX_CELDAS] of TipoPosicion;
tope : 0..MAX_CELDAS;
end;

6.  Los subprogramas
El motor del juego está constituido por el siguiente conjunto de subprogramas, que trabajan sobre la estructura definida:

6.1  inicializarTableroVacio

Este procedimiento retorna en el parámetro tablero un tablero con todas las celdas vacías.

procedure inicializarTableroVacio(var tablero :TipoTablero);
6.2  llenarCeldasVacias

Este procedimiento recibe en el parámetro tablero un tablero con celdas vacías y ocupadas, y devuelve el mismo tablero, pero con las celdas vacías ocupadas con fichas seleccionadas al azar.

procedure llenarCeldasVacias(var tablero :TipoTablero);
6.3  sonAdyacentes

Esta función devuelve verdadero si y sólo si las posiciones p1 y p2 son adyacentes.

function sonAdyacentes(p1, p2 : TipoPosicion) : Boolean;
6.4  cualesBorrar

Este procedimiento recibe un tablero y devuelve (en el parámetro borrar) las posiciones de todas las celdas que pertenecen a bloques eliminables del tablero.

procedure cualesBorrar(tablero : TipoTablero; var borrar : TipoListaPosiciones);
Las celdas a borrar deben aparecer solamente una vez en la lista borrar, no importa si aparecen en uno o más bloques eliminables.
Las posiciones pueden aparecer en cualquier orden.

6.5  borrarCeldas

Este procedimiento, luego de ejecutado, deja vacías todas las celdas cuya posición se encuentre en la lista @borrar@.

procedure borrarCeldas(borrar : TipoListaPosiciones; var tablero : TipoTablero);
6.6  desplazarHaciaAbajo

Este procedimiento realiza la “caída” de las fichas que quedaron arriba de celdas que quedaron vacías por la eliminación de bloques. Más detalladamente: se desplazan hacia abajo todas las fichas que tengan celdas vacías debajo. Luego de esta operación, todas la fichas vacías quedan en la parte superior del tablero.
Observación: puede suceder que no haya que desplazar ninguna ficha.

procedure desplazarHaciaAbajo(var tablero : TipoTablero);
6.7  hayJugadaValida

Este procedimiento recibe un tablero con todas sus celdas ocupadas.
Si hay al menos una jugada válida devuelve:

verdadero en el parámetro hay y
en p1 y p2 las posiciones que determinan una jugada válida, cualquiera de todas las posibles.
Si no hay un ninguna jugada válida devuelve falso en el parámetro hay.

procedure hayJugadaValida(tablero : TipoTablero; var hay : Boolean; var p1,p2 : TipoPosicion);

6.8  intercambiar

Este procedimiento intercambia los valores de las celdas dadas por las posiciones p1 y p2 del tablero.

procedure intercambiar(p1,p2 :TipoPosicion; var tablero :TipoTablero);
6.9  esJugadaValida

Esta función devuelve verdadero si y sólo si las posiciones p1 y p2 corresponden a una jugada válida tal cómo se definió más arriba.

function esJugadaValida(p1, p2 : TipoPosicion; tablero : TipoTablero) : Boolean;


el Procedimiento 6.7 es el que me esta costando mucho, porque evalue las veces que en un juego de este estilo esta permitida una jugada valida, y son 16 veces si no me equivoco, pero no se como implementarlas y si es necesario implementarlas a todas, si me puedes ayudar , estare muy muy agradecida, espero respuesta a la brevedad
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con procedimiento utilizando arreglos,

Publicado por ramon (2158 intervenciones) el 15/11/2013 22:43:56
Me pregunto si el procedimiento te devuelve true el juego finaliza o suma las partidas asta un tope,
Al no ver el programa y poder analizar lo que tienes, y teniendo en cuenta que otro procedimiento
toma ese dato para decidir no puedo nada mas que deberías de tener una salida de fin al
obtener el resultado true, informando del jugador ganador para ello finaliza con un repeat until o
un break si es un while.
Para poder serte de mas ayuda necesito ver el programa completo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar