Ir ao conteúdo
  • Cadastre-se

Embaralhar cartas...


JoaoTonello

Posts recomendados

Boa Noite, tenho que desenvolver um baralho, embaralhar e mostrar as cartas, a estrutura esta praticamente pronta, o problema maior esta em embaralhar as cartas, sera que alguem poderia ajudar!? segue o codigo....a parte de embaralhar entraria no "case 3". Obrigado pela ajuda :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream>

using namespace std;

#define baralho 5

struct CARTAS
{
int sNumero;
int sNaipe;
};

int MENU()
{
struct CARTAS sCad[baralho];
struct CARTAS sCar[baralho];
int i, j, opcao, auxbar, naipe;
do
{
cout << "\n---------------------------------\n";
cout << "\n>>CADASTRO DE CARTAS DE BARALHO<<\n";
cout << "\n---------------------------------\n";
cout << "\n >>DIGITE A OPCAO DESEJADA<<\n";
cout << "\n---------------------------------\n\n";
cout << "1 - CADASTRAR TODAS AS CARTAS DO BARALHO.\n";
cout << "2 - VISUALIZAR TODAS AS CARTAS DO BARALHO.\n";
cout << "3 - EMBARALHAR AS CARTAS DO BARALHO.\n";
cout << "4 - SAIR.\n\n";
cout << ">> ";
cin >> opcao;
getchar();
switch (opcao)
{
case 1:
cout <<"\n-----------------------------------------------\n";
cout <<"OS NAIPES SERAO ATRIBUIDOS DA SEGUINTE FORMA\n";
cout <<"0 - OUROS\n";
cout <<"1 - ESPADAS\n";
cout <<"2 - COPAS\n";
cout <<"3 - PAUS\n";
cout <<"\n-----------------------------------------------\n";
for (i=0; i<baralho; i++)
{
cout << "\n\nDIGITE O NAIPE: ";
cin >> sCad[i].sNaipe;
cout << "DIGITE O VALOR DA CARTA: ";
cin >> sCad[i].sNumero;
cout << "OK!!!\n";
cout << "-----------------------------------------------\n";
}
system ("CLS");
break;

case 2:
for (i=0; i<baralho; i++)
{
cout << "\n" << sCad[i].sNaipe;
cout << sCad[i].sNumero;
}
cout << endl; //Pular linha
system ("PAUSE");
system ("CLS");
break;

case 3:
//EMBARALHAR
case 4:
break;

default:
cout << "\n\nOPCAO INVALIDA!!!\n\n";
}
}while (opcao != 4);
}


main()
{
MENU();
system ("PAUSE");
}

Link para o comentário
Compartilhar em outros sites

O jeito mais simples de fazer um baralho é com um vetor unidimensional de inteiros. Para embaralhar, basta usar uma função como random_shuffle da biblioteca algorithms.

http://www.cplusplus.com/reference/algorithm/random_shuffle/

O naipe é uma divisão por 13, e o valor da carta é o módulo por 13. Dessa forma, bastaria uma enumeração para decidir o naipe e valor, por exemplo:

- naipes = {"copas", "espadas", "ouros", "paus"}.

- valores = {"ás", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "valete", "dama", "rei"}.

Espero ter ajudado.

ZaZ

Link para o comentário
Compartilhar em outros sites

hmmm....na verdade eu tava tentando encaixar o "bubble sort" ou "quick sort" para fazer o embaralhamento, mas nao obtive sucesso, alguma ideia de como ficaria com essa linha de raciocinio que estou seguindo?

Obrigado, pela ajuda.

Já tentou fazer um "bubblesort" que passe uma ou quantas vezes quiser, mas cujo critério de troca seja aleatório?

Você geraria um número a cada passo, aí, dependendo do número você decide qual o critério de troca se é quando um for menor que o outro ou quando for maior.

Ou você pode gerar pares de números e trocá-los de lugar...

Dá pra fazer um bocado de coisa.

Link para o comentário
Compartilhar em outros sites

então to tentando aprender como usar o "bubblesort" tentei dessa maneira, nao sei se esta certo...

void bubbleSort(int arr[], int n);{
bool swapped = true;
int j = 0;
int auxbar;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < n - j; i++) {
if (arr[i] > arr[i + 1]) {
auxbar = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = auxbar;
swapped = true;
}
}
}
}
for (i=0; i<baralho; i++)
{
cout << "\n" << arr[i];
cout << arr[i];
}
cout << endl;
system ("pause");
system ("cls");
break;

to com problema na hora de apresentar os valores, pois estão aparecendo numeros como -97564840 e deveriam aparecer somente 00 , 01 ,....

Link para o comentário
Compartilhar em outros sites

você tá usando bubblesort otimizado, beleza.

Mas definição de função não tem ponto-e-vírgula (; ) entre o parêntese final dos parâmetros e a chave de abertura, então o correto é assim:

void bubbleSort(int arr[], int n)
{
bool swapped = true;
int auxbar;
int j=0;
while (swapped)
{
swapped = false;
for (int i = 0; i < (n-j); i++)
{
if (arr[i] > arr[i + 1])
{
auxbar = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = auxbar;
j++;
swapped = true;
}
}
}
}

Como é um vetor unidimensional eu declararia assim:

void bubbleSort(int *arr, int n)

Tem certeza que seu vetor foi corretamente inicializado?

Link para o comentário
Compartilhar em outros sites

então... eu coloquei o ";" pois não sei qual o motivo não estava dando certo ele aparece na hora de compilar...

In function int 'MENU()'

a function-definition is not allowed here before '{' token

expected '." or ;" before '{' token

mais uma vez MUITO obrigado por se dispor a ajudar.

Link para o comentário
Compartilhar em outros sites

então... eu coloquei o ";" pois não sei qual o motivo não estava dando certo ele aparece na hora de compilar...

In function int 'MENU()'

a function-definition is not allowed here before '{' token

expected '." or ;" before '{' token

mais uma vez MUITO obrigado por se dispor a ajudar.

Provavelmente porque você definiu a bubblesort DEPOIS de menu().

Do jeito que você está fazendo, se você tenta utilizar uma função que foi declarada depois ele não reconhece.

Uma boa prática é fazer os programas utilizando protótipos de funções.

Assim:

#include <stdio.h>
/*demais bibliotecas*/

/*Constantes, structs*/

int menu();
void bubblesort(int *,int); /* Nao precisa colocar o nome das variáveis */

int main()
{
....
}

int menu()
{
....
}

void bubblesort(int *arr,int n)
{
....
}

Link para o comentário
Compartilhar em outros sites

vou tentar aqui, valeu a dica...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream>

using namespace std;

#define baralho 5

struct CARTAS
{
int sNumero;
int sNaipe;
};

int MENU()
{
void bubblesort(int *,int );
struct CARTAS sCad[baralho];
struct CARTAS sCar[baralho];
int i, j, n, opcao, auxbar, naipe, *arr;
do
{
cout << "\n---------------------------------\n";
cout << "\n>>CADASTRO DE CARTAS DE BARALHO<<\n";
cout << "\n---------------------------------\n";
cout << "\n >>DIGITE A OPCAO DESEJADA<<\n";
cout << "\n---------------------------------\n\n";
cout << "1 - CADASTRAR TODAS AS CARTAS DO BARALHO.\n";
cout << "2 - VISUALIZAR TODAS AS CARTAS DO BARALHO.\n";
cout << "3 - EMBARALHAR AS CARTAS DO BARALHO.\n";
cout << "4 - SAIR.\n\n";
cout << ">> ";
cin >> opcao;
getchar();
switch (opcao)
{
case 1:
cout <<"\n-----------------------------------------------\n";
cout <<"OS NAIPES SERAO ATRIBUIDOS DA SEGUINTE FORMA\n";
cout <<"0 - OUROS\n";
cout <<"1 - ESPADAS\n";
cout <<"2 - COPAS\n";
cout <<"3 - PAUS\n";
cout <<"\n-----------------------------------------------\n";
for (i=0; i<baralho; i++)
{
cout << "\n\nDIGITE O NAIPE: ";
cin >> sCad[i].sNaipe;
cout << "DIGITE O VALOR DA CARTA: ";
cin >> sCad[i].sNumero;
cout << "OK!!!\n";
cout << "-----------------------------------------------\n";
}
system ("CLS");
break;

case 2:
for (i=0; i<baralho; i++)
{
cout << "\n" << sCad[i].sNaipe;
cout << sCad[i].sNumero;
}
cout << endl; //Pular linha
system ("PAUSE");
system ("CLS");
break;

case 3:
//Embaralhar
void bubbleSort(int *arr, int n)
;{
bool swapped = true;
int auxbar;
int j=0;
while (swapped)
{
swapped = false;
for (int i = 0; i < (n-j); i++)
{
if (arr[i] > arr[i + 1])
{
auxbar = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = auxbar;
j++;
swapped = true;
}
}
}
}
for (i=0; i<baralho; i++)
{
cout << "\n" << arr[i];
cout << arr[i];
}
cout << endl;
system ("pause");
system ("cls");
break;
case 4:
break;

default:
cout << "\n\nOPCAO INVALIDA!!!\n\n";
}
}while (opcao != 4);
}


main()
{
MENU();
system ("PAUSE");
}

sigo com o mesmo problema, desculpa a insistência em postar aqui, mas é que tenho que apresentar isto sexta e realmente não estou conseguindo entender essa parte do programa...(case 3) continua no mesmo erro apos o void...

Link para o comentário
Compartilhar em outros sites

Já tentou isso? Oo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream>

using namespace std;

#define baralho 5

struct CARTAS
{
int sNumero;
int sNaipe;
};

void MENU();
void bubbleSort(int *,int);

int main()
{
MENU();
system ("PAUSE");
return 0;
}

void MENU()
{
struct CARTAS sCad[baralho];
struct CARTAS sCar[baralho];
int i, j, n, opcao, auxbar, naipe, *arr;
do
{
cout << "\n---------------------------------\n";
cout << "\n>>CADASTRO DE CARTAS DE BARALHO<<\n";
cout << "\n---------------------------------\n";
cout << "\n >>DIGITE A OPCAO DESEJADA<<\n";
cout << "\n---------------------------------\n\n";
cout << "1 - CADASTRAR TODAS AS CARTAS DO BARALHO.\n";
cout << "2 - VISUALIZAR TODAS AS CARTAS DO BARALHO.\n";
cout << "3 - EMBARALHAR AS CARTAS DO BARALHO.\n";
cout << "4 - SAIR.\n\n";
cout << ">> ";
cin >> opcao;
getchar();
switch (opcao)
{
case 1:
cout <<"\n-----------------------------------------------\n";
cout <<"OS NAIPES SERAO ATRIBUIDOS DA SEGUINTE FORMA\n";
cout <<"0 - OUROS\n";
cout <<"1 - ESPADAS\n";
cout <<"2 - COPAS\n";
cout <<"3 - PAUS\n";
cout <<"\n-----------------------------------------------\n";
for (i=0; i<baralho; i++)
{
cout << "\n\nDIGITE O NAIPE: ";
cin >> sCad[i].sNaipe;
cout << "DIGITE O VALOR DA CARTA: ";
cin >> sCad[i].sNumero;
cout << "OK!!!\n";
cout << "-----------------------------------------------\n";
}
system ("CLS");
break;

case 2:
for (i=0; i<baralho; i++)
{
cout << "\n" << sCad[i].sNaipe;
cout << sCad[i].sNumero;
}
cout << endl; //Pular linha
system ("PAUSE");
system ("CLS");
break;

case 3:
//Embaralhar
bubbleSort(arr,baralho);
for (i=0; i<baralho; i++)
{
cout << "\n" << arr[i];
cout << arr[i];
}
cout << endl;
system ("pause");
system ("cls");
break;
case 4:
break;

default:
cout << "\n\nOPCAO INVALIDA!!!\n\n";
}
}while (opcao != 4);
}

void bubbleSort(int *arr, int n)
{
bool swapped = true;
int auxbar;
int j=0;
while (swapped)
{
swapped = false;
for (int i = 0; i < (n-j); i++)
{
if (arr[i] > arr[i + 1])
{
auxbar = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = auxbar;
j++;
swapped = true;
}
}
}
}

Link para o comentário
Compartilhar em outros sites

é tambem não deu...você colocou o bubblesort pro final, depois do case 4?oO ai ele apresentou erro no "for" e colocando na ordem certa ele persiste no erro de do ";" após o void...

Bixo, uma coisa é DEFINIR a função.

A outra é CHAMAR a função.

Definição de função é SEMPRE FORA DE QUALQUER OUTRA FUNÇÃO.

Ou seja, do jeito que fiz.

Depois de definida, voce pode chamá-la na main ou em qualquer outra função, que é o caso de MENU();

E bubbleSort() é chamada em MENU: bubbleSort(arr,baralho);

Eu só esqueci do ; no final da chamada.

E do S maiúsculo no protótipo da função! kkkkk

Já editei no post anterior, copia e testa de novo.

Link para o comentário
Compartilhar em outros sites

hmmm....arrumei só o S maiusculo que tava dando problema la emcima e aparentemente ele compilou, só que quando executo a "função 3" na interface o aplicativo simplesmente trava...oO

Lógico, olha isso:

int i, j, n, opcao, auxbar, naipe, *arr;

Você definiu um ponteiro para inteiro e sequer alocou memória para ele.

Aí você passa lixo de memória para a função, que obviamente não irá funcionar de modo esperado...

Cara, suas cartas são definidas em uma struct...

Sua função bubbleSort tem que receber um vetor de struct do tipo CARTAS e tratá-las.

A menos que você crie uma função que converta seu vetor de struct em um vetor de inteiro e depois passe para bubbleSort...

Link para o comentário
Compartilhar em outros sites

Coloquei de um jeito que funciona, mas já adianto que do jeito que está seu baralho será "embaralhado" de forma ordenada, ou seja, colocando ou crescente ou decrescente, depende de qual comparação você colocar < ou >

Estude o código para ver como cada coisa funciona.


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

using namespace std;

#define baralho 5

struct cartas
{
int sNumero;
int sNaipe;
};

typedef struct cartas Cartas;

void MENU();
void bubbleSort(Cartas *,int);

int main()
{
MENU();
system ("PAUSE");
return 0;
}

void MENU()
{
Cartas sCad[baralho];
int i, opcao;
do
{
cout << "\n---------------------------------\n";
cout << "\n>>CADASTRO DE CARTAS DE BARALHO<<\n";
cout << "\n---------------------------------\n";
cout << "\n >>DIGITE A OPCAO DESEJADA<<\n";
cout << "\n---------------------------------\n\n";
cout << "1 - CADASTRAR TODAS AS CARTAS DO BARALHO.\n";
cout << "2 - VISUALIZAR TODAS AS CARTAS DO BARALHO.\n";
cout << "3 - EMBARALHAR AS CARTAS DO BARALHO.\n";
cout << "4 - SAIR.\n\n";
cout << ">> ";
cin >> opcao;
getchar();
switch (opcao)
{
case 1:
cout <<"\n-----------------------------------------------\n";
cout <<"OS NAIPES SERAO ATRIBUIDOS DA SEGUINTE FORMA\n";
cout <<"0 - OUROS\n";
cout <<"1 - ESPADAS\n";
cout <<"2 - COPAS\n";
cout <<"3 - PAUS\n";
cout <<"\n-----------------------------------------------\n";
for (i=0; i<baralho; i++)
{
cout << "\n\nDIGITE O NAIPE: ";
cin >> sCad[i].sNaipe;
cout << "DIGITE O VALOR DA CARTA: ";
cin >> sCad[i].sNumero;
cout << "OK!!!\n";
cout << "-----------------------------------------------\n";
}
system ("CLS");
break;

case 2:
for (i=0; i<baralho; i++)
{
cout << "\n" << sCad[i].sNaipe;
cout << sCad[i].sNumero;
}
cout << endl; //Pular linha
system ("PAUSE");
system ("CLS");
break;

case 3:
//Embaralhar
bubbleSort(sCad,baralho);
for (i=0; i<baralho; i++)
{
cout << "\n" << sCad[i].sNaipe;
cout << sCad[i].sNumero;
}
cout << endl;
system ("pause");
system ("cls");
break;
case 4:
break;

default:
cout << "\n\nOPCAO INVALIDA!!!\n\n";
}
}while (opcao != 4);
}

void bubbleSort(Cartas *arr, int n)
{
bool swapped = true;
int auxbar;
int j=0;
while (swapped)
{
swapped = false;
for (int i = 0; i < (n-j-1); i++)
{
if (arr[i].sNumero < arr[i + 1].sNumero)
{
auxbar = arr[i].sNaipe;
arr[i].sNaipe = arr[i+1].sNaipe;
arr[i+1].sNaipe = auxbar;
auxbar = arr[i].sNumero;
arr[i].sNumero = arr[i+1].sNumero;
arr[i+1].sNumero = auxbar;
j++;
swapped = true;
}
}
}
}
#include <stdio.h>

Link para o comentário
Compartilhar em outros sites

você quer ORDERNAR ou EMBARALHAR?

pois bubble sort é ordenação

se quer embaralhar o algoritimo é


for (int i = 0; i < 40; i++)
{
int r = random(40); // não sei randomizar em C
int temp = Baralho[i]; // variavel vai guardar a carta i
Baralho[i] = Baralho[r]; // vai colocar a carta r no lugar da i
Baralho[r] = temp; // vai colocar o i no lugar da r
}

espero que tenha intendido.

um dia fiz um baralho para truco em c#, veja como ficou

class Baralho
{
short[] cartas = new short[40] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };

public string CartaNome(int i)
{
int numeroCarta = ((i / 4) + 4)%11;
string nipe = "";

switch (i % 4)
{
case 1:
nipe = " Ouros";
return numeroCarta.ToString() + nipe;

case 2:
nipe = " Espada";
return numeroCarta.ToString() + nipe;

case 3:
nipe = " Copas";
return numeroCarta.ToString() + nipe;

case 0:
nipe = " Paus";
return numeroCarta.ToString() + nipe;
}
return numeroCarta.ToString() + nipe;
}

}

esta um pouco zuado pois quando fiz não sabia programar

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!