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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Selector de opciones (consola)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Selector de opciones (consola)  (Leído 3,138 veces)
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Selector de opciones (consola)
« en: 25 Julio 2014, 18:40 pm »

Hola a todos. Hace mucho que no hago alguna aportación por aquí, y por cutre que sea, voy a poner un selector de opciones, en el que no hay que elegir el número de la opción, sinó hay que mover el marcador con W y S. Bueno, aquí va:

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <conio.h>
  4. using namespace std;
  5.  
  6. class options{
  7.    vector<string> _options;
  8.    string _title;
  9.  
  10.    void coutTitle()const{
  11.        if(_title.size()==0) return;
  12.        vector<string> v;
  13.        string t = _title;
  14.        while(t.size()>80){
  15.            v.push_back(t.substr(0,80));
  16.            t.erase(0,80);
  17.        }
  18.        v.push_back(t);
  19.        while(v.size()>1){
  20.            cout << v[0];
  21.            v.erase(v.begin());
  22.        }
  23.        cout << string((80-v[0].size())/2,' ') << v[0] << endl << endl;
  24.    }
  25.  
  26. public:
  27.    options(){}
  28.    options(string title):_title(title){}
  29.    options(const options& o):_options(o.getOptions()),_title(o.getTitle()){}
  30.    void setTitle(string title){
  31.        _title = title;
  32.    }
  33.    string getTitle()const{
  34.        return _title;
  35.    }
  36.    vector<string> getOptions()const{
  37.        return _options;
  38.    }
  39.    string getOption(size_t i)const{
  40.        if(i<_options.size()) return _options[i];
  41.        return "";
  42.    }
  43.    void addOption(string option){
  44.        _options.push_back(option);
  45.    }
  46.    void addOptions(const vector<string>& v){
  47.        for(int i=0; i<v.size(); i++)
  48.            _options.push_back(v[i]);
  49.    }
  50.    void setOptions(const vector<string>& v){
  51.        _options = v;
  52.    }
  53.    int show()const{
  54.        int index = 0;
  55.        char c = 0;
  56.        while(c!='\r' && c!='\n'){
  57.            system("cls");
  58.            coutTitle();
  59.            for(int i=0; i<_options.size(); i++){
  60.                cout << '[' << (i==index?'X':' ') << "] " << _options[i] << endl;
  61.            }
  62.            c = getch();
  63.            if((c=='w' || c=='W') && index>0)
  64.                --index;
  65.            if((c=='s' || c=='S') && index<_options.size()-1)
  66.                ++index;
  67.        }
  68.        return index;
  69.    }
  70. };
  71.  
  72. int main(){
  73.    options op;
  74.    op.setTitle("Que querrias ser en otra vida?");
  75.    op.addOption("Un Dios.");
  76.    op.addOption("Un gobernador.");
  77.    op.addOption("Un pensador.");
  78.    op.addOption("Un trabajador.");
  79.    op.addOption("Un esclavo.");
  80.    cout << endl << endl << op.show();
  81. }

Se le pone un titulo, se le agregan las opciones, y se invoca .show(). Show retorna el índice de la opcion elegida.


Utilizo la función system("cls") y getch(). Quién las quiera cambiar por otras, es libre de hacerlo, este código no tiene copyright xD

Usé getch() de conio.h porque es la más rápida y sencilla.

Jeje esto lo hice hace unos 4 años, pero lo hice a lo cutre con 2 solas opciones (y me costó). Ahora, años después, he visto lo terriblemente sencilo que es jaja.

"Una vez más, la experiencia marca la aptitud."

Saludos, espero que a alguien le sea útil :p


En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Selector de opciones (consola)
« Respuesta #1 en: 25 Julio 2014, 19:59 pm »

No entiendo ni la mitad :/ Pero muy interesante el aporte ¡! Gracias por compartirlo ;)


En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Selector de opciones (consola)
« Respuesta #2 en: 25 Julio 2014, 20:11 pm »

La mitad son simples getters y setters. El resto, es el cout de las opciones.

Mmm me diste la idea de colgarlo en mi blog xDD
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Selector de opciones (consola)
« Respuesta #3 en: 25 Julio 2014, 20:59 pm »

Hola a todos. Hace mucho que no hago alguna aportación por aquí, y por cutre que sea, voy a poner un selector de opciones, en el que no hay que elegir el número de la opción, sinó hay que mover el marcador con W y S. Bueno, aquí va:
..........................................................................
Utilizo la función system("cls") y getch(). Quién las quiera cambiar por otras, es libre de hacerlo, este código no tiene copyright xD

Usé getch() de conio.h porque es la más rápida y sencilla.

Jeje esto lo hice hace unos 4 años, pero lo hice a lo cutre con 2 solas opciones (y me costó). Ahora, años después, he visto lo terriblemente sencilo que es jaja.

"Una vez más, la experiencia marca la aptitud."

Saludos, espero que a alguien le sea útil :p

;-) ;-) ;-)

Antes que nada un fuerte saludo ivancea96 y gracias por el aporte.

Bueno, ya que no tiene "copyright" espero que no te moleste que lo modifique un poco.

El objetivo es no usar conio.h y su acólita getch, en su defecto sí windows. h  :rolleyes:  y se controla el menú con las teclas de flechas UP y DOWN y por cierto, incluyo la librería cstdlib que se te paso  ;) . También uso una nueva variable "tam" para que no me dé warnings por comparar signed ("i", index"") con unsigned ("_options.size()") y ya de paso enumero las opciones:  :o

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <windows.h>
  5. using namespace std;
  6. int gotoxy(int x, int y);
  7.  
  8. class options{
  9.    vector<string> _options;
  10.    string _title;
  11.  
  12.    void coutTitle()const{
  13.        if(_title.size()==0) return;
  14.        vector<string> v;
  15.        string t = _title;
  16.        while(t.size()>80){
  17.            v.push_back(t.substr(0,80));
  18.            t.erase(0,80);
  19.        }
  20.        v.push_back(t);
  21.        while(v.size()>1){
  22.            cout << v[0];
  23.            v.erase(v.begin());
  24.        }
  25.        cout << string((80-v[0].size())/2,' ') << v[0] << endl << endl;
  26.    }
  27.  
  28. public:
  29.    options(){}
  30.    options(string title):_title(title){}
  31.    options(const options& o):_options(o.getOptions()),_title(o.getTitle()){}
  32.    void setTitle(string title){
  33.        _title = title;
  34.    }
  35.    string getTitle()const{
  36.        return _title;
  37.    }
  38.    vector<string> getOptions()const{
  39.        return _options;
  40.    }
  41.    string getOption(size_t i)const{
  42.        if(i<_options.size()) return _options[i];
  43.        return "";
  44.    }
  45.    void addOption(string option){
  46.        _options.push_back(option);
  47.    }
  48.    void addOptions(const vector<string>& v){
  49.        for(size_t i=0; i<v.size(); i++)
  50.            _options.push_back(v[i]);
  51.    }
  52.    void setOptions(const vector<string>& v){
  53.        _options = v;
  54.    }
  55.    int show()const{
  56.        int index = 0;
  57.        while(1){
  58.            gotoxy (0,1);
  59.            Sleep(100);
  60.            //system("cls");
  61.            coutTitle();
  62.            int tam=_options.size();
  63.            char indice ;
  64.            for(int i=0; i<tam; i++){
  65.                indice =  i+'0';
  66.                cout << '[' << (i==index?'X':indice) << "] " << _options[i] << endl;
  67.            }
  68.            if(GetAsyncKeyState(VK_UP) && index>0){
  69.              --index;
  70.            }
  71.            else if(GetAsyncKeyState(VK_UP) && index==0){
  72.              index=_options.size()-1;
  73.            }
  74.            else if(GetAsyncKeyState(VK_DOWN) && index<tam-1){
  75.              ++index;
  76.            }
  77.            else if(GetAsyncKeyState(VK_DOWN) && index==tam-1){
  78.              index=0;
  79.            }
  80.            else if (GetAsyncKeyState(VK_RETURN)){
  81.              cin.get();
  82.              return index;
  83.            }
  84.        }
  85.    }
  86. };
  87.  
  88. int main(){
  89.    options op;
  90.    op.setTitle("Que querrias ser en otra vida?");
  91.    op.addOption("Un Dios.");
  92.    op.addOption("Un gobernador.");
  93.    op.addOption("Un pensador.");
  94.    op.addOption("Un trabajador.");
  95.    op.addOption("Un esclavo.");
  96.    cout << endl << endl << op.show();
  97.  
  98. }
  99.  
  100. int gotoxy(int x, int y){
  101.  COORD coord;
  102.  HANDLE h_stdout;
  103.  coord.X = x;
  104.  coord.Y = y;
  105.  if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  106.    return 0;
  107.  if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  108.    return 0;
  109.  return 1;
  110. }

Espero que no te disguste la modificación.  ;) ;) ;)

¡¡¡¡ Saluditos! ..... !!!!


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Selector de opciones (consola)
« Respuesta #4 en: 25 Julio 2014, 21:17 pm »

No puse el índice porque la finalidad de este selector era que el usuario no necesitase saber de numeritos xD

Y la cstdlib no la puse porque no la requería xD
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Selector de opciones (consola)
« Respuesta #5 en: 25 Julio 2014, 21:43 pm »

............................................................
Y la cstdlib no la puse porque no la requería xD

En mi caso está de más ya que uso windows.h, pero en tu caso ""creo" que es necesaria para el uso de "system":

Código
  1. error: 'system' was not declared in this scope

Pero es sólo una opinión, no quiero que te molestes por una nimiedad como ésta.  ;) ;)

Lo realmente importante es que es una aportación interesante. Me obligas a meterme de lleno en las "clases" de C++.
 
¡¡¡¡ Saluditos! ..... !!!!


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Selector de opciones (consola)
« Respuesta #6 en: 25 Julio 2014, 22:21 pm »

<iostream> ya me incluye el system.

Ahora estaba pensando en mostrar las opciones en una cuadrícula de 3xN. A ver si lo planteo. Hacer esta clase no me supo a nada xD
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Selector de opciones (consola)
« Respuesta #7 en: 26 Julio 2014, 00:06 am »

<iostream> ya me incluye el system.
......................................................

No lo dudo pero el error que te comenté en el anterior mensaje es lo que me indica a mí Code::Blocks, no así el Dev-C++.  :o

Como se trata de un aporte, que no hacer una tarea, espero que el moderador de turno no se tome a mal mi siguiente aportación, pequeña y humilde que no soy un experto en estas lides, y no la borre.  ;D

Y es que los seguidores de C nos quedamos si no desvalidos ya que la mayor parte de los portes son en C++.

En esencia es la misma propuesta de ivancea96, por no variar el tema, sólo que al ser en C hago uso de arrays en lugar de Clases. Nos movemos en el menú con las flechas UP y DOWN y se selecciona la opción con la flecha RIGHT. El menú se muestra en color invertido y a cada respuestas le corresponde un color diferente.   ;)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. void contraste ( int abajo ) ;
  6. int gotoxy ( int x , int y ) ;
  7. void Respuesta ( int Abajo ) ;
  8.  
  9. void color ( int n ) ;
  10.  
  11. const char *pregunta_respuesta [] = {
  12.  "1. Un Dios." ,       "*** Piensas a lo Grande ***" ,
  13.  "2. Un gobernador." , "*** Deseas Poder ***" ,
  14.  "3. Un pensador." ,   "*** Eres Sabio ***" ,
  15.  "4. Un trabajador." , "*** Menudo Currante estas hecho ***" ,
  16.  "5. Un esclavo." ,    "*** Eres Servil ***"
  17.  };
  18.  
  19. const int Color[] = { 30 , 62 , 181 , 45 , 123 } ;
  20.  
  21. int main (){
  22.  int i , abajo = 0 ;
  23.  puts ( "Que querrias ser en otra vida?" ) ;
  24.  for ( i = 0 ; i < 9 ; i += 2){
  25.    puts ( pregunta_respuesta [i] );
  26.  }
  27.  gotoxy (0,1);
  28.  while (1)    {
  29.    contraste ( abajo ) ;
  30.    if ( abajo > 4 ){
  31.      gotoxy (0,1) ;
  32.      abajo = 0 ;
  33.    }
  34.    else if ( abajo < 0 ){
  35.      gotoxy (0,5);
  36.      abajo = 4 ;
  37.    }
  38.    else if (GetAsyncKeyState(VK_ESCAPE))
  39.      {gotoxy (0,5);system("pause"); return 1;}
  40.  
  41.    else if (GetAsyncKeyState(VK_DOWN)){
  42.      contraste ( abajo );
  43.      gotoxy (0,abajo+1);
  44.      abajo++;
  45.      Sleep(100);
  46.    }
  47.    else if (GetAsyncKeyState(VK_UP)){
  48.      contraste ( abajo );
  49.      gotoxy (0,abajo-1);
  50.      contraste ( abajo);
  51.      abajo--;
  52.      Sleep(100);
  53.    }
  54.    else  if (GetAsyncKeyState(VK_RIGHT)){
  55.      Respuesta ( abajo ) ;
  56.      break ;
  57.    }
  58.  }
  59.  system ("pause");
  60.  return 0;
  61. }
  62.  
  63. int gotoxy(int x, int y){
  64.  COORD coord;
  65.  HANDLE h_stdout;
  66.  coord.X = x;
  67.  coord.Y = y;
  68.  if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  69.    return 0;
  70.  if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  71.    return 0;
  72.  return 1;
  73. }
  74.  
  75. void color (int n){
  76.        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  77. }
  78.  
  79. void contraste (int abajo){
  80.  int i ;
  81.  color (7) ;
  82.  gotoxy (0,0);
  83.  puts ("Que querrias ser en otra vida?");
  84.  for ( i = 0 ; i < 9 ; i+= 2){
  85.    color ( abajo == i / 2 ? 112 : 7 ) ;
  86.    puts ( pregunta_respuesta [i] );
  87.  }
  88.  color ( 7 ) ;
  89.  gotoxy (0,abajo-1);
  90.  Sleep(100);
  91. }
  92.  
  93. void Respuesta ( int Abajo ){
  94.  system ( "cls" ) ;
  95.  gotoxy (0,0) ;
  96.  color ( Color[Abajo] ) ;
  97.  puts ( pregunta_respuesta [2 * Abajo + 1] ) ;
  98.  color ( 7 ) ;
  99. }

¡¡¡¡ Saluditos! ..... !!!!



En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Selector de opciones (consola)
« Respuesta #8 en: 26 Julio 2014, 00:15 am »

Podrías convertirlo a una función del tipo:

Código
  1. int menu(char* titulo, char** opciones, int nOpciones);

Para poder reusarla más que nada xD

Y cabe decir, que yo también uso C::B. Es tema del MinGW usado.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Menu opciones anti-batch injections. Permite hasta 10 opciones.
Scripting
carlitos.dll 0 2,883 Último mensaje 7 Octubre 2008, 08:21 am
por carlitos.dll
Selector de Fechas para un jpanel
Java
marvic 5 6,246 Último mensaje 14 Abril 2009, 06:40 am
por Nakp
GIMP y el selector de color
Diseño Gráfico
Aikanáro Anário 2 2,947 Último mensaje 9 Mayo 2012, 10:35 am
por Saberuneko
Problema con selector de hijos (CSS)
Desarrollo Web
eduardo(...)brutaldeath 5 2,226 Último mensaje 2 Septiembre 2013, 16:13 pm
por Roboto
Error (en consola) al usar los botones de opciones BB
Sugerencias y dudas sobre el Foro
gAb1 2 2,799 Último mensaje 14 Noviembre 2015, 16:13 pm
por gAb1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines