Ir ao conteúdo
  • Cadastre-se

C++ Como imprimir uma matriz com gotoxy?


Posts recomendados

aqui um exemplo:

#include <iostream>

using namespace std;

void gotoxy(int x, int y)
{
    cout << "\033[" << y << ";" << x <<"H";
}
int main()
{
    int matriz[4][4] = {{1, 2, 3, 4},
                       {4, 3, 2, 1},
                       {1, 2, 3, 4},
                       {4, 3, 2, 1}};
                       
    for (int x = 0; x < 4; x++)
        for (int y = 0; y < 4; y++)
        {
            gotoxy (x+1, y+1);
            cout << matriz[x][y];
        }

    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

void gotoxy(int x,int y ) {
    COORD coord;
    coord.X = (short)x;
    coord.Y = (short)y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    \
}

void imp() {
    cout<<"\t°°°°\n";
    cout<<"\t°   °\n";
    cout<<"\t°   °   °   °    °    °°°     °°°\n";
    cout<<"\t°°°°    °   °°   °   °       °   °\n";
    cout<<"\t°   °   °   ° °  °   °  °°   °   °\n";
    cout<<"\t°   °   °   °  ° °   °   °   °   °\n";
    cout<<"\t°°°°    °   °   °°    °°°     °°°\n\n";

}

void nomes(char nome1[],char nome2[], char nome3[], char nome4[], char nome5[]) {
    imp();
    cout<<"Digite o nome do jogador da cartela 1:";
    cin.getline (nome1,256);
    cout<<"Digite o nome do jogador da cartela 2:";
    cin.getline (nome2,256);
    cout<<"Digite o nome do jogador da cartela 3:";
    cin.getline (nome3,256);
    cout<<"Digite o nome do jogador da cartela 4:";
    cin.getline (nome4,256);
    cout<<"Digite o nome do jogador da cartela 5:";
    cin.getline (nome5,256);
    system("cls");

}

void organiza(int num[][5]) {
    for(int i=0; i<5; i++) {
        for(int j= 4; j>=0; j--) {
            for(int k= j-1; k>=0; k--) {
                if(num[i][j]< num[i][k]) {
                    int l= num[i][j];
                    num[i][j]= num[i][k];
                    num[i][k]=l;
                }
            }
        }
    }
}
int existe(int matA[][5], int i, int j) {
    for (int k = 0; k <= i; k++) {
        for (int l = 0; l < j; l++) {
            if (matA[i][j] == matA[k][l]) {
                return 1;
            }
        }
    }
    return 0;
}
int existevet(int vetA[], int i) {
    for (int j = 0; j < 5; j++) {
        if (vetA[i] == vetA[j]) {
            return 1;
        }
    }
    return 0;
}

bool Existe(int valores[], int valor) {
    for(int i = 0; i<75; i++) {
        if(valores[i]==valor)
            return true;
    }
    return false;
}
void imprime(int matA[][5],int x,int y) {


    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {


       
                cout<<" "<<matA[i][j];


        }
         y++;
        cout<<"\n";




    }
}
void imp(int matA[][5],int matB[][5],int matC[][5],int matD[][5],int matE[][5],char nome1[],char nome2[],char nome3[],char nome4[],char nome5[]) {
    cout<<"CARTELA 1 NOME: "<<nome1<<endl;
    imprime(matA,10,1);
   



}


void GeraAleatorios(int numeros[],int matA[][5],int matB[][5],int matC[][5],int matD[][5],int matE[][5],char nome1[],char nome2[],char nome3[],char nome4[],char nome5[]) {
    srand(time(NULL));

    int v,bingo=0,bingo2=0,bingo3=0,bingo4=0,bingo5=0;
    for(int k=0; k<75; k++) {
        imp(matA,matB,matC,matD,matE,nome1,nome2,nome3,nome4,nome5);
        v = 1+rand() % 75;
        while(Existe(numeros,v)) {
            v = 1+rand() % 75;
        }
        numeros[k] = v;
        cout<<"\n"<<numeros[k];
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if(matA[i][j]==numeros[k]) {

                    bingo++;
                }
                if(bingo==25) {
                    cout<<"bingo jogador 1";
                    system("pause");

                }



                if(matB[i][j]==numeros[k]) {

                    bingo2++;
                }
                if(bingo2==25) {
                    cout<<"bingo jogador 2";
                    system("pause");

                }
                if(matC[i][j]==numeros[k]) {

                    bingo3++;
                }
                if(bingo3==25) {
                    cout<<"bingo jogador 3";
                    system("pause");

                }
                if(matD[i][j]==numeros[k]) {

                    bingo4++;
                }
                if(bingo4==25) {

                    cout<<"bingo jogador 4";
                    system("pause");

                }
                if(matE[i][j]==numeros[k]) {

                    bingo5++;
                }
                if(bingo5==25) {
                    cout<<"bingo jogador 5";
                    system("pause");

                }

            }
        }

        _sleep(1000);
        system("cls");


    }

}


void gera(int matA[][5]) {
    int Limite;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if(i==0) {
                Limite =1;
            }
            if(i==1) {
                Limite =16;
            }
            if(i==2) {
                Limite =31;
            }
            if(i==3) {
                Limite =46;
            }
            if(i==4) {
                Limite =61;
            }
            while (1) {
                matA[i][j]= Limite + rand() % 15;
                if (!existe(matA, i, j))
                    break;
            }
        }
    }
}

int main() {
    srand(time(NULL));
    char nome1[256], nome2[256],  nome3[256],  nome4[256],  nome5[256];
    int matA[5][5],matB[5][5],matC[5][5],matD[5][5],matE[5][5];
    int vet[75];



    nomes( nome1, nome2,nome3,nome4,nome5);
    gera(matA);
    organiza(matA);
    gera(matB);
    organiza(matB);
    gera(matC);
    organiza(matC);
    gera(matD);
    organiza(matD);
    gera(matE);
    organiza(matE);

    GeraAleatorios(vet,matA,matB,matC,matD,matE,nome1, nome2,nome3,nome4,nome5);





    return 0;
}

 

adicionado 2 minutos depois

eu quero que imprima a matriz com 5 linha e com 5 colunas

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Felipe Hoffmeister    seu gotoxy reversa com uma barra reversa atrapalhando tudo ,  veja se resolveu :

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
using namespace std;
void gotoxy_2(int x,int y ){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void imp(){
    cout<<"\t°°°°\n";
    cout<<"\t°   °\n";
    cout<<"\t°   °   °   °    °    °°°     °°°\n";
    cout<<"\t°°°°    °   °°   °   °       °   °\n";
    cout<<"\t°   °   °   ° °  °   °  °°   °   °\n";
    cout<<"\t°   °   °   °  ° °   °   °   °   °\n";
    cout<<"\t°°°°    °   °   °°    °°°     °°°\n\n";

}
void nomes(char nome1[],char nome2[], char nome3[], char nome4[], char nome5[]) {
    imp();
    cout<<"Digite o nome do jogador da cartela 1:";
    cin.getline (nome1,256);
    cout<<"Digite o nome do jogador da cartela 2:";
    cin.getline (nome2,256);
    cout<<"Digite o nome do jogador da cartela 3:";
    cin.getline (nome3,256);
    cout<<"Digite o nome do jogador da cartela 4:";
    cin.getline (nome4,256);
    cout<<"Digite o nome do jogador da cartela 5:";
    cin.getline (nome5,256);
    system("cls");

}
void organiza(int num[][5]) {
    for(int i=0; i<5; i++) {
        for(int j= 4; j>=0; j--) {
            for(int k= j-1; k>=0; k--) {
                if(num[i][j]< num[i][k]) {
                    int l= num[i][j];
                    num[i][j]= num[i][k];
                    num[i][k]=l;
                }
            }
        }
    }
}
int existe(int matA[][5], int i, int j) {
    for (int k = 0; k <= i; k++) {
        for (int l = 0; l < j; l++) {
            if (matA[i][j] == matA[k][l]) {
                return 1;
            }
        }
    }
    return 0;
}
int existevet(int vetA[], int i) {
    for (int j = 0; j < 5; j++) {
        if (vetA[i] == vetA[j]) {
            return 1;
        }
    }
    return 0;
}
bool Existe(int valores[], int valor) {
    for(int i = 0; i<75; i++) {
        if(valores[i]==valor)
            return true;
    }
    return false;
}
void imprime(int matA[][5],int x,int y) {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
                cout<<" "<<matA[i][j];
        }
         y++;
        cout<<"\n";
    }
}
void imp(int matA[][5],int matB[][5],int matC[][5],int matD[][5],int matE[][5],char nome1[],char nome2[],char nome3[],char nome4[],char nome5[]) {
    cout<<"CARTELA 1 NOME: "<<nome1<<endl;
    imprime(matA,10,1);
}
void GeraAleatorios(int numeros[],int matA[][5],int matB[][5],int matC[][5],int matD[][5],int matE[][5],char nome1[],char nome2[],char nome3[],char nome4[],char nome5[]) {
    srand(time(NULL));
    int v,bingo=0,bingo2=0,bingo3=0,bingo4=0,bingo5=0;
    for(int k=0; k<75; k++) {
        imp(matA,matB,matC,matD,matE,nome1,nome2,nome3,nome4,nome5);
        v = 1+rand() % 75;
        while(Existe(numeros,v)) {
            v = 1+rand() % 75;
        }
        numeros[k] = v;
        cout<<"\n"<<numeros[k];
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if(matA[i][j]==numeros[k]) {
                    bingo++;
                }
                if(bingo==25) {
                    cout<<"bingo jogador 1";
                    system("pause");
                }
                if(matB[i][j]==numeros[k]) {
                    bingo2++;
                }
                if(bingo2==25) {
                    cout<<"bingo jogador 2";
                    system("pause");
                }
                if(matC[i][j]==numeros[k]) {
                    bingo3++;
                }
                if(bingo3==25) {
                    cout<<"bingo jogador 3";
                    system("pause");
                }
                if(matD[i][j]==numeros[k]) {
                    bingo4++;
                }
                if(bingo4==25) {
                    cout<<"bingo jogador 4";
                    system("pause");
                }
                if(matE[i][j]==numeros[k]) {
                    bingo5++;
                }
                if(bingo5==25) {
                    cout<<"bingo jogador 5";
                    system("pause");
                }
            }
        }
        Sleep(1000);
        system("cls");
    }
}
void gera(int matA[][5]) {
    int Limite;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if(i==0) {
                Limite =1;
            }
            if(i==1) {
                Limite =16;
            }
            if(i==2) {
                Limite =31;
            }
            if(i==3) {
                Limite =46;
            }
            if(i==4) {
                Limite =61;
            }
            while (1) {
                matA[i][j]= Limite + rand() % 15;
                if (!existe(matA, i, j))
                    break;
            }
        }
    }
}
int main() {
    srand(time(NULL));
    char nome1[256], nome2[256],  nome3[256],  nome4[256],  nome5[256];
    int matA[5][5],matB[5][5],matC[5][5],matD[5][5],matE[5][5];
    int vet[75];
    nomes( nome1, nome2,nome3,nome4,nome5);
    gera(matA);
    organiza(matA);
    gera(matB);
    organiza(matB);
    gera(matC);
    organiza(matC);
    gera(matD);
    organiza(matD);
    gera(matE);
    organiza(matE);
    GeraAleatorios(vet,matA,matB,matC,matD,matE,nome1, nome2,nome3,nome4,nome5);
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

eh que tem mais 4 matrizes, ai eu queria colocar uma do lado da outr entende?

adicionado 0 minutos depois

por isso o gotoxy, eu nao entendi o que você mudou

adicionado 2 minutos depois
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
using namespace std;
void gotoxy_2(int x,int y ) {
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void imp() {
    cout<<"\t°°°°\n";
    cout<<"\t°   °\n";
    cout<<"\t°   °   °   °    °    °°°     °°°\n";
    cout<<"\t°°°°    °   °°   °   °       °   °\n";
    cout<<"\t°   °   °   ° °  °   °  °°   °   °\n";
    cout<<"\t°   °   °   °  ° °   °   °   °   °\n";
    cout<<"\t°°°°    °   °   °°    °°°     °°°\n\n";

}
void nomes(char nome1[],char nome2[], char nome3[], char nome4[], char nome5[]) {
    imp();
    cout<<"Digite o nome do jogador da cartela 1:";
    cin.getline (nome1,256);
    cout<<"Digite o nome do jogador da cartela 2:";
    cin.getline (nome2,256);
    cout<<"Digite o nome do jogador da cartela 3:";
    cin.getline (nome3,256);
    cout<<"Digite o nome do jogador da cartela 4:";
    cin.getline (nome4,256);
    cout<<"Digite o nome do jogador da cartela 5:";
    cin.getline (nome5,256);
    system("cls");

}
void organiza(int num[][5]) {
    for(int i=0; i<5; i++) {
        for(int j= 4; j>=0; j--) {
            for(int k= j-1; k>=0; k--) {
                if(num[i][j]< num[i][k]) {
                    int l= num[i][j];
                    num[i][j]= num[i][k];
                    num[i][k]=l;
                }
            }
        }
    }
}
int existe(int matA[][5], int i, int j) {
    for (int k = 0; k <= i; k++) {
        for (int l = 0; l < j; l++) {
            if (matA[i][j] == matA[k][l]) {
                return 1;
            }
        }
    }
    return 0;
}
int existevet(int vetA[], int i) {
    for (int j = 0; j < 5; j++) {
        if (vetA[i] == vetA[j]) {
            return 1;
        }
    }
    return 0;
}
bool Existe(int valores[], int valor) {
    for(int i = 0; i<75; i++) {
        if(valores[i]==valor)
            return true;
    }
    return false;
}
void imprime(int matA[][5],int x,int y) {
    gotoxy(x,y);
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            cout<<" "<<matA[i][j];
        }
        y++;
        cout<<"\n";
    }
}
void imp(int matA[][5],int matB[][5],int matC[][5],int matD[][5],int matE[][5],char nome1[],char nome2[],char nome3[],char nome4[],char nome5[]) {
    cout<<"CARTELA 1 NOME: "<<nome1<<endl;
    imprime(matA,10,1);
       cout<<"CARTELA 2 NOME: "<<nome2<<endl;
    imprime(matA,10,1);
       cout<<"CARTELA 3 NOME: "<<nome3<<endl;
    imprime(matA,10,1);
       cout<<"CARTELA 4 NOME: "<<nome4<<endl;
    imprime(matA,10,1);
       cout<<"CARTELA 5 NOME: "<<nome5<<endl;
    imprime(matA,10,1);
}
void GeraAleatorios(int numeros[],int matA[][5],int matB[][5],int matC[][5],int matD[][5],int matE[][5],char nome1[],char nome2[],char nome3[],char nome4[],char nome5[]) {
    srand(time(NULL));
    int v,bingo=0,bingo2=0,bingo3=0,bingo4=0,bingo5=0;
    for(int k=0; k<75; k++) {
        imp(matA,matB,matC,matD,matE,nome1,nome2,nome3,nome4,nome5);
        v = 1+rand() % 75;
        while(Existe(numeros,v)) {
            v = 1+rand() % 75;
        }
        numeros[k] = v;
        cout<<"\n"<<numeros[k];
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if(matA[i][j]==numeros[k]) {
                    bingo++;
                }
                if(bingo==25) {
                    cout<<"bingo jogador 1";
                    system("pause");
                }
                if(matB[i][j]==numeros[k]) {
                    bingo2++;
                }
                if(bingo2==25) {
                    cout<<"bingo jogador 2";
                    system("pause");
                }
                if(matC[i][j]==numeros[k]) {
                    bingo3++;
                }
                if(bingo3==25) {
                    cout<<"bingo jogador 3";
                    system("pause");
                }
                if(matD[i][j]==numeros[k]) {
                    bingo4++;
                }
                if(bingo4==25) {
                    cout<<"bingo jogador 4";
                    system("pause");
                }
                if(matE[i][j]==numeros[k]) {
                    bingo5++;
                }
                if(bingo5==25) {
                    cout<<"bingo jogador 5";
                    system("pause");
                }
            }
        }
        Sleep(1000);
        system("cls");
    }
}
void gera(int matA[][5]) {
    int Limite;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if(i==0) {
                Limite =1;
            }
            if(i==1) {
                Limite =16;
            }
            if(i==2) {
                Limite =31;
            }
            if(i==3) {
                Limite =46;
            }
            if(i==4) {
                Limite =61;
            }
            while (1) {
                matA[i][j]= Limite + rand() % 15;
                if (!existe(matA, i, j))
                    break;
            }
        }
    }
}
int main() {
    srand(time(NULL));
    char nome1[256], nome2[256],  nome3[256],  nome4[256],  nome5[256];
    int matA[5][5],matB[5][5],matC[5][5],matD[5][5],matE[5][5];
    int vet[75];
    nomes( nome1, nome2,nome3,nome4,nome5);
    gera(matA);
    organiza(matA);
    gera(matB);
    organiza(matB);
    gera(matC);
    organiza(matC);
    gera(matD);
    organiza(matD);
    gera(matE);
    organiza(matE);
    GeraAleatorios(vet,matA,matB,matC,matD,matE,nome1, nome2,nome3,nome4,nome5);
    return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Felipe Hoffmeister    no seu código não está usando o gotoxy , se você tiver a biblioteca conio2.h  instalada não precisa dessa função lá em cima , e o que modifiquei nela foi a barra reversa  "  \ "  que estava nessa função gotoxy  , e nessa função você especifica primeiro a coluna e depois alinha onde imprimir , ex:  gotoxy(1o,15)  coluna 1o e linha 15 , sendo que as colunas pode ser de zero até 79 e as linhas pode ser de zero até 24 .

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Felipe Hoffmeister     depois de instalar essa conio2 você precisa configurar o compilador , se você estiver usando o code blocks vá na opção settings / compiler / linker settings / other links options  e coloque     -lconio

setings.JPG.f1921a09e65c9b848e9706e8e01f0a0e.JPG

e no dev c++ é em tools/ compiler options /  add comands 

247128103_nodevc.JPG.5df5cf68d2fc5cd7917eaaad06f99a2e.JPG

  mas essa função gotoxy também funciona bem  .

Link para o comentário
Compartilhar em outros sites

Olá!

 

Acho que não precisa de fato dessa gotoxy() ou de conio.h...

 

Vou te mostrar uma maneira de imprimir as cartelas assim: 

 

ch-190910-5cartelas.png.2ec34e7b2f33b125be4b9b92860fcba0.png

 

E você pode alterar para cumprir seu propósito em seu projeto

 

Imaginando que as em verde são números que já foram sorteados na rodada corrente do bingo. Eu escrevi em números alternados só para ter um exemplo, mas vou explicar uma entre muitas possíveis técnicas para mostrar em outra cor os números já sorteados numa rodada. Se não entender abra outro tópico sobre isso :D

 

Ainda não entendi se está escrevendo isso em C ou em C++. Até perguntei mas você não respondeu. O tópico diz C++, seu programa diz C...

 

De todo modo, estive pensando em como imprimir as cartelas. Você disse que tinha dúvidas, mas não explicou qual era. Imagino que seja como imprimir lado a lado as cartelas então.

 

Ainda não entendi o propósito: imaginava eu que você teria os jogadores em programas distintos, com suas cartelas e se comunicando com o programa que controla o jogo e não todas as cartelas na mesma tela e só cinco sempre. Talvez pudesse postar a definição de seu projeto.

 

De volta ao problema:
Como sabe, postei um exemplo de uma função muito simples, mostra(), que mostrava uma cartela assim:

    Cartela 'cartela1' com 25 valores. Limite: 75
1       6       7       8       15
18      22      23      25      29
34      41      43      44      45
55      56      58      59      60
65      67      69      71      73

Isso porque no exemplo que mostrei as cartelas podiam ter outros tamanhos e capacidades em termos de números. Eu não tinha entendido ainda o que você precisava e escrevi um exemplo genérico.

 

O código era assim:

    int Cartela::mostra()
    {
        cout <<
            "\n    Cartela '" << nome <<
            "' com " << tamanho <<
            " valores. Limite: " << limite
            << endl;
        for (int i = 0; i < tamanho; i++)
        {
            cout << valores[i] << "\t";
            if (i % 5 == 4) cout << endl;
        }    // end for
        cout << endl;
        return 0;
    }    // end mostra()

Bem simples. O resultado é aquele acima, claro.

 

Se está pensando em colocar as cartelas na mesma tela, as cinco que usa, com 25 números e tal, talvez não seja o caso de se preocupar em usar essa função aí gotoxy(). Parece muito trabalho.
Pense numa função assim:

    int mostraXY(short X, short Y);

Igualzinho a que escrevi antes, mas mostrando a cartela nessa posição (X,Y) na tela. Bem mais comodo não?

Escrevi com o bloco de notas do Windows uma grade assim:

ch-190909-grid.png.7b7c13494b4de7824915d5a57fd80357.png

 
 Pra que isso?

Preguiça apenas :) Note que tem uma régua com as colunas e os números de linha estão à direita. Então se a tal rotina funcionar a gente pode usar 5 dessas mostra(X,Y) com as coordenadas certas e pronto. E se não ficar bom muda a grade pra acertar os valores e a vida continua.
Deixei esse 88 grande para mostrar o último número sorteado e aqueles números na linha de baixo pra ir mostrando os que já foram sorteados.
Usando os 7 segmentos com X pra escrever o número sorteado como se fosse um grande display digital. OK, meio besta minha ideia. Não escrevi isso ainda.
 De volta ao tópico 

Entendo que também quer mudar a cor de algum número na cartela, talvez para marcar os números já sorteados nas 5 cartelas. Não seria adequado que a própria rotina mostraXY() já mostrasse os números sorteados em outra cor? Oh sim...
Se você usasse um vetor de 75 posições por exemplo, e marcasse nele os números que vão saindo, podia usar esse vetor na rotina que mostra os caras e mudar a cor dos números que já "sairam", certo? Muito simples de implementar. Podia marcar todos já com a cor que quer usar, tipo todos brancos sobre preto no início do programa, e ir colocando verde na posição de cada número sorteado. Assim não precisaria sequer testar se o número foi sorteado ou não: na hora de mostrar o valor usa a cor que está no vetor. Sei que escreveu uma função existe() mas pode nem precisar dela

Vou te mostrar um exemplo bem simples, mas que mostra em verde números alternados nas cartelas, o primeiro, o terceiro, o quinto e tal.


E como escrever essa coisa?


Sem grandes novidades, em C ou C++. Você não precisa de muito: precisa de umas funções do sistema para saber as cores e tal. 3 eu acho

	GetConsoleScreenBufferInfo(H, &info);
	SetConsoleCursorPosition(H, coord);
	SetConsoleTextAttribute(H, (FOREGROUND_GREEN));

  A primeira preenche a struct info com --- claro --- info a respeito da console. A gente precisa disso pra saber a cor atual pra poder restaurar depois

A segunda posiciona o cursor e é o que a gotoxy() faz no seu código

A terceira define atributos, como a cor, e claro que a gente precisa dela. Essa você também usava

 

Por trás do H: esas rotinas usam ao invés de stdin ou stdout ou stderr uma outra coisa para acessar a tela. É chamada de HANDLE e você arruma isso chamando  

 HANDLE    H = GetStdHandle(STD_OUTPUT_HANDLE);

Não precisa chamar toda hora como todo mundo faz porque isso não muda a menos que você mude de tela...Salvei em H e uso pra toda função de acesso a console.


gotoXY e as coordenadas XY, coluna e linha


gotoxy() até onde eu sei apenas usa uma estrutura simples COORD que tem dois elementos que você deve imaginar o que são: as coordenadas: a linha Y e a coluna X e aí chama aquela rotina que falei acima para posicionar o cursor. Mas no nosso caso nem precisa


Eis uma rotina que funciona para mostrar as cartelas e mudar a cor, e que mostrou as cartelas como na tela acima:

    int Cartela::mostraXY(short X, short Y)
    {   // mostra a cartela a partir da posição (x,y) na tela
        // em principio igual a anterior, apenas posiciona o 
        // cursor antes de imprimir cada linha
        int         i;
        HANDLE    H = GetStdHandle(STD_OUTPUT_HANDLE);	// salva o tal handle
        CONSOLE_SCREEN_BUFFER_INFO info;	// salva a cor atual e outras coisas
        COORD     coord;
        coord.X = X;
        coord.Y = Y;
        // precisamos saber a cor orginal para restaurar a tela
        GetConsoleScreenBufferInfo(H, &info);
        SetConsoleCursorPosition(H, coord);	// gotoXY() aqui
        cout <<    "'" << nome << "'";
        coord.X = X;
        coord.Y++;
        SetConsoleCursorPosition(H, coord);
        for (i = 0; i < tamanho; i++)
        {
            // so pra testar vamos usar VERDE para os valores pares
            // o que a gente quer e usar VERDE para os que ja sairam
            // no bingo
            if (i % 2 == 0)
            {
                SetConsoleTextAttribute(H, (FOREGROUND_GREEN));	// muda pra verde
                cout << setfill('0') << setw(2) << valores[i] << "  ";	// força 0 a esquerda pra não ficar torto
                SetConsoleTextAttribute(H, (WORD)info.wAttributes);	// devolve a cor de antes
            }
            else
            {
                cout << setfill('0') << setw(2) << valores[i] << "  ";
            }    // end if
            if (i % 5 == 4)
            {	// pula linha
                coord.X = X;
                coord.Y++;
                SetConsoleCursorPosition(H, coord);
            }    // end if
        }    // end for
        coord.X = X;
        coord.Y++;
        SetConsoleCursorPosition(H, coord);
        return 0;
    }    // end mostra()

É a mesma mostra() de antes, com essa nova capacidade de mostrar a partir da posição (X,Y) e mudar a cor de algumas células. Para mudar para seu objetivo é trivial, em C ou C++. Se está usando C apenas declare como função com esses mesmos parâmetros


Usando a Cartela e o Bingo que mostrei no outro tópico, e as coordenadas que peguei naquela grade que escrevi no bloco de notas,  veja como main() fica para imprimir as cartelas

 

int main(int argc, char** argv)
{
    Bingo    bingo(5);
    (bingo.pCartelas + 0)->mostraXY(27, 0);
    (bingo.pCartelas + 1)->mostraXY(53, 0);
    (bingo.pCartelas + 2)->mostraXY(0, 8);
    (bingo.pCartelas + 3)->mostraXY(27, 8);
    (bingo.pCartelas + 4)->mostraXY(53, 8);
    return 0;
}    // end main()

Só isso. Ao declarar um Bingo de 5 cartelas ele cria lógico as 5 e as preenche, e a nova função mostraXY(coluna, linha) faz o óbvio: mostra, na posição (X,Y) com as posições que marcamos lá na grade.

 

Aí no decorrer do jogo você vai atualizando as cartelas e mostrando os valores atualizados coloridos de acordo

 

O programa de teste completo está no mesmo endereço e tem um botão de download
 

Sobre SetConsoleTextAttribute()
sobre GetConsoleScreenBufferInfo()


Tem lá até o grid pra digitar em cima :D GRID.txt

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá!

Voltei a programar umas funções naquele programa  e agora dá pra acompanhar o jogo rodando até o fim. Pode ser útil se ainda tiver alguma dúvida.

A tela final ainda usa aquele grid, apenas um pouco expandido para incluir mais informações:

 

ch-190911-bingo-r72.png.f32196bd65465e130abc1250b62ff70d.png

 

Tem as cartelas todas, Mas logo abaixo vão acendendo os números sorteados. Quando alguém termina a cartela aparecem as informações de resumo, mostrando como terminou o jogo e os números que faltavam sair e a ordem em que eles iriam sair, pra conferir. E a lista das cartelas e como terminaram a rodada... Assim dá pra ver que as cartelas 2 e 4 ficaram completas juntas e faltava, só 3 bolas pra terminar, nesse exemplo.

 

A função main()

int main(int argc, char** argv)
{
    Bingo    bingo(5);
    do
    {
        bingo.nova_rodada();
        mostra_o_jogo(&bingo);
        Sleep(150);
    } while (bingo.get_vencedores() <= 0);
    mostra_o_jogo(&bingo);
    bingo.fim_da_rodadaXY(0, 21);

    return 0;

}

As rodas vão se sucedendo até alguém ganhar e ai aparece o resumo e pronto. mostra_o_jogo() mostra as cartelas e por exemplo depois de 10 rodadas estaria assim 

ch-190911-bingo-r10.png.988cb17cffe3c5388d5f235b1c73b54a.png

 

Fiz umas poucas mudanças em relação ao código anterior e o programa completo está no mesmo endereço aqui

Das funções novas a mostraXY() pode ser importante já que mostra as cartelas na posição certa e já com as cores e o número de acertos acumulado, como aparece acima. Outra função importante é a faz_o_jogo() que já define os números que vão sair e economiza um pesadelo de códigos deixando a rodada pronta

int            Bingo::faz_o_jogo(short* valores)
{
    /*
     fazendo o sorteio aqui e colocando os números no vetor sorteio[]
     a partir da posicao 1 para a rodada 1 simplifica tudo

     Como e o sorteio do bingo? Como o da loto:
     - inicialmente tiramos uma bola
       a partir do conjunto todo, que tem 'maior_numero' bolas
       e trocamos pela primeira
     - depois tiramos uma bola a partir do conjunto restante e
       colocamos no lugar da segunda
     - E prosseguimos ate escolhermos uma entre as duas ultimas
       'bolas' e colocamos no lugar da penultima
     */
    if (valores == NULL) return -1;
    int bola_da_vez = 0;
    int restantes = maior_numero - 1;
    int guarda_bola = 0;
    for (int i = 0; i <= maior_numero; i++) { valores[i] = i; }
    for (int inicial = 1; inicial < (maior_numero - 1); inicial++)
    {
        bola_da_vez = (rand() % restantes) + 1;
        guarda_bola = valores[inicial];
        valores[inicial] = valores[bola_da_vez];
        valores[bola_da_vez] = guarda_bola;
        restantes -= 1;
    }    // end for
    return 0;
}    // end faz_o_jogo()

E a função que inicia o bingo

int            Bingo::inicia(int t)
{    // prepara um bingo com 't' cartelas
    /*
     - inicia o gerador de numeros
     - nomeia e cria as cartelas preenchidas 'Cartela 1' ate 'Cartela n'
     - acerta a cor para os sorteados e nao sorteados
     - inicia contadores
     */
    srand((int)time(NULL));
    nome = "Clube do Bingo";
    total_cartelas = t;
    // agora cria as cartelas todas
    pCartelas = new (Cartela[total_cartelas]);
    string        prefixo = "Cartela ";
    string        nome = "";
    // agora a cor: precisamos saber a cor que esta em uso
    // para definir nas cartelas a cor certa
    HANDLE    H = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO info;
    GetConsoleScreenBufferInfo(H, &info);
    // define as cores
    cor_nao_sorteados_ainda = (WORD)info.wAttributes;
    cor_sorteados = FOREGROUND_GREEN;
    total_cartelas_completas = 0;

    for (int i = 1; i <= total_cartelas; i++)
    {
        nome = prefixo;
        nome.append(to_string(i));    // monta o nome
        pCartelas[i - 1].muda_nome(nome);
    }    // end for

    for (int i = 0; i <= maior_numero+1; i++) { cor_dos_numeros[i] = cor_nao_sorteados_ainda; }

    ultima_rodada = 0;
    ultimo_numero = 0;
    faz_o_jogo(sorteio);    // mais fácil preencher as rodadas uma vez só
    return 0;
}    // end inicio()

Essa faz toda a lógica de início da rodada então pode ser interessante.

 

Ainda não programei o display grande imitando segmentos de LED. Outro dia

 

Se tiver dúvida e achar útil volte a perguntar.

É até divertido de ver rodando

 

Boa sorte

 O programa completo está aqui e tem um botão para download

ch-190911-bingo-r70.png

ch-190911-bingo-r22.png

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!