Autor Tema: mover texto o palabras por pantalla consola con C++ matriz de 10x10 (cplusplus)  (Leído 19511 veces)

UmbraNoche

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
Buenas gente, les escribo para saber si me pueden dar una mano, con este problema. De antemano les doy las gracias. Soy nuevo en C++ así que las disculpas anticipadas si mi código fuente está pesimo  ;D

Necesito inicialiazar un arreglo de 10x10 con los caracteres AAAA, CCC, FFFF, NNNNN. Yo he declarado mi arreglo de tipo string no sé si es lo correcto para lo que voy hacer, me corrigen por favor si estoy mal. La idea es que los elementos se muevan de forma aleatoria por toda la matriz de 10x10 tanto en vertical como en horizontal. Que aparezcan de la siguiente manera en pantalla:

AAAA
               FFFF
      C
      C           N
      C           N
                   N
                   N
                   N
     
No sé si para hacer eso debo declarar variables de tipo string para cada elemento por ejemplo: string A ("AAAA"); y luego meter cada variable string a la matriz de 10x10. Y si es así me pueden decir cómo se hace eso porque lo he estado intentando sin tener exito.

Aquí les dejo lo que he estado haciendo, gracias de nuevo

Código: [Seleccionar]
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;

int main(){

    srand(time(NULL));

    int posiciones[100];

    string letras [10][10] = {{"AAAA"}, {"CCC"}, {"FFFF"}, {"NNNNN"}};

    random_shuffle(posiciones, posiciones + 100);

    for(int fila = 0; fila < 10; fila++){
        for(int columna = 0; columna < 10; columna++)
            letras [fila][columna] = posiciones[100];

    }

    for(int f = 0; f < 10; f++){
        for(int c = 0; c < 10; c++)
            cout << letras[f][c];

        cout << endl;
    }

    return 0;

}
« Última modificación: 11 de Mayo 2015, 19:07 por Alex Rodríguez »
"Si tienes un sueño entonces aferrate a el con constancia, sacrificio y dedicación".

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Duda sobre matriz de 10x10
« Respuesta #1 en: 06 de Febrero 2015, 08:49 »
Hola, si eres nuevo en C++ no parece un problema sencillo para alguien que esté empezando porque hay que manejar varios conceptos al mismo tiempo

Un ejemplo de texto que se mueve es este:

Código: [Seleccionar]
#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<string>
#include<vector>
using namespace std;

void moveText();
void tailName();
void tailArrow();
void showTimes();
void userString();
void setSpeed();
void display();
void dispMenu();

int index1 , index2, index3, counter1, counter2, counter3, textT, size, speed;
string Name[78], tempString[78], Right[78], Left[78];
vector<string> temp_userString;


int main()
{
    int userChoice;

    do{
    dispMenu();
    cin >> userChoice;
        switch(userChoice){
            case 1:
                system("cls");
                moveText();
                tailName();
                tailArrow();

                showTimes();
                userString();

                display();
                break;
            case 2:
                system("cls");
                setSpeed();
                break;
            case 3:
                system("cls");
                break;
            case 0:
                system("cls");
                cout << "You exited the program." << endl;
                break;
            default:
                system("cls");
                cout << "Error: Undefind choice." << endl;
                break;
        }
    }while(userChoice != 0);

    return 0;
}

void dispMenu(){
    cout << "=======================" << endl;
    cout << "Enter 0 to exit." << endl;
    cout << "Enter 1 to start." << endl;
    cout << "Enter 2 set speed." << endl;
    cout << "Enter 3 to clear screen." << endl;
    cout << "Your choice: ";
}

void moveText()
{
    size = 78;
    counter1 = 0;
    counter2 = 0;
    counter3 = 0;
    speed = 130000;
}

void setSpeed(){
    int tempSpeed;
    cout << "Enter 0 for default." << endl;
    cout << "Enter 1 for fast." << endl;
    cout << "Enter 2 for middle." << endl;
    cout << "Enter 3 for slow." << endl;
    cin >> tempSpeed;

    system("cls");

    switch(tempSpeed){
        case 1:
            speed = 70000;
            break;
        case 2:
            speed = 300000;
            break;
        case 3:
            speed = 500000;
            break;
        default:
            speed = 130000;
            break;
    }
}

void tailName(){
    Name[28] = "A";
    Name[29] = "n";
    Name[30] = "d";
    Name[31] = "a";
    Name[32] = "m";
    Name[33] = "_";
    Name[34] = "J";
    Name[35] = "_";
    Name[36] = "A";
    Name[37] = "z";
    Name[38] = "i";
    Name[39] = "z";
    Name[40] = "_";
    Name[41] = ":";
    Name[42] = "_";
    Name[43] = "U";
    Name[44] = "S";
    Name[45] = "H";
    Name[46] = "_";
    Name[47] = "C";
    Name[48] = "S";
    Name[49] = "D";

    for(index1 = 0 ; index1 < size ; index1++){
        if(index1 < 28 || index1 > 49){
            Name[index1] = "_";
        }
    }
}

void tailArrow(){
    for(index1 = 0 ; index1 < size ; index1++){
        if(index1 % 2 == 0){
            Right[index1] = "-";
            Left[index1] = "<";
        }else{
            Right[index1] = ">";
            Left[index1] = "-";
        }
        tempString[index1] = " ";
    }
}

void showTimes(){
    cout << "How many times you want to show the text: ";
    cin >> textT;
    system("cls");
}

void userString(){
string tempUser_input = "", stringHolder ="";
    temp_userString.resize(0);
    int i, j;

    counter3 = 0;
    i = 0;

    cout << "Enter your string." << endl;
    cout << "Enter null to stop inputing." << endl;
    do{
        cin >> tempUser_input;
        if(tempUser_input != "null" && tempUser_input != "Null" && tempUser_input != "NULL"){
            temp_userString.push_back(tempUser_input);
            tempUser_input = " ";
            temp_userString.push_back(tempUser_input);

            for(string::iterator it=temp_userString[i].begin(); it!=temp_userString[i].end(); ++it){
                counter3++;
            }

            i++;

            for(string::iterator it=temp_userString[i].begin(); it!=temp_userString[i].end(); ++it){
                counter3++;
            }
        }else{
            break;
        }

        i++;
    }while(counter3 <= size);

    j = ((size/2) - (counter3/2));
    for(i = 0; i < temp_userString.size() ; i++){
        stringHolder ="";

        for(string::iterator it=temp_userString[i].begin(); it!=temp_userString[i].end(); ++it){
            if(j >= size){
                cout << "Error: You inputed alot." << endl;
                goto end;
            }

            j++;
            stringHolder = *it;
            tempString[j] = stringHolder;
        }
    }
    end: cout << endl << endl;
}


void display(){
    counter1 = size;
    counter2 = size;
    for(index1 = 1; index1 <= textT; index1++){
        for(index2 = 0; index2 <= size ; index2++){
            for(index3 = counter2; index3 < size ; index3++){
                cout << Name[index3];
            }

            cout << endl;

            for(index3 = counter2; index3 < size ; index3++){
                cout << Right[index3];
            }

            cout << endl;

            for(index3 = counter2; index3 < size ; index3++){
                cout << tempString[index3];
            }

            counter2--;
            usleep(speed);
            system("cls");
        }

        counter2 = 0;
        for(index2 = 0; index2 <= size ; index2++){
            for(index3 = counter2; index3 < size ; index3++){
                cout << Name[index3];
            }

            cout << endl;

            for(index3 = counter2; index3 < size ; index3++){
                cout << Left[index3];
            }

            cout << endl;

            for(index3 = counter2; index3 < size ; index3++){
                cout << tempString[index3];
            }

            counter2++;
            usleep(speed);
            system("cls");
        }
        counter2 = counter1;
    }
}

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:mover texto o palabras por pantalla con C++ matriz de 10x10
« Respuesta #2 en: 06 de Febrero 2015, 08:55 »
Y este es otro ejemplo usando gotoxy y scroll:

Código: [Seleccionar]
#include <iostream>
#include <windows.h>
#include <time.h>

using namespace std;

void wait (int seconds); // timer
void clrscr (); // clear the screen
void gotoxy(int x, int y); // move to specific position in console
void scroll (char *s, int x); // scroll a line of text

int main()
{
    // call our scroll function with the string and the y coordinate
    scroll ("Hola esto es una cadena de texto.\n",30);
    scroll("Y esto es otra cadena que tambien se mueve", 35);
    return 0;
}

// wait a period of time
void wait ( double seconds )
{
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}
}

// clear the screen
void clrscr ()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // gets the window handle
    COORD coord = {0, 0}; // sets coordinates to 0,0
    DWORD count;

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi); // gets the buffer info (screen)

    // fill all characters as ' ' (empty the screen)
    FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

    // resets the cursor position
    SetConsoleCursorPosition(hStdOut, coord);
}

// move to a specific point in the console window
void gotoxy (int x, int y)
{
    COORD coord; // coordinates
    coord.X = x; coord.Y = y; // X and Y coordinates
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // moves to the coordinates
}

void scroll (char *s, int x)
{
    // loops and leaves some space at the top/bottom border
    for (int i = 19; i >= 5; i--)
    {
        gotoxy (x,i); // move up one line
        cout << s; // output the string
        wait(0.5); // wait one second
        clrscr (); // clear the screen
    }
}

UmbraNoche

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
Re:mover texto o palabras por pantalla con C++ matriz de 10x10
« Respuesta #3 en: 06 de Febrero 2015, 18:47 »
Muchas gracias Alex de verdad que me ayudaste mucho, ahora ya tengo como partir con este proyecto. Comparto lo que dices tú, ese problema está muy avanzado para alguien que apenas inicia a programar. Lamentablemente el profesor del curso de C++ no piensa igual. Varios amigos del curso y yo estamos apelando este proyecto por su complejidad. De nuevo muchas gracias Alex. Cualquier duda estaré subiendola al foro.
« Última modificación: 06 de Febrero 2015, 20:27 por Alex Rodríguez »
"Si tienes un sueño entonces aferrate a el con constancia, sacrificio y dedicación".

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".