Fecha y hora actual: Sábado 24 Ago 2019 04:45
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Proyecto Final: Juego Buscaminas

Responder al Tema Ir a página Anterior1234Siguiente

Índice del Foro > Programación en general > Proyecto Final: Juego Buscaminas

Autor Mensaje
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Miércoles 11 Mar 2015 11:06

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Procedimiento para desmarcar una celda marcada:


Código:


procedure DesMarcar(var juego: TipoJuego; posicion: TipoPosicion);
 
begin
 
// Se verifica que la celda este como marcada, caso contrario no se ejecuta el codigo
If (juego.tablero.celdas[posicion.fila,posicion.columna].estado = marcada) Then
  begin
    // Si esta marcada el estado de la celda cambia a oculta
    juego.tablero.celdas[posicion.fila,posicion.columna].estado:= oculta;
    // Se disminuye el contador de celdas marcadas en 1
    juego.marcadas:= juego.marcadas -1;
  end;// Fin del si la celda esta marcada
 
   (* ************************* Fin Procedimiento DesMarcar************************ *)
 
end;

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Sábado 14 Mar 2015 13:49

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Concluido el proyecto! Ahora publico los procedimientos para todas las demas acciones adcionales solicitadas en el proyecto.

La verdad quedo contento con el resultado obtenido despues de concluir tan provechoso curso. Ha sido demandante pero creo que se le saca mucha ventaja a los conocimientos impartidos por Kysuo Ayame. Sus explicaciones han sido excelentes y la estructuracion del curso es impecable. Ahora continuare con Modula2 y luego Java. Gracias a la comunidad y a los moderadores del curso por tan gentil labor.

Ahora los procedimientos:


Procedimiento DescubrirCircundantes:

Código:

procedure DespejarCircundantes(var juego: TipoJuego; posicion: TipoPosicion);


Type
RangoCircundantes= 0..8;

Descubiertas= Record
       coordenadas: Array[RangoCircundantes] of TipoPosicion;
       Tope: RangoCircundantes
End; // Fin del registro

Var// variables del procedimiento DespejarCircundantes
marcadasCircundantes: RangoCircundantes; // Contara el numero de celdas circundantes que esten marcadas
i,y: RangoFila;
j,x: RangoColumna;
k: RangoCircundantes;
Lista: Descubiertas;


Function VerificaMarcadas(Fila:RangoFila; Columna: RangoColumna):Boolean;

Begin
   // Si la celda circundante no es la celda central
  //If (not((Fila=posicion.fila) and (Columna=posicion.columna))) Then
  //begin
    // Se verifica que la celda circundante actual este marcada
    If (juego.tablero.celdas[Fila, Columna].estado = marcada) Then
    //Si esta marcada
    begin
       // Se asigna el valor true a la funcion
       VerificaMarcadas:= True;
    end // Fin del if celda = marcada
    else // Caso contrario (que no este marcada)
     begin
      // se verifica que este oculta
     If (juego.tablero.celdas[Fila,Columna].estado= oculta) Then
      begin
         // Aumento el tope del arreglo
         Lista.Tope:= Lista.Tope+1;
         // Se guardan las coordenadas de la celda circundante marcada
         Lista.coordenadas[Lista.Tope].fila:= Fila;
         Lista.coordenadas[Lista.Tope].columna:= Columna;
       end; // Fin del If celda oculta
      VerificaMarcadas:= False;
     end; // Fin del si no esta marcada
   //end; // Fin del If no es celda central
end; // Fin de la funcion CuentaMarcadas

Procedure VerificaCeldasCirc(posicion: TipoPosicion);
Var // Variables del procedimiento Verificar celdas circundantes
i,y: RangoFila;
j,x: RangoColumna;

Begin // Inicio del procedimiento Verificar celdas circundantes (Numero de bombas circundantes)
(*Primero se hace un cambio de variables ya que el parametro que se pasa al procedimiento Descubrir es el tipo
  posicion y el codigo fue escrito para posiciones en funcion de las coordenadas i,j; se hace una equivalencia
  entre el parametro posicion y las variables i y j. La equivalencia es como sigue:*)

  i:= posicion.fila; // cooredandas de fila de la celda central
  j:= posicion.columna; // coordenadas de columna de la celda central
  // Se inicia la cadena de sentencias If..Then..Else que recorren las celdas circundantes de uan celda
  If (i=1) Then
  begin // se indica el rango de revision de i hasta i+1
    For y:=i to i+1 Do
    begin // Se verifica si es la celda (1,1)
      If (j=1) Then
      begin
        //Si la celda es la (1,1) se indica el rango de revision de columnas de j a j+1
        For x:=j to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
        end; // Fin del For X:=j to j+1
      end // FIN DE J=1
      else // Sino es (j=1) se verifica si es la celda (1,cuantas_columnas)
      If (j=juego.tablero.topeColumna) Then
      begin
        //Si la celda es la (1,cuantas_columnas) se indica el rango de revision de columnas de j-1 a j
        For x:=j-1 to j Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
        end; // FIN DEL X:=J-1 TO
      end// Fin del if j=cuantas_columnas
      else // Si j no es ni 1 ni cuantas_columnas
      begin
        // se indica el rango de revision de columnas de j-1 a j+1
        For x:=j-1 to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
        end; // FIN DEL FOR X:=J-1 TO J+1
      end;// FIN DEL ELSE
    end;// Fin del For y:=i to i+1
  end// Fin del If(i=1)
  Else // Sino del if(i=1) se verifica si la celda circundante es la ultima fila
  If (i=juego.tablero.topeFila) Then
  begin // Se indica el rango de revision de i-1 hasta i
    For y:=i-1 to i Do
    begin // Se verifica si la celda es la esquina (1,cuantas_filas)
      If(j=1) Then
      begin
        // Si la celda es la (1,cuantas_filas) se indica el rango de las columnas de j a j+1
        For x:=j to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
        end;// FIN DEL FOR X:=J TO J+1
      end// Fin del If j=1
      else // Si no es la esquina (cuantas_filas,1) se verifica si es la ultima columna
      If (j=juego.tablero.topeColumna) Then
      begin
        //Si la celda es la (cuantas_filas,cuantas_columnas) se indica el rango de revision de columnas de j-1 a j
        For x:=j-1 to j Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
        end; // FIN DEL FOR X:=J-1 TO J
      end// Fin del if j=cuantas_columnas
      else // Si no es la esquina (cuantas_filas,cuantas_columnas)
      begin
        // se indica el rango de revision de columnas de j-1 a j+1
        For x:=j-1 to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
        end; // FIN DEL FOR X:=J-1 TO J+1
      end; // FIN DEL ELSE
    end; // Fin del For y:=i-1
  end // Fin del If(i=cuantas_filas)
  Else // Sino del if(i=cuantas_filas)
  // Se verifica si la celda circundante esta en la primera columna pero no es esquina
  If (((j=1) and (not(i=1) and not(i=juego.tablero.topeFila))))Then
  begin // Si es el caso se indica el rango de revision de las columnas de j a j+1
    For x:=j to j+1 Do // Ahora la secuencia de revision es alreves, primero se bajan las filas de una columna
    begin
      For  y:=i-1 to i+1 Do // y luego se va a la derecha a la proxima columna y se baja en el mismo orden
      begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
      end;// FIN DEL FOR Y:=I-1 TO I+1
    end; // FIN DEL FOR X:=J TO J+1
  end // Fin del If(j=1) and (not(i=1) and not(i=cuantas_filas)
  Else // Sino del if((j=1) and not (i=1) Then
  // Se verifica si la celda circundante esta en la ultima columna pero no es esquina
  If (((j=juego.tablero.topeColumna) and (not(i=1) and not(i=juego.tablero.topeFila)))) Then
  begin // Si es el caso se indica el rango de revision de las columnas de j-1 a j
    For x:=j-1 to j Do // Ahora la secuencia de revision es alreves, primero se bajan las filas de una column
    begin
      For  y:=i-1 to i+1 Do // y luego se va a la derecha a la proxima columna y se baja en el mismo orden
      begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
      end;// FIN DEL FOR Y:=I-1 TO I+1
    end; // FIN DEL FOR X:=J-1 TO J
  end // Fin del if (j=cuantas columnas) y no es esquina
  Else // Caso en que la celda no tenga celdas circundantes en las zonas indeterminadas
  // Se aplica el procedimiento generico para revisar las ocho celdas circundantes de una celda i,j
  For y:=i-1 to i+1 Do // Se revisa las filas de i-1 a i+1
  begin
    For x:=j-1 to j+1 Do // Se revisan las columnas de j-1 a j+1
    begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1;
    end; // FIN DEL X:=J-1 TO J+1
  end;// FIN DEL Y:=I-1 TO I+1


end; // Fin del Procedimiento  VerificCeldasCirc

Begin // Inicio del Procedimiento DespejarCircundantes
  // Se confirma que la celda actual este descubierta
  If(juego.tablero.celdas[posicion.fila, posicion.columna].estado = descubierta ) Then
    // Se confirma que la celda posicion tiene bombas circundantes mayores a cero
    If (juego.tablero.celdas[posicion.fila, posicion. Columna].bombasCircundantes>0) Then
       begin
       // Sinicializan las variables
       marcadasCircundantes:=0;
       Lista.Tope:=0;
       // Se llama al procediento que revisa las celdas circundantes
       VerificaCeldasCirc(posicion);


          (* Una vez que se cuente el numero de marcadasse compara el numero de marcadas al rededor con el
               numero de bombas circundantes de dicha celda, solo si son iguales se ejecuta el procedimiento
               que descubrira las circundantes ocultas*)

        If (juego.tablero.celdas[posicion.fila,posicion.columna].bombasCircundantes = marcadasCircundantes) Then
           (* Si son iguales se ejecuta el codigo que descubre las circundante al recorrer el arreglo donde se guardaron las
                 coordenadas*)
           For k:=1 to Lista.Tope Do
              Descubrir(juego,Lista.coordenadas[k]);
       end; // Fin de si la celda poscion esta descubierta y tiene bombas circundantes

End; // Fin del procedimiento DespejarCircundantes

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Sábado 14 Mar 2015 13:52

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Procedimiento MarcarCircundantes:

Código:

procedure MarcarCircundantes(var juego: TipoJuego; posicion: TipoPosicion);


Type
RangoCircundantes= 0..8;

Listas= Record
       coordenadas: Array[RangoCircundantes] of TipoPosicion;
       Tope: RangoCircundantes
End; // Fin del registro


Var// variables del procedimiento DespejarCircundantes

i,y: RangoFila;
j,x: RangoColumna;
k: RangoCircundantes;
ListaOcultas: Listas;
marcadasCircundantes: RangoCircundantes; // Contara el numero de celdas circundantes que esten marcadas
ocultasCircundantes: RangoCircundantes; // Contara el numero de celdas circundantes que esten ocultas


Function VerificaMarcadas(Fila:RangoFila; Columna: RangoColumna): boolean;

Begin
   // Si la celda circundante no es la celda central
  //If ((Fila<>posicion.fila) or (Columna<>posicion.columna)) Then
  //begin
    // Se verifica que la celda circundante actual este marcada
    If (juego.tablero.celdas[Fila, Columna].estado = marcada) Then
    //Si esta marcada
    begin
       // Se asigna el valor true a la funcion
       VerificaMarcadas:= True;
    end // Fin del if celda = marcada
    else // Caso contrario (que no este marcada)
     begin
      // se verifica que este oculta
     If (juego.tablero.celdas[Fila,Columna].estado= oculta) Then
      begin
         // Aumento el tope del arreglo
         ListaOcultas.Tope:= ListaOcultas.Tope+1;
         // Se guardan las coordenadas de la celda circundante marcada
         ListaOcultas.coordenadas[ListaOcultas.Tope].fila:= Fila;
         ListaOcultas.coordenadas[ListaOcultas.Tope].columna:= Columna;
       end; // Fin del If celda oculta
      VerificaMarcadas:= False;
     end; // Fin del si no esta marcada
   //end; // Fin del If no es celda central
end; // Fin de la funcion CuentaMarcadas

Procedure VerificaCeldasCirc(posicion: TipoPosicion);
Var // Variables del procedimiento Verificar celdas circundantes
i,y: RangoFila;
j,x: RangoColumna;

Begin // Inicio del procedimiento Verificar celdas circundantes (Numero de bombas circundantes)

(*Primero se hace un cambio de variables ya que el parametro que se pasa al procedimiento Descubrir es el tipo
  posicion y el codigo fue escrito para posiciones en funcion de las coordenadas i,j; se hace una equivalencia
  entre el parametro posicion y las variables i y j. La equivalencia es como sigue:*)

  i:= posicion.fila; // cooredandas de fila de la celda central
  j:= posicion.columna; // coordenadas de columna de la celda central
  // Se inicia la cadena de sentencias If..Then..Else que recorren las celdas circundantes de uan celda
  If (i=1) Then
  begin // se indica el rango de revision de i hasta i+1
    For y:=i to i+1 Do
    begin // Se verifica si es la celda (1,1)
      If (j=1) Then
      begin
        //Si la celda es la (1,1) se indica el rango de revision de columnas de j a j+1
        For x:=j to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
                ocultasCircundantes:= ocultasCircundantes +1;
        end; // Fin del For X:=j to j+1
      end // FIN DE J=1
      else // Sino es (j=1) se verifica si es la celda (1,cuantas_columnas)
      If (j=juego.tablero.topeColumna) Then
      begin
        //Si la celda es la (1,cuantas_columnas) se indica el rango de revision de columnas de j-1 a j
        For x:=j-1 to j Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
               ocultasCircundantes:= ocultasCircundantes +1;
        end; // FIN DEL X:=J-1 TO
      end// Fin del if j=cuantas_columnas
      else // Si j no es ni 1 ni cuantas_columnas
      begin
        // se indica el rango de revision de columnas de j-1 a j+1
        For x:=j-1 to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
               ocultasCircundantes:= ocultasCircundantes +1;
        end; // FIN DEL FOR X:=J-1 TO J+1
      end;// FIN DEL ELSE
    end;// Fin del For y:=i to i+1
  end// Fin del If(i=1)
  Else // Sino del if(i=1) se verifica si la celda circundante es la ultima fila
  If (i=juego.tablero.topeFila) Then
  begin // Se indica el rango de revision de i-1 hasta i
    For y:=i-1 to i Do
    begin // Se verifica si la celda es la esquina (1,cuantas_filas)
      If(j=1) Then
      begin
        // Si la celda es la (1,cuantas_filas) se indica el rango de las columnas de j a j+1
        For x:=j to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
                ocultasCircundantes:= ocultasCircundantes +1;
        end;// FIN DEL FOR X:=J TO J+1
      end// Fin del If j=1
      else // Si no es la esquina (cuantas_filas,1) se verifica si es la ultima columna
      If (j=juego.tablero.topeColumna) Then
      begin
        //Si la celda es la (cuantas_filas,cuantas_columnas) se indica el rango de revision de columnas de j-1 a j
        For x:=j-1 to j Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
                ocultasCircundantes:= ocultasCircundantes +1;
        end; // FIN DEL FOR X:=J-1 TO J
      end// Fin del if j=cuantas_columnas
      else // Si no es la esquina (cuantas_filas,cuantas_columnas)
      begin
        // se indica el rango de revision de columnas de j-1 a j+1
        For x:=j-1 to j+1 Do
        begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
               If (juego.tablero.celdas[y,x].estado = oculta) Then
                 ocultasCircundantes:= ocultasCircundantes +1;
        end; // FIN DEL FOR X:=J-1 TO J+1
      end; // FIN DEL ELSE
    end; // Fin del For y:=i-1
  end // Fin del If(i=cuantas_filas)
  Else // Sino del if(i=cuantas_filas)
  // Se verifica si la celda circundante esta en la primera columna pero no es esquina
  If (((j=1) and (not(i=1) and not(i=juego.tablero.topeFila))))Then
  begin // Si es el caso se indica el rango de revision de las columnas de j a j+1
    For x:=j to j+1 Do // Ahora la secuencia de revision es alreves, primero se bajan las filas de una columna
    begin
      For  y:=i-1 to i+1 Do // y luego se va a la derecha a la proxima columna y se baja en el mismo orden
      begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
               If (juego.tablero.celdas[y,x].estado = oculta) Then
                 ocultasCircundantes:= ocultasCircundantes +1;
      end;// FIN DEL FOR Y:=I-1 TO I+1
    end; // FIN DEL FOR X:=J TO J+1
  end // Fin del If(j=1) and (not(i=1) and not(i=cuantas_filas)
  Else // Sino del if((j=1) and not (i=1) Then
  // Se verifica si la celda circundante esta en la ultima columna pero no es esquina
  If (((j=juego.tablero.topeColumna) and (not(i=1) and not(i=juego.tablero.topeFila)))) Then
  begin // Si es el caso se indica el rango de revision de las columnas de j-1 a j
    For x:=j-1 to j Do // Ahora la secuencia de revision es alreves, primero se bajan las filas de una column
    begin
      For  y:=i-1 to i+1 Do // y luego se va a la derecha a la proxima columna y se baja en el mismo orden
      begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
                ocultasCircundantes:= ocultasCircundantes +1;
      end;// FIN DEL FOR Y:=I-1 TO I+1
    end; // FIN DEL FOR X:=J-1 TO J
  end // Fin del if (j=cuantas columnas) y no es esquina
  Else // Caso en que la celda no tenga celdas circundantes en las zonas indeterminadas
  // Se aplica el procedimiento generico para revisar las ocho celdas circundantes de una celda i,j
  For y:=i-1 to i+1 Do // Se revisa las filas de i-1 a i+1
  begin
    For x:=j-1 to j+1 Do // Se revisan las columnas de j-1 a j+1
    begin
           // Se invoca el procedimiento que verifica si la celda circundante actual esta marcada
           If(VerificaMarcadas(y,x)) Then
              // Caso que estemarcada se aumenta el contador de marcadas circundantes
              marcadasCircundantes:= marcadasCircundantes +1
            else
              // En caso que este oculta se aumenta el contador de ocultas circundantes
              If (juego.tablero.celdas[y,x].estado = oculta) Then
                ocultasCircundantes:= ocultasCircundantes +1;
    end; // FIN DEL X:=J-1 TO J+1
  end;// FIN DEL Y:=I-1 TO I+1

end; // Fin del Procedimiento  VerificCeldasCirc

Begin // Inicio del Procedimiento MarcarCircundantes

  // Se confirma que la celda actual este descubierta
  If(juego.tablero.celdas[posicion.fila, posicion.columna].estado = descubierta ) Then
    // Se confirma que la celda posicion tiene bombas circundantes mayores a cero
    If (juego.tablero.celdas[posicion.fila, posicion. Columna].bombasCircundantes>0) Then
       begin
       // Inicializan variables
       ListaOcultas.Tope:=0;
       marcadasCircundantes:=0;
       ocultasCircundantes:=0;
       // Se llama al procedimietno que recorre las celdas circundantes
       VerificaCeldasCirc(posicion);

          (* Una vez que se cuente el numero de marcadasse compara el numero de marcadas al rededor con el
               numero de bombas circundantes de dicha celda, solo si son iguales se ejecuta el procedimiento
               que descubrira las circundantes ocultas*)

        If (juego.tablero.celdas[posicion.fila,posicion.columna].bombasCircundantes = marcadasCircundantes+ocultasCircundantes) Then
           (* Si son iguales se ejecuta el codigo que descubre las circundante al recorrer el arreglo donde se guardaron las
                 coordenadas*)
           For k:=1 to ListaOcultas.Tope Do
              Marcar(juego,ListaOcultas.coordenadas[k]);
       end; // Fin de si la celda poscion esta descubierta y tiene bombas circundantes


end;

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Sábado 14 Mar 2015 13:55

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Finalmente, DescubrirSegura:


Código:

procedure DescubrirSegura(var juego: TipoJuego);

Var// Variables del procedimiento DescubrirSegura
celdaDescubierta: boolean;
posicion: TipoPosicion;
k: integer;// contador del repeat

Begin
randomize; // Se indica que se utilizara la funcion random
// Se inicializan las variables
celdaDescubierta:= false;
posicion.fila:=1;
posicion.columna:=1;
k:=0;
// Se inicia un loop repeat que creara coordenadas al azar hasta que se descubra una celda
Repeat
   k:=k+1;
   // Se crean las coordenadas al azar
   posicion.fila:= random(juego.tablero.TopeFila)+1;
   posicion.columna:= random(juego.tablero.TopeColumna)+1;
   //Se verifica si la celda esta oculta
   If(juego.tablero.celdas[posicion.fila,posicion.columna].estado = oculta) Then
       // Se verifica si la celda no tiene bomba, es segura!
       If(juego.tablero.celdas[posicion.fila,posicion.columna].tieneBomba = false) Then
         // El procedimiento solo se desplegara si  la celda posea mas de una bomba circundante
         // Para que mas de una celda no se descubre
          If (juego.tablero.celdas[posicion.fila, posicion.columna].bombasCircundantes >0) Then
        begin
          Descubrir(juego, posicion);
           If(juego.tablero.celdas[posicion.fila,posicion.columna].estado = descubierta) Then
              celdaDescubierta:= true;
         end; //Fin del si no tiene bomba
Until
     (celdaDescubierta or (k=(juego.tablero.TopeFila*juego.tablero.TopeColumna)+100) );
End; // Fin del procedimiento DescubrirSegura




Volver arriba
Ver perfil del usuario Enviar mensaje privado
eternity13



Registrado: 23 Oct 2016
Mensajes: 1

Mensaje Publicado: Domingo 23 Oct 2016 21:12

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Hola, llevo siguiendo el curso desde hace un tiempo y ya voy por esta práctica, pero me he encontrado que los enlaces para descargar del buscaminas estan caídos. ¿Podría alguién que lo tuviera resubirlo?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Lunes 24 Oct 2016 14:12

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Hola, te paso un nuevo enlace con el archivo RAR que contiene el proyecto con letra y todo lo que necesitas:

http://www.kaedusoft.edu.uy/Images/Proyecto%20final%20-%20Buscaminas.zip

Cualquier problema, a tus órdenes.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Miércoles 25 Ene 2017 22:49

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Cuando dice que no se pueden usar variables globales, se refiere a usar variables de "buscaminas.pas"?
Puedo definir un tipo y usar una variable global para "motor.pas"??

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Sábado 28 Ene 2017 18:29

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

El enlace que pone aqui no contiene los archivos de los juegos empezados que necesito para ir probando los procedimientos.

Los historiales si que vienen, pero los archivos:
juego1.txt
juego2.txt
juego3.txt
juego3-empezado.txt
no estan
¿Me los podria facilitar alguien por favor?

Gracias por adelantado

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Martes 31 Ene 2017 13:17

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Aun tiene soporte este curso?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Martes 31 Ene 2017 13:26

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Va nuevo enlace

http://kaedusoft.edu.uy/Images/Juegos%20empezados.rar

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Martes 31 Ene 2017 14:05

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Gracias Kyshuo

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Viernes 03 Feb 2017 21:05

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Buenas.
En la instruccion
Código:

if (juego.tablero.celdas[x,y].estado=marcada) or (juego.tablero.celdas[x,y].estado=oculta) then

me lanza el error:
operator is not overloaded: "TipoEstadoCelda"="TipoPosicion"
¿Alguna idea de que puede estar pasando?

Gracias por adelantado

EDITO
ya lo solucione, puse a una variable de TipoPosicion de nombre "marcada". Error mio.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Lunes 06 Feb 2017 15:17

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Excelente!!! Sigue adelante. Aprenderás mucho con este proyecto.

Aguardaré tus comentarios.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Miércoles 08 Feb 2017 12:53

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Solo me quedan por escribir los procedimientos "IniciarJuego" y "Descubrir".
El procedimiento que he escrito para "IniciarJuego" es el siguiente:
Código:

procedure IniciarJuego(var juego: TipoJuego; cuantas_filas: RangoFila; cuantas_columnas: RangoColumna; cuantas_bombas: integer);

var
   i,j,x,y:integer; //para realizar iteraciones.
   numBombas:integer; //para contar las bombas que llevamos colocadas.
   miCelda:TipoPosicion; //para llamar a la funcion "circundantes".
   limitrofes:RangoRecorrido; //para almacenar las circundantes de una celda.

begin

juego.estado:=jugando; //el juego acaba de empezar.
juego.marcadas:=0; //aun  no hemos marcado ninguna celda.
juego.descubiertas:=0; //aun no hemos descubierto ninguna celda.
juego.bombas:=cuantas_bombas; //marcamos el numero de bombas que tendra el tablero.
juego.tablero.topeFila:=cuantas_filas; //definimos los limites del tablero.
juego.tablero.topeColumna:=cuantas_columnas; //definimos los limites del tablero.

{Recorremos el tablero maracando la celdas como ocultas, y de momento no tienen bombas}
for i:=1 to juego.tablero.topefila do
   for j:=1 to juego.tablero.topeColumna do
      begin
      juego.tablero.celdas[i,j].estado:=oculta;
      juego.tablero.celdas[i,j].tieneBomba:=false;
      end; //hasta aqui hemos creado un tablero vacio.

numBombas:=0; //aun no hay ninguna bomba colocada.
{Vamos buscando posiciones aleatorias dentro de los limites del tablero}
repeat
   i:=random(juego.tablero.topeFila+1);
   j:=random(juego.tablero.topeColumna+1);

   if juego.tablero.celdas[i,j].tieneBomba=false then //comprovamos que la posicion aleatoria no contenga ya una bomba.
      begin //en el caso de que no tenga bomba.
      juego.tablero.celdas[i,j].tieneBomba:=true; //colocamos una bomba.
      numBombas:=numBombas+1; //sumamos 1 a la cantidad de bombas.
      end;
   {Si ya tenia bomba no hacemos nada y buscamos otra posicion}
until numBombas=juego.bombas; //repetimos hasta que esten colocadas todas las bombas

{Ya tenemos las bombas colocadas, por ultimo recorremos las celdas sin bomba calculando para cada una}
{el numero de bombas que la circundan}
for i:=1 to juego.tablero.topeFila do
   for j:=1 to juego.tablero.topeColumna do
      begin
      juego.tablero.celdas[i,j].bombasCircundantes:=0; //de momento no sabemos cuantas celdas con bomba la circundan.
      if not juego.tablero.celdas[i,j].tieneBomba then //solo marcamos las bombas circundantes si la celda no tiene bomba.
         begin
         {damos la posicion de la celda a la variable "miCelda" para calcular los limites de las celdas circundantes}
         miCelda.fila:=i;
         miCelda.columna:=j;
         limitrofes:=circundantes(juego,miCelda); //hallamos los limites entre los que buscamos bombas para dar valor a "bombasCircundantes".
         {Recorremos las celdas circundantes y sumamos las bombas que encontremos}
         for x:=limitrofes.filaSuperior to limitrofes.filaInferior do
            for y:=limitrofes.columnaAnterior to limitrofes.columnaPosterior do
               if juego.tablero.celdas[x,y].tieneBomba then
                  juego.tablero.celdas[i,j].bombasCircundantes:=juego.tablero.celdas[i,j].bombasCircundantes+1;
         end;
      end;

end; //del procedimiento.

El problema es que al probarlo, si intento crear un tablero facil, crea siempre el mismo, no lo crea aleatorio en cada prueba.
Y si intento crear un tablero intermedio o dificil el programa directamente se cae, EXITCODE 217.

La funcion "circundantes" esta probada y funciona a la perfeccion, es la siguiente:
Código:

Type

   RangoRecorrido=RECORD
      filaSuperior,
      filaInferior:RangoFila;
      columnaAnterior,
      columnaPosterior:RangoColumna;
   end;

{************************************************************************************************}

FUNCTION circundantes(juego:TipoJuego;posicion:TipoPosicion):RangoRecorrido;

{Encontramos 9 casos posibles para saber cuantas y cuales son las celdas circundantes de una celda determinada:
   1/ en el centro del tablero tendra 8 celdas que la circundan
   2/ 4 bordes tendra 5 celdas que la circundan
   3/ 4 esquinas tendra 3 celdas que la circundan
esta funcion nos devuelve los limite de fila y columna que circundan una celda en la "posicion" dada para evitar
tener que buscarlos cada vez que lo necesite, como en "descubrir", "marcar circundantes"...}

begin
   if ((posicion.fila<>1) and (posicion.fila<>juego.tablero.topeFila)) and ((posicion.columna<>1) and (posicion.columna<>juego.tablero.topeColumna)) then
      begin //para una celda situada en el centro del tablero.
      circundantes.filaSuperior:=posicion.fila-1;
      circundantes.filaInferior:=posicion.fila+1;
      circundantes.columnaAnterior:=posicion.columna-1;
      circundantes.columnaPosterior:=posicion.columna+1;
      end

   else
      begin

{Primero definimos las 4 esquinas del tablero}

      if (posicion.fila=1) and (posicion.columna=1) then
         begin //esquina superior izquierda.
         circundantes.filaSuperior:=posicion.fila;
         circundantes.filaInferior:=posicion.fila+1;
         circundantes.columnaAnterior:=posicion.columna;
         circundantes.columnaPosterior:=posicion.columna+1;
         end;

      if (posicion.fila=1) and (posicion.columna=juego.tablero.topeColumna) then
         begin //esquina superior derecha.
         circundantes.filaSuperior:=posicion.fila;
         circundantes.filaInferior:=posicion.fila+1;
         circundantes.columnaAnterior:=posicion.columna-1;
         circundantes.columnaPosterior:=posicion.columna;
         end;

      if (posicion.fila=juego.tablero.topeFila) and (posicion.columna=1) then
         begin //esquina inferior izquierda.
         circundantes.filaSuperior:=posicion.fila-1;
         circundantes.filaInferior:=posicion.fila;
         circundantes.columnaAnterior:=posicion.columna;
         circundantes.columnaPosterior:=posicion.columna+1;
         end;

      if (posicion.fila=juego.tablero.topeFila) and (posicion.columna=juego.tablero.topeColumna) then
         begin //esquina inferior derecha.
         circundantes.filaSuperior:=posicion.fila-1;
         circundantes.filaInferior:=posicion.fila;
         circundantes.columnaAnterior:=posicion.columna-1;
         circundantes.columnaPosterior:=posicion.columna;
         end;

{Ahora definimos los 4 bordes del tablero}

      if (posicion.fila=1) and ((posicion.columna<>1) and (posicion.columna<>juego.tablero.topeColumna)) then
         begin //borde superior.
         circundantes.filaSuperior:=posicion.fila;
         circundantes.filaInferior:=posicion.fila+1;
         circundantes.columnaAnterior:=posicion.columna-1;
         circundantes.columnaPosterior:=posicion.columna+1;
         end;

      if (posicion.fila=juego.tablero.topeFila) and ((posicion.columna<>1) and (posicion.columna<>juego.tablero.topeColumna)) then
         begin //borde inferior.
         circundantes.filaSuperior:=posicion.fila-1;
         circundantes.filaInferior:=posicion.fila;
         circundantes.columnaAnterior:=posicion.columna-1;
         circundantes.columnaPosterior:=posicion.columna+1;
         end;

      if ((posicion.fila<>1) and (posicion.fila<>juego.tablero.topeFila)) and (posicion.columna=1) then
         begin //borde izquierdo.
         circundantes.filaSuperior:=posicion.fila-1;
         circundantes.filaInferior:=posicion.fila+1;
         circundantes.columnaAnterior:=posicion.columna;
         circundantes.columnaPosterior:=posicion.columna+1;
         end;

      if ((posicion.fila<>1) and (posicion.fila<>juego.tablero.topeFila)) and (posicion.columna=juego.tablero.topeColumna) then
         begin //borde derecho.
         circundantes.filaSuperior:=posicion.fila-1;
         circundantes.filaInferior:=posicion.fila+1;
         circundantes.columnaAnterior:=posicion.columna-1;
         circundantes.columnaPosterior:=posicion.columna;
         end;
      end; //final del "else".
end; //de la funcion.

Alguna idea de cual puede ser el problema??

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Miércoles 08 Feb 2017 15:28

Título del mensaje: Proyecto Final: Juego Buscaminas

Responder citando

Para que funcione aleatoriamente tienes que llamar a RANDOMIZE antes que nada. Lo ideal sería poner esa instrucción justo antes de la línea:

Código:
  1. juego.estado:=jugando;


Debería quedarte así:


Código:
  1. randomize;
  2. juego.estado:=jugando;
  3. ... Acá va el resto de tu código.



Acerca del error, pues está más dificil de detectarlo. Hay que usar el depurador. ¿Cómo te ves para utilizarlo? Si necesitas ayuda con él dilo y te lo explicaré mejor.

Si puedes, pásame absolutamente todo tu código así puedo hacer pruebas para detectar por donde anda fallando la cuestión.

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página Anterior1234Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Juego Liguita de futbol

Octavio Programación de juegos o videojuegos 2 Sábado 01 Jun 2019 05:03 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Agregar un volante al juego F1 2018

Miguelinho53 Programación de juegos o videojuegos 0 Domingo 11 Nov 2018 17:34 Ver último mensaje
El tema está bloqueado: no pueden editarse ni agregar mensajes.

Solicito programadores para mi proyecto

alexpin Bolsa de trabajo 0 Miércoles 23 May 2018 22:53 Ver último mensaje
El foro no contiene ningún mensaje nuevo

resultado separado por comas y al final un punto

pegomezca Python 0 Lunes 23 Oct 2017 11:19 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Duda codigo en Python - Red Neuronal con numpy ...

Daniel_wUNTG Python 1 Sábado 21 Oct 2017 22:27 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,