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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8
41  Programación / Programación C/C++ / Re: [Ayuda] [C++] Juego de la víbora en: 15 Marzo 2013, 21:45 pm
¡Hombre muchas gracias!

Revisaré los recursos que me diste a ver qué tal me va. Estuve probando tu Snake y me gustó bastante aunque cuando entré a "Opciones" murió. ¿Tienes el source por ahí?

Saludos,
Wofo.
42  Programación / Programación C/C++ / [Ayuda] [C++] Juego de la víbora en: 15 Marzo 2013, 16:37 pm
Buenas, escribo porque estoy desarrollando el clásico juego de la víbora y estoy un poco confundido con el enfoque de orientiación a objetos que debo seguir.

Por un lado tengo el objeto Víbora y por el otro Comida. La víbora contiene un array de puntos (con lo que la puedo mostrar en pantalla) y la comida contiene un punto.

El movimiento de la víbora está controlado por el método Víbora::mover(), que funciona perfectamente. El problema es que desde ese método no puedo comprobar si la víbora pasa por encima de una comida (y, por lo tanto, se la come), porque el objeto Comida no está dentro de la clase víbora (está en el main).

Son dos objetos separados, como muestra el ejemplo.
Código
  1. int main() {
  2. Vibora vibora;
  3. Comida comida;
  4. }

Alternativas que se me ocurren:
-Comprobar desde el main si la víbora come algo (me da la impresión que es una solución sucia y que debe haber alguna otra mejor).
-Crear el objeto Comida dentro de la clase Víbora (sería como forzar la orientación a objetos ya que no existe relación entre Comida y Víbora).

Ambas alternativas me parecen malas. ¿Alguien tiene una mejor idea?

Espero haberme explicado bien. Si no, decidme y lo intento otra vez.

Muchas gracias,
Wofo.
43  Programación / Programación C/C++ / Re: [C++] [Aporte] Buscaminas por consola en: 15 Marzo 2013, 11:18 am
Me parece excelente la idea de crear una subclase. Acabo de hacerlo y de subir el code.

Las excepciones las hice usando la clase estándar runtime_exception (derivada de exception).

¡Muchas gracias!
44  Programación / Programación C/C++ / Re: [C++] [Aporte] Buscaminas por consola en: 12 Marzo 2013, 17:37 pm
Gracias amchacon por tus comentarios.

La verdad es que no me había dado cuenta de que ese "seed" estaba ahí. Habrá que eliminarlo.

Lo de las excepciones me parece una excelente idea, pero no entiendo por qué usas "struct" en vez de "class".

Por otro lado, meter el render dentro de la clase no me termina de convencer por la dificultad que significa procesar ese string para transformarlo en una interfaz visual. Creo que es excesivamente complicado (mucho más que usar los métodos que provee la clase Board). Quizá una buena alternativa sería crear una tercera clase que se llame Screen o algo por el estilo, donde esté el método render.

Gracias denuevo!
Wofo.
45  Programación / Programación C/C++ / [C++] [Aporte] Buscaminas por consola en: 11 Marzo 2013, 16:20 pm
Buenas gente, luego de algunos días trabajando en un buscaminas para aprender, les dejo el código para que lo puedan aprovechar.

Lo programé poniendo especial empeño en que fuera orientado a objetos y exclusivamente C++ (intenté no usar nada de C). También escribí muchos comentarios para que quede todo más claro y sea muy fácil de entender.

Espero que a alguien le sirva para aprender. Por lo menos a mí me sirvió bastante.

Una particularidad del programa es que, gracias a que está orientado a objetos, es posible crear una interfaz gráfica sin tener que modificar ni una sola línea de código dentro de las clases.

Conceptos implementados:
-Herencia
-Manejo de errores (excepciones)
-Uso de la clase vector
-Generación de números aleatorios



*Nota: este es un segundo upload con correcciones para mejorar el manejo de excepciones y una mejor orientación a objetos
Programa: Buscaminas
IDE: Ninguna (Notepad++) *Se puede compilar escribiendo g++ main.cpp -o archivo_compilado
Link: http://depositfiles.com/files/z79itfr7f

________

Por si alguien prefiere copiar el código en vez de descargarlo de depositfiles, lo dejo aquí también:
*Es importante guardar los archivos con el mismo nombre, para que funcionen los includes correctamente.

main.cpp
Código
  1. #include <iostream> //Necesario para mostrar el contenido por la consola
  2. #include <stdexcept> //Necesario para manejo de errores
  3. #include <cstdlib> //Necesario para rand() en la clase Random_Number
  4. #include <time.h> //Necesario para la clase Random_Number
  5. #include <vector> //Necesario para usar vectores
  6.  
  7. #include "console_board.cpp"
  8.  
  9. using namespace std;
  10.  
  11. int main() {
  12. try {
  13. Console_Board board;
  14. int level = -1;
  15.  
  16. //Menú principal
  17. cout << "Bienvenido al Buscaminas. Elige el nivel que deseas jugar" << endl
  18. << "1- Principiante" << endl
  19. << "2- Intermedio" << endl << endl
  20. << "Escribe el numero del nivel: ";
  21. cin >> level;
  22.  
  23. //Creo el nivel
  24. if(level == 2)
  25. board.create(16, 16, 40); //16x16 y 40 minas
  26. else
  27. board.create(9, 9, 10); //9x9 y 10 minas
  28.  
  29. //Muestro las instrucciones
  30. cout << endl << "--INSTRUCCIONES--";
  31. cout << endl << "Elegir un cuadrado: e x y (ejemplo: e 2 3).";
  32. cout << endl << "Marcar un cuadrado como mina: m x y (ejemplo: m 2 3). " << endl << endl;
  33.  
  34. system("pause");
  35.  
  36. //Preparo el game_loop y lo comienzo
  37. bool game_loop = true, victory = false;
  38. int x = 0, y = 0;
  39. char option = '-';
  40. while(game_loop == true && victory == false) {
  41. system("CLS");
  42. board.print();
  43. cout << "Minas restantes: " << board.get_left_mines() << endl;
  44. cout << "Ultima eleccion: " << option << ' ' << x << ", " << y << endl << endl;
  45. cout << "Comando: ";
  46. cin >> option >> x >> y;
  47. /*Por si no introdujo un número limpio el cin. De lo contrario, al introducir un string empieza a correr el while de modo infinito sin volver a preguntar por las coordenadas*/
  48. cin.clear(); cin.ignore(99,'\n');
  49. if(option == 'm')
  50. board.mark_square(x-1, y-1);
  51. else {
  52. board.choose_square(x-1, y-1);
  53. if( board.is_valid(x-1, y-1) && board.square(x-1, y-1).is_mine() ) game_loop = false;
  54. }
  55. if( board.no_squares_left() ) {
  56. board.mark_all_mines();
  57. victory = true;
  58. }
  59. }
  60.  
  61. //Muestro el tablero por última vez
  62. system("CLS");
  63. board.print();
  64. cout << endl << endl;
  65.  
  66. if(victory == false)
  67. cout << "Has perdido!";
  68. else
  69. cout << "Felicitaciones! Has ganado!";
  70.  
  71. cout << endl;
  72.  
  73. return 0;
  74. }
  75. catch(exception& ex) {
  76. cerr << "Se ha procucido un error: " << ex.what();
  77. return 1;
  78. }
  79. }

board.cpp
Código
  1. /* Clase Board.
  2.  * Maneja los elementos del juego Buscaminas. Consiste en un tablero (Board en inglés)
  3.  * que tiene cuadrados (Squares).
  4.  *
  5.  *
  6.  * Includes necesarios para el funcionamiento de esta clase
  7.  *
  8.  * #include <iostream>  | Para usar cout
  9.  * #include <vector>    | Para usar vector
  10.  * #include <stdexcept> | Para manejo de errores */
  11.  
  12. #include "square.cpp"
  13. #include "random_number.cpp"
  14.  
  15. class Board {
  16. std::vector< std::vector<Square> > squares;
  17. int width, height;
  18. int left_mines; //Minas que quedan (va descontando cuando el usuario marca una)
  19. int total_mines; //Cantidad de cuadrados que contienen una mina
  20. int total_number_squares; //Cantidad de cuadrados que contienen un número
  21. bool first_choosing;
  22.  
  23. //Métodos privados
  24. void set_size(int width, int height);
  25. void set_mines(int x, int y);
  26. void set_numbers();
  27. void show_empty_squares(int x, int y);
  28. int count_surrounding_mines(int x, int y);
  29. int shown_squares();
  30.  
  31. //Métodos públicos
  32. public:
  33. void create(int width, int height, int param_mines);
  34. void choose_square(int x, int y);
  35. void mark_square(int x, int y);
  36. void mark_all_mines();
  37.  
  38. bool is_valid(int x, int y);
  39. bool no_squares_left();
  40.  
  41. Square square(int x, int y);
  42. inline int get_width() { return width; }
  43. inline int get_height() { return height; }
  44. inline int get_left_mines() { return left_mines; }
  45. };
  46.  
  47. void Board::set_size(int param_width, int param_height) {
  48. //Asigna el tamaño al tablero
  49. //Condición: los argumentos deben ser positivos
  50. if(param_width <= 0 || param_height <= 0)
  51. throw std::runtime_error("No puedes crear un tablero con ancho o alto negativos.");
  52.  
  53. //Método de la clase vector que sirve para inicializarlo. En este caso creo un vector bidimensional con el ancho "param_width" y alto "param_height"
  54. squares.assign(param_width, std::vector<Square>(param_height));
  55.  
  56. //Guardo el tamaño del tablero en atributos para usarlo más tarde
  57. width = param_width;
  58. height = param_height;
  59. }
  60.  
  61. void Board::set_mines(int x, int y) {
  62. //Asigna las minas de manera aleatoria a partir del atributo total_mines
  63. //No se pone ninguna mina en el punto x, y
  64. Random_Number random_number = Random_Number();
  65. int x_aux;
  66. int y_aux;
  67.  
  68. for(int i = 0; i < total_mines;) {
  69. x_aux = random_number.get(0, width-1);
  70. y_aux = random_number.get(0, height-1);
  71.  
  72. if( !squares[x_aux][y_aux].is_mine() && !squares[x][y].is_mine() ) {
  73. //Si el punto aleatorio no es mina NI el punto entregado como argumento.
  74. squares[x_aux][y_aux].set_mine();
  75. ++i;
  76. }
  77. }
  78. }
  79.  
  80. void Board::set_numbers() {
  81. //Calcula y guarda los números que van en el tablero (y que indican el número de minas que hay alrededor de un cuadrado)
  82. for(int x = 0; x < width; ++x)
  83. for(int y = 0; y < height; ++y) {
  84. //Con estos dos for recorro el tablero completo (se toman todas las combinaciones posibles de x e y)
  85.  
  86. if( !squares[x][y].is_mine() )
  87. //Si el cuadrado actual es una mina no es necesario asignarle un número.
  88. //Si no es una mina, cuento las minas alrededor y le asigno un número.
  89. //Recordar que x, y son las coordenadas del punto
  90. squares[x][y].set_value( count_surrounding_mines(x, y) );
  91. }
  92. }
  93.  
  94. void Board::show_empty_squares(int x, int y) {
  95. //Función recursiva que revisa si un cuadrado está vacío y lo muestra. En caso afirmativo revisa los que lo rodean y así sucesivamente.
  96. if(is_valid(x, y) && squares[x][y].get_value() == 0 && squares[x][y].is_hidden()) {
  97. squares[x][y].show();
  98. for(int x_axis = x-1; x_axis <= x+1; ++x_axis)
  99. for(int y_axis = y-1; y_axis <= y+1; ++y_axis) {
  100. //Con estos dos for puedo moverme por los 8 cuadrados circundantes
  101. if(is_valid(x_axis, y_axis) && squares[x_axis][y_axis].get_value() > 0 && !squares[x][y].is_mine())
  102. //Muestro los números que hayan
  103. squares[x_axis][y_axis].show();
  104. show_empty_squares(x_axis, y_axis);
  105. }
  106. }
  107. }
  108.  
  109. int Board::count_surrounding_mines(int x, int y) {
  110. //Cuenta el número de minas alrededor de un punto
  111. //Condición: el punto debe estar dentro del tabelero
  112. if( !is_valid(x, y) )
  113. throw std::runtime_error("No puedes contar las minas alrededor de un punto que se encuentra fuera del tablero.");
  114.  
  115. int count = 0;
  116. for(int x_axis = x-1; x_axis <= x+1; ++x_axis)
  117. for(int y_axis = y-1; y_axis <= y+1; ++y_axis)
  118. /*Recorro los 9 puntos, incluyendo el del centro. Pierdo un mínimo de eficiencia, pero el código queda más ordenado. Además, sé que el número del centro no es una mina, por lo que el resultado de la función no cambia*/
  119. if( is_valid(x_axis, y_axis) && squares[x_axis][y_axis].is_mine() )
  120. ++count;
  121. return count;
  122. }
  123.  
  124. int Board::shown_squares() {
  125. int total = 0;
  126.  
  127. for(int x = 0; x < width; ++x)
  128. for(int y = 0; y < height; ++y)
  129. if( !squares[x][y].is_hidden() && !squares[x][y].is_mine() )
  130. ++total;
  131.  
  132. return total;
  133. }
  134.  
  135. void Board::create(int param_width, int param_height, int param_mines) {
  136. //Crea el tablero de buscaminas con el tamaño adecuado, asigna las minas y asigna los números.
  137. //Condición: los argumentos deben ser positivos (se comprueba en las otras funciones)
  138. //Condición: la cantidad de minas debe ser positiva (se comprueba aquí)
  139. if(param_mines < 0) throw std::runtime_error("No puedes crear un tablero con un número negativo de minas");
  140. set_size(param_width, param_height); //Asigna al tablero el tamaño adecuado
  141. left_mines = param_mines;
  142. total_mines = param_mines;
  143. total_number_squares = param_width*param_height - param_mines;
  144. first_choosing = true;
  145. }
  146.  
  147. void Board::choose_square(int x, int y) {
  148. //Hace que el cuadrado elegido muestre su contenido.
  149. //Si el punto x, y está fuera del tablero, la función no hace nada.
  150. if( is_valid(x, y) ) {
  151. if( first_choosing ) {
  152. //Si es la primera vez que se elige un número, pongo las minas excepto en ese lugar y luego proceso la elección.
  153. //De esta manera se hace imposible perder en la primera jugada (es imposible elegir una mina el primer turno)
  154. set_mines(x, y);
  155. set_numbers();
  156. first_choosing = false;
  157. }
  158.  
  159. if(squares[x][y].get_value() == 0)
  160. //Si el cuadrado elegido está vacío (sin minas ni números)
  161. show_empty_squares(x, y);
  162. else
  163. //Si es un número o una mina
  164. squares[x][y].show();
  165. //En ambos casos, si el cuadrado estaba marcado como mina sumo uno al número de minas restantes
  166. if( squares[x][y].is_marked() ) ++left_mines;
  167. }
  168. }
  169.  
  170. void Board::mark_square(int x, int y) {
  171. //Marca un cuadrado con un signo para ayudar al usuario a identificar minas.
  172. //La función no hace nada si el punto x, y: está fuera del tablero / no está oculto / ya está marcado
  173. if( is_valid(x, y) && squares[x][y].is_hidden() && !squares[x][y].is_marked() ) {
  174. squares[x][y].mark();
  175. --left_mines;
  176. }
  177. }
  178.  
  179. void Board::mark_all_mines() {
  180. //Marca todas las minas que no estén marcadas. Así, cuando el usuario gana las puede ver en el tablero.
  181. for(int x = 0; x < width; ++x)
  182. for(int y = 0; y < height; ++y)
  183. if( squares[x][y].is_mine() )
  184. squares[x][y].mark();
  185. left_mines = 0;
  186. }
  187.  
  188. bool Board::no_squares_left() {
  189. //Calcula el número de cuadrados que están ocultos y no son minas. Devuelve true si no queda ninguno.
  190. return shown_squares() == total_number_squares;
  191. }
  192.  
  193. bool Board::is_valid(int x, int y) {
  194. //Devuelve true si el punto está dentro del tablero y false si no lo está
  195. return (-1 < x && x < width) && (-1 < y && y < height);
  196. }
  197.  
  198. Square Board::square(int x, int y) {
  199. //Función que retorna el objeto "Square" dadas las coordenadas x e y.
  200. //Condición: las coordenadas deben apuntar a un "Square" existente.
  201. if( !is_valid(x, y) )
  202. throw std::runtime_error("Board::square no acepta coordenadas de puntos inexistentes.");
  203. return squares[x][y];
  204. }

console_board.cpp
Código
  1. /* Clase Console_Board derivada de la clase Console
  2.  * Añade el método "print", que permite mostrar el tablero por consola */
  3.  
  4. #include "board.cpp"
  5.  
  6. class Console_Board : public Board {
  7. public: void print();
  8. };
  9.  
  10. void Console_Board::print() {
  11. std::cout << "     ";
  12. for(int i = 0; i < get_width(); ++i) {
  13. if(i < 9)
  14. std::cout << "  " << i+1;
  15. else
  16. std::cout << " " << i+1;
  17. }
  18. std::cout << std::endl << "     ";
  19. for(int i = 0; i < get_width(); ++i)
  20. std::cout << "___";
  21. std::cout << std::endl;
  22.  
  23. //Imprime los números de la izquierda (coordenadas del eje y)
  24. for(int y = 0; y < get_height(); ++y) {
  25.  
  26. if(y < 9)
  27. std::cout << "  " << y+1 << " |";
  28. else
  29. std::cout << ' ' << y+1 << " |";
  30.  
  31. //Imprimo el contenido del tablero. Es necesario que este for esté dentro del anterior.
  32. for(int x = 0; x < get_width(); ++x)
  33. if( square(x, y).is_hidden() ) {
  34. if( square(x, y).is_marked() ) std::cout << "  #";
  35. else std::cout << "  *";
  36. }
  37. else if(square(x, y).get_value() == 0) std::cout << "   ";
  38. else if(square(x, y).get_value() == 9) std::cout << "  X";
  39. else std::cout << "  " << square(x, y).get_value();
  40. std::cout << "\n\n";
  41. }
  42. }

square.cpp
Código
  1. /* Clase Square
  2.  * El tablero (clase Board) se forma a partir de cuadrados (clase Square).
  3.  * Un cuadrado puede contener una mina o un número. */
  4.  
  5. class Square {
  6. //Atributos
  7. int value;
  8. bool hidden;
  9. bool marked;
  10.  
  11. //Métodos públicos
  12. public:
  13. Square();
  14. inline int get_value() { return value; }
  15. inline bool is_mine() { return value == 9; }
  16. inline bool is_hidden() { return hidden; }
  17. inline bool is_marked() { return marked; }
  18. inline void set_mine() { value = 9; } //Asigna al cuadrado el valor correspondiente a una mina
  19. inline void set_value(int number) { value = number; }
  20. inline void show() { hidden = false; }
  21. inline void mark() { marked = true; }
  22. };
  23.  
  24. Square::Square() {
  25. //Esconde el valor del cuadrado (así, todo cuadrado que se crea viene escondido)
  26. hidden = true;
  27. marked = false;
  28. }

random_number.cpp
Código
  1. /* Clase Random_number
  2.  * Simplifica el cálculo de números "aleatorios"
  3.  *
  4.  *
  5.  * Includes necesarios para que esta clase funcione
  6.  * #include <cstdlib> -> Para usar rand()
  7.  * #include <time.h> -> Para usar time_t y time() */
  8.  
  9. class Random_Number {
  10. public:
  11. Random_Number();
  12. int get(int min, int max);
  13. };
  14.  
  15. Random_Number::Random_Number() {
  16. //Proceso necesario para después generar números (no entiendo exactamente cómo funciona)
  17. time_t seconds; time(&seconds);
  18. srand((unsigned int)seconds);
  19. }
  20.  
  21. int Random_Number::get(int min, int max) {
  22. //Devuelver un número "aleatorio" entre el rango dado
  23. return rand() % (max - min + 1) + min;
  24. }
46  Programación / Programación General / Re: ¿Qué tan importante es C++? en: 1 Marzo 2013, 10:02 am
Muchísimas gracias por las respuestas.

Ya me he hecho una idea más clara del asunto. Aprenderé C++. He empezado a leer un libro de Bjarne Stroustrup (creador de C++) que es impresionante.

Saludos y gracias de nuevo,
Wofo.
47  Programación / Programación General / Re: que lenguaje de programcion deberia aprender en: 26 Febrero 2013, 21:17 pm
C++ es un excelente lenguaje y existen muchísimos libros.

Uno escrito por uno de los creadores del lenguaje se llama "Programming: Principles and Practice using C++" (Bjarne Stroustrup). Puedes encontrarlo en .pdf si sabes buscar. Te advierto que tiene alrededor de 1000 páginas.

Una cosa importante es que C es DISTINTO de C++. No conviene aprender a programar en C/C++, sino en C o en C++ (en mi caso te recomiendo C++ porque es orientado a objetos y eso hace que el código que escribas sea más fácil de entender).

Saludos,
Wofo.
48  Programación / Programación General / ¿Qué tan importante es C++? en: 26 Febrero 2013, 21:05 pm
Buenas gente, espero que la pregunta no suene demasiado tonta.

Estoy un poco confundido respecto de la importancia de el lenguaje C++, principalmente porque en mi universidad no se enseña. Eso me lleva a pensar que la importancia del lenguaje no es tanta como creía (si fuera importante, lo enseñarían... ¿o no?

Me gustaría saber cuál es la importancia de C++ para la gente que se dedica profesionalmente a la programación, no solo por hobby. Quizá sea más útil recurrir a alguna de las muchísimas alternativas de más alto nivel como Java y C#, con las que (aparentemente) el desarrollo de un programa para una empresa -por poner un ejemplo- podría ser mucho más sencillo sin perder demasiado en rendimiento. ¿Es esto tan así?

¿Cuál es la ventaja de aprender C++? Me imagino que una gran ventaja es que proporciona fundamentos muy sólidos de programación. Pero, ¿hay alguna otra?

¡Anímense a opinar!

Saludos,
Wofo.
49  Sistemas Operativos / Windows / Imposible recuperar Windows XP tras haber instalado Windows 8 en: 12 Noviembre 2012, 23:12 pm
Buenas, escribo porque tengo un netbook Dell Inspiron Mini 1012 en el cual instalé Windows 8 para experimentar y ahora que quiero volver al XP que traía de fábrica no lo consigo.

Me parece que el computador tiene una partición oculta en la que hay un respaldo del sistema operativo para dejar todo como si viniera de fábrica. Lo usé varias veces cuando tenía Windows XP, presionando la tecla F11 antes de que partiera Windows. Era una excelente manera de formatear, ya que viene con todos los drivers y el netbook no tiene lector de CD.

El problema es que ahora, con Windows 8, no importa cuántas veces aprete el F11 al encender el computador, simplemente no se inicia la utilidad de restauración del sistema. Lo más que he conseguido es que empiece a sonar el parlante de la tarjeta madre de tanto apretar teclas.

Una posible causa es que tal vez no existía una partición oculta sino que los datos estaban en la misma partición que el XP pero murieron. Creo que esto es improbable.

Otra idea que se me ocurrió es que quizá lo de presionar F11 para lanzar la utilidad de restauración estaba guardado en la partición de XP. Es decir, existe una partición oculta con los datos de restauración, pero no puedo acceder a ella porque el comando para acceder no es reconocido por el computador.

La duda entonces es, ¿cómo acceder a dicha partición?

Muchas gracias,
Wofo.
50  Seguridad Informática / Wireless en Linux / [Duda] Backtrack en máquina virtual en: 3 Febrero 2012, 17:59 pm
Buenas, tengo la siguiente duda: ¿es posible usar backtrack en VirtualBox para obtener claves WEP? ¿es lo mismo que instalarlo como S.O. normal?
He buscado en google y he encontrado información contradictoria... Espero que alguien pueda ayudarme.

Saludos,
Wofo.
Páginas: 1 2 3 4 [5] 6 7 8
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines