elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Java / Mostrar mensaje por pantalla 'x' tiempo y borrar en: 19 Noviembre 2019, 20:17 pm
Buenas noches. Tengo que crear un programa/juego de memoria que vaya mostrando una serie numérica de hasta 10 números comprendidos entre el 1 y el 3 a medida que el usuario vaya acertando estos. La serie se muestra un determinado tiempo que variará en función del nivel que haya elegido el usuario y posteriormente deberá desaparecer para pedirle al usuario que repita esa secuencia.

Eso es lo que me está trayendo de cabeza hasta tal punto de estar perdiendo interés por continuar y es que no me gusta dejar programas incompletos o imperfectos.

Bien, al principio traté de hacerlo con un par de bucles for anidados para que me repitiesen el número 'x' veces (en función del nivel) con su respectivo salto de línea. Finalmente daba unos cuantos saltos de línea para "eliminar" cualquier pista de la serie de la consola y pedía al usuario la repetición de esta.

¿Y cuál es el problema? Que descubrí por ahí la librería Timer y ahora no quiero volver atrás. Me llevó tiempo encontrar una solución por mi cuenta pero me está llevando más tiempo finalizar el programa con el Timer.

Por lo que tengo entendido, lo que hace mi objeto Timer a través del método schedule, es repetir una tarea cada 'x' tiempo en ms.

El tema es que yo necesito que el programa siga su curso cuando empleo timer.cancel() y que me compare la serie creada por el ordenador con la que introduce el usuario y esto último no se da, directamente se queda trabado.

Espero haberme explicado con claridad y gracias por vuestro tiempo.

Esta es la clase JuegoMemoria donde creo el objeto.
Código
  1. public class JuegoMemoria {
  2. private int[] numeros = new int[10];
  3. private int[] numsUsu = new int[10];
  4. public int cont = 1;
  5. private int nivel;
  6. public int tiempo = 0;
  7.  
  8. JuegoMemoria() {
  9.  
  10. }
  11.  
  12. public void espacioBlanco(int x) {
  13.  
  14. for(int i = 0; i < x; i++) {
  15. System.out.println();
  16. }
  17. }
  18.  
  19. public void eleccionNivel() {
  20.  
  21. do {
  22. System.out.println("Elige el nivel de dificultad:\n1.-Facil\n2.-Medio\n3.-Dificil");
  23. try {
  24. nivel = Integer.parseInt(br.readLine());
  25. } catch(Exception e) {
  26. e.printStackTrace();
  27. }
  28. } while(nivel < 1 && nivel > 3);
  29.  
  30. switch(nivel) {
  31. case 1:
  32. tiempo = cont * 5000;
  33. break;
  34. case 2:
  35. tiempo = cont * 2500;
  36. break;
  37. case 3:
  38. tiempo = cont * 1500;
  39. break;
  40. }
  41.  
  42. }
  43.  
  44. public void generarSerie() {
  45. for(int i = 0; i < 10; i++) {
  46. numeros[i] = (int) (Math.floor(Math.random() * 3 + 1));
  47. numsUsu[i] = 0;
  48. }
  49. }
  50.  
  51. public void mostrarSerie() {
  52. if(cont > 1) {
  53. cont++;
  54. }
  55.  
  56. for(int i = 0; i < cont ; i++) {
  57. System.out.print(numeros[i] + " ");
  58. }
  59. }
  60.  
  61. public void compararSeries() {
  62. int i = 0;
  63.  
  64.  
  65.  
  66. System.out.println("Repite la serie: ");
  67. while(i != cont) {
  68. try {
  69. numsUsu[i] = Integer.parseInt(br.readLine());
  70. } catch(Exception e) {
  71. e.printStackTrace();
  72. }
  73. if(numeros[i] == numsUsu[i]) {
  74. i++;
  75. } else {
  76. System.out.println("El juego ha finalizado.");
  77. i = cont;
  78. }
  79. }
  80. }
  81. }
  82.  

Y en esta otra es la que contiene el main.
Código
  1. public class JuegoMemoriaPrueba {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. JuegoMemoria jm = new JuegoMemoria();
  6. Timer timer = new Timer();
  7.  
  8. TimerTask task = new TimerTask() {
  9. int contador = 0;
  10.  
  11. @Override
  12. public void run() {
  13.  
  14.  
  15. jm.mostrarSerie();
  16.  
  17. if(jm.cont > 0) {
  18. jm.espacioBlanco(10);
  19. }
  20.  
  21. timer.cancel();
  22.  
  23. contador++;
  24. }
  25. };
  26.  
  27. System.out.println("\tSERIES NUMERICAS");
  28. System.out.println("\t----------------");
  29. System.out.println("\tPon a prueba tu memoria.\n");
  30. jm.eleccionNivel();
  31. jm.generarSerie();
  32. do {
  33. timer.schedule(task, 0, jm.tiempo);
  34. jm.compararSeries();
  35. } while(jm.cont < 9);
  36.  
  37. }
  38.  
  39. }
  40.  

Gracias por cualquier tipo de ayuda o sugerencia.
2  Programación / Programación General / Re: [?] ¿cuantos libros de progracion te has leido? en: 19 Noviembre 2019, 19:44 pm
Hola amigo. Solamente me he leído un libro, perdón, quise decir que me estoy leyendo un libro.  :laugh: Si se te hace tedioso y no logras entender la mitad no estaría mal que dieras el título, para no comprarlo.  :laugh: Mi recomendación es YouTube, qué típico ¿no? Si estás comenzando te irá muy bien ir asimilando conceptos y practicando con diferentes ejercicios. Si quieres probar esta táctica de videotutoriales te puedo mandar a un canal que es de lo mejor que he encontrado (para aprender Java y C++) y que te va a hacer ir progresando casi sin que te des cuenta.
Respecto al único libro que estoy leyendo se titula "JAVA para novatos" de A.M. Vozmediano. No está mal, incide mucho en las cosas para que se te vayan grabando y parece cercano al lector aunque hecho en falta un Índice.  :silbar: Me está tomando tiempo terminarlo porque me atasco en algún que otro ejercicio, como ahora y lo dejo durante un tiempo, lo retomo, veo la luz y finalizo ese ejercicio para seguir con los demás (no soy un buen ejemplo, lo sé, pero toma nota para no cometer los mismos errores  ;D).
Como muy bien han apuntado por arriba, lo suyo sería que empezaras por C++ y de ahí pasaras a otro lenguaje de programación.
3  Programación / Programación C/C++ / Re: Problemas para rellenar la matriz en: 1 Marzo 2019, 17:47 pm
Excelente explicación. Poco más y me haces un programa nuevo.  :laugh:
Claro yo tenía entendido que si introducía las variables dentro del main, en caso de mandarlas a las funciones debía hacerlo siempre por referencia. Otra cosa que me acabas de enseñar es a usar más el const int una vez tengo definidos los valores para los enteros. Lo que no termino de entender es TAM. Entiendo que C++ pide al menos un tamaño máximo de columnas y también he visto como se pueden predefinir pero en este caso que no van predefinidas no le encuentro el sentido. Me imagino que habrás definido int TAM = 10; int m[][TAM];

Por cierto, no sé como organizarme ahora que empiezo a ver temas un poco más complejos. Me gustaría guardar tanta información como sea posible y no sé por donde empezar ¿Qué métodos usas?
Estoy siguiendo un videotutorial de YT para que te hagas una idea.  :-\

Gracias de nuevo por tu tiempo y por tan extensas explicaciones de calidad. De mayor quiero expresarme como tú.  ;-)
4  Programación / Programación C/C++ / Re: Problemas para rellenar la matriz en: 28 Febrero 2019, 20:40 pm
Este sería el resultado tras aplicar los cambios. Muchas gracias.


Código:
/* 15. Desarrollar una función que determine si una matriz es simétrica o no. 

Una matriz es simétrica: A = A^t

- La matriz debe ser cuadrada.
- Aij = Aji

|2   5   9|                       |2   5   9|
|5   8   -1|          ->          |5   8   -1|
|9   -1   10|                     |9   -1   10|

*/

#include <iostream>
#include <cstdlib>

using namespace std;

void pedirDatos(int&, int&);
void matrizCuadrada(int m[][10], int&, int&);
void rellenarMatriz(int m[][10], int&, int&);
void mostrarMatriz(int m[][10], int&, int&);
void matrizSimetrica(int m[][10], int&, int&);

int main(){
int m[10][10], nFil, nCol;

pedirDatos(nFil, nCol);
matrizCuadrada(m, nFil, nCol);
cout<<"\n";
mostrarMatriz(m, nFil, nCol);
matrizSimetrica(m, nFil, nCol);
cout<<"\n\n";

cin.get(); //system("pause");
return 0;
}

void pedirDatos(int& nFil, int& nCol){

cout<<"Introduce el numero de filas de la matriz: ";
cin>>nFil;
cout<<"\nIntroduce el numero de columnas de la matriz: ";
cin>>nCol;
}

void matrizCuadrada(int m[][10], int& nFil, int& nCol){

do{
cout<<"\nLa matriz debe ser cuadrada (ej. 4x4)";
cout<<"\n\n";
pedirDatos(nFil, nCol);
}while(nFil != nCol);

rellenarMatriz(m, nFil, nCol);
}

void rellenarMatriz(int m[][10], int& nFil, int& nCol){

for(int i=0; i<nFil; i++){
for(int j=0; j<nCol; j++){
cout<<"Introduce un numero para |"<<i<<"| |"<<j<<"|: ";
cin>>m[i][j];
}
}
}

void mostrarMatriz(int m[][10], int& nFil, int& nCol){

cout<<"\n\nLa matriz queda compuesta de la siguiente manera: ";
for(int i=0; i<nFil; i++){
cout<<"\n";
for(int j=0; j<nCol; j++){
cout<<"|"<<m[i][j]<<"|";
}
}
}

void matrizSimetrica(int m[][10], int& nFil, int& nCol){
int cont = 0;

for(int i=0; i<nFil; i++){
for(int j=0; j<nCol; j++){
if(m[i][j] == m[j][i]){
cont++;
}
}
}

if(cont == (nFil * nCol)){
cout<<"\nLa matriz es simetrica.";
}
else{
cout<<"\nLa matriz no es simetrica.";
}
}
5  Programación / Programación C/C++ / Re: Problemas para rellenar la matriz en: 28 Febrero 2019, 19:52 pm
Unos consejos geniales. Tomaré nota.

¿A qué te refieres con cambiar la función void pedirDatos() por void pedirDatos(int &nFil, int &nCol)?

Imagino que te refieres al paso de parámetros por referencia para así poder incluir las variables dentro del main.

Bien detectado el fallo de control típico de un novato (más aún si cabe  :xD) en la función matrizCuadrada.

Cómo no se iba a repetir si efectivamente tenía llamadas a la función en el main y en la propia función...  :-\

Perdona si he cometido errores en la publicación, aún tengo que familiarizarme.  :-\
6  Programación / Programación C/C++ / Problemas para rellenar la matriz en: 28 Febrero 2019, 09:42 am
Buenos días. El problema me surge a la hora de rellenar la matriz puesto que me pide dos veces que ingrese los datos. Os adjunto el ejercicio entero por si alguien quisiera echarle una ojeada.

Citar
/* 15. Desarrollar una función que determine si una matriz es simétrica o no.

Una matriz es simétrica: A = A^t

- La matriz debe ser cuadrada.
- Aij = Aji

|2   5   9|                       |2   5   9|
|5   8   -1|          ->          |5   8   -1|
|9   -1   10|                     |9   -1   10|

*/

#include <iostream>
#include <stdlib.h>

using namespace std;

void pedirDatos();
void matrizCuadrada(int, int);
void rellenarMatriz(int m[][10], int, int);
void mostrarMatriz(int m[][10], int, int);
void matrizSimetrica(int m[][10], int, int);

int m[10][10], nFil, nCol;

int main(){
   
   pedirDatos();
   matrizCuadrada(nFil, nCol);
   cout<<"\n";
   rellenarMatriz(m, nFil, nCol);
   mostrarMatriz(m, nFil, nCol);
   matrizSimetrica(m, nFil, nCol);
   cout<<"\n\n";
   
   system("pause");
   return 0;
}

void pedirDatos(){
   
   cout<<"Introduce el numero de filas de la matriz: ";
   cin>>nFil;
   cout<<"\nIntroduce el numero de columnas de la matriz: ";
   cin>>nCol;
}

void matrizCuadrada(int nFil, int nCol){
   
   if(nFil != nCol){
      cout<<"\nLa matriz debe ser cuadrada (ej. 4x4)";
      cout<<"\n\n";
      pedirDatos();
   }
   else rellenarMatriz(m, nFil, nCol);
}

void rellenarMatriz(int m[][10], int nFil, int nCol){
   
   for(int i=0; i<nFil; i++){
      for(int j=0; j<nCol; j++){
         cout<<"Introduce un numero para |"<<i<<"| |"<<j<<"|: ";
         cin>>m[j];
      }
   }
}

void mostrarMatriz(int m[][10], int nFil, int nCol){
   
   cout<<"\n\nLa matriz queda compuesta de la siguiente manera: ";
   for(int i=0; i<nFil; i++){
      cout<<"\n";
      for(int j=0; j<nCol; j++){
         cout<<"|"<<m[j]<<"|";
      }
   }
}

void matrizSimetrica(int m[][10], int nFil, int nCol){
   int cont = 0;
   
   for(int i=0; i<nFil; i++){
      for(int j=0; j<nCol; j++){
         if(m[j] == m[j]){
            cont++;
         }
      }
   }
   
   if(cont == (nFil * nCol)){
      cout<<"\nLa matriz es simetrica.";
   }
   else{
      cout<<"\nLa matriz no es simetrica.";
   }
}

Gracias por tu tiempo.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines