Jump to content
docasbb

Ajuda em programa

Recommended Posts

docasbb

Boas, tenho que fazer um programa que baralhe 52 cartas e depois que de as 4 mãos.

Depois tenho que ordenar as mãos por naipes e dps por ordem crescente ou decrescente em cada naipe.

A parte onde estou a ter dificuldades é em ordenar as cartas por mão, será que me podiam dar uma ajudinha?

Já consegui dividir as cartas pelas quatro mãos agora o resto é que ta dificil.

já agora deixo aqui o código, aceito sugestões!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXN 10
struct carta {
   char valor[MAXN];
   char naipe[MAXN];
};
typedef struct carta Carta;

char tipos_valores[] [13]={"A","2","3","4","5","6",
   "7","8","9","10","J","Q","K"};
char tipos_naipes[] [4]={{03},{04},{05},{06}};


void preenche(Carta []);
void distribui(Carta [],Carta[],Carta[],Carta[],Carta[]);
void baralha(Carta []);
void ordena(Carta jogador1[]);
main(){
Carta baralho[52];
Carta jogador1[13];
Carta jogador2[13];
Carta jogador3[13];
Carta jogador4[13];
srand(time(NULL));
preenche(baralho);
baralha(baralho);
distribui(baralho,jogador1,jogador2,jogador3,jogador4);
}

void preenche( Carta baralho[]) {
 int i;
 for(i=0;i<52;i++) {
   strcpy(baralho[i].valor,tipos_valores[i%13]);
   strcpy(baralho[i].naipe,tipos_naipes[i/13]);
 }
}
void baralha(Carta baralho[]) {
 int i,j;
 Carta temp;
 for(i=0;i<52;i++) {
   j=rand() %52;
   temp=baralho[j];
   baralho[j]=baralho[i];
   baralho[i]=temp;
 }
}
void distribui(Carta baralho[],Carta jogador1[],Carta jogador2[],Carta jogador3[],Carta jogador4[]) {
 int i,j;
 Carta aux;

  for(i=0;i<13;i++){
   jogador1[i]=baralho[i];
    printf("%7s de %s%c",jogador1[i].valor,jogador1[i].naipe,(i+1)%3? '\t': '\n');}
    printf("\n\n\n");
       for(i=13;i<26;i++){
               jogador2[i]=baralho[i];
               printf("%7s de %s%c",jogador2[i].valor,jogador2[i].naipe,(i+1)%3? '\t': '\n');}
               printf("\n\n\n");
       for(i=26;i<39;i++){
               jogador3[i]=baralho[i];
               printf("%7s de %s%c",jogador3[i].valor,jogador3[i].naipe,(i+1)%3? '\t': '\n');}
               printf("\n\n\n");
       for(i=39;i<52;i++){
               jogador4[i]=baralho[i];
               printf("%7s de %s%c",jogador4[i].valor,jogador4[i].naipe,(i+1)%3? '\t': '\n');}

}

Edited by thoga31
Tópico movido. Tags code + GeSHi.

Share this post


Link to post
Share on other sites
pwseo

Tens a certeza que a secção de C++ é a mais adequada para o teu problema? Coloca o teu código dentro das tags CODE, como explicado aqui, e tem atenção à indentação do teu código...

Share this post


Link to post
Share on other sites
thoga31

Tópico movido para a secção apropriada. Tags CODE adicionadas.


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Primeiro que nada, as tuas variáveis estão mal declaradas. Falo destas duas em particular:

char tipos_valores[] [13]={"A","2","3","4","5","6",
   "7","8","9","10","J","Q","K"};
char tipos_naipes[] [4]={{03},{04},{05},{06}};

Estás a declarar, respectivamente:

  • Um array de array de 13 caracteres
  • Um array de array de 4 caracteres

Suspeito que queres o inverso.

Eu recomendaria representares o número 10 como '0', e podias fazer isto:

char *tipos_valores = "A234567890QJK";

Desta forma, podias usar strchr para fazer a ordenação:

if (strchr(tipos_valores, carta1) > strchr(tipos_valores, carta2) {
  // troca para ordenar
}

Não entendo a tua representação dos naipes. Eu faria assim:

char *tipos_naipes = "EPOC";  // Espadas, Paus, Ouros, Copas - a ordem fica ao teu critério

E mais uma vez podia usar o strchr para realizar a ordenação.

Caso quisesses escrever o valor da carta, construías uma função que interpretasse estes valores e devolvesse os respectivos nomes por extenso.

char *nome = "";

switch (naipe) {
  case 'E' : strcat(nome, "Espadas"); break;
}

Cumprimentos.


Knowledge is free!

Share this post


Link to post
Share on other sites
docasbb

O problema é que ao fazer assim como disseste o programa corre só que depois dá erro, não mostra nenhum resultado não sei porque.

Em relação aos naipes aquilo mostra logo o símbolo do naipe

Share this post


Link to post
Share on other sites
pwseo

Em relação aos naipes aquilo mostra logo o símbolo do naipe

thoga31, ele afinal está a utilizar a CP437 ou CP850 da linha de comandos do Windows para mostrar os naipes directamente.

Share this post


Link to post
Share on other sites
thoga31

Se dá erro então a solução não passa por alterar as variáveis, mas sim ver o que está mal na sua manipulação.

Aquilo mostra o símbolo dos naipes? Talvez aí no teu computador ou mesmo no Windows em geral, mas isso é só uma representação que o sistema de caracteres da linha de comandos do Windows dá. Nesse caso, continuas a poder comparar os valores para os poder ordenar.


Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define DECK_NSUITS     4
#define DECK_NVALUES    13
#define DECK_SIZE       (DECK_NSUITS * DECK_NVALUES)

#define HAND_COUNT      4
#define HAND_SIZE       (DECK_SIZE / HAND_COUNT)

#define card_suit(card) ((card >> 8) & 0xff)
#define card_value(card) (card & 0xff)
#define card_compose(suit, value) (((suit & 0xff) << 8) | (value & 0xff))
#define card_swap(card1, card2) do { if (*card1 != *card2) { *card1 ^= *card2; *card2 ^= *card1; *card1 ^= *card2; } } while (0)

int card_compare(const void * a, const void * b) {
 return * (short *) a - * (short *) b;
}

void deck_build(short * deck) {
 int suit = 0, value = 0;

 for (suit = 1; suit <= DECK_NSUITS; suit++)
   for (value = 1; value <= DECK_NVALUES; value++)
     deck[(suit - 1) * DECK_NVALUES + value - 1] = card_compose(suit, value);
}

void card_output(short card) {
 switch (card_suit(card)) {
   case 1 : printf("%c", 3); break;
   case 2 : printf("%c", 4); break;
   case 3 : printf("%c", 5); break;
   case 4 : printf("%c", 6); break;
 }
 switch (card_value(card)) {
   case 1  : printf("A "); break;
   case 11 : printf("Q "); break;
   case 12 : printf("J "); break;
   case 13 : printf("K "); break;
   default : printf("%-2d", card_value(card));
 }
}

void deck_shuffle(short * deck) {
 int i = 0, r = 0;

 for (i = 0; i < DECK_SIZE; i++) {
   r = rand() % (DECK_SIZE - i);
   card_swap(&deck[r], &deck[i + r]);
 }
}

void hand_sort(short * hand, int size) {
 qsort(hand, size, sizeof(short), card_compare);
}

int main(int argc, char ** argv) {
 short deck[DECK_SIZE];
 short hands[HAND_COUNT][HAND_SIZE];
 int i, j;

 /* start randon number genereation */
 srand(time(NULL));

 /* deck build and shuffle */
 deck_build(deck);
 deck_shuffle(deck);

 /* deck destribution to the players hands */
 for (i = 0; i < HAND_COUNT; i++)
   memcpy(hands[i], &deck[i * HAND_SIZE], HAND_SIZE * sizeof(short));

 /* hand sorting */
 for (i = 0; i < HAND_COUNT; i++)
   hand_sort(hands[i], HAND_SIZE);

 /* hand presentation */
 for (i = 0; i < HAND_COUNT; i++) {
   printf("h%d :", i);
   for (j = 0; j < HAND_SIZE; j++) {
     printf(" >");
     card_output(hands[i][j]);
   }
   printf("\n");
 }

 return 0;
}

edit : alterado para fazer aparecer os caracters dos naipes na consola do windows

Edited by HappyHippyHippo
  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Sophia_Fuoco

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define DECK_NSUITS	 4
#define DECK_NVALUES	13
#define DECK_SIZE	   (DECK_NSUITS * DECK_NVALUES)

#define HAND_COUNT	  4
#define HAND_SIZE	   (DECK_SIZE / HAND_COUNT)

#define card_suit(card) ((card >> 8) & 0xff)
#define card_value(card) (card & 0xff)
#define card_compose(suit, value) (((suit & 0xff) << 8) | (value & 0xff))
#define card_swap(card1, card2) do { if (*card1 != *card2) { *card1 ^= *card2; *card2 ^= *card1; *card1 ^= *card2; } } while (0)

int card_compare(const void * a, const void * b) {
 return * (short *) a - * (short *) b;
}

void deck_build(short * deck) {
 int suit = 0, value = 0;

 for (suit = 1; suit <= DECK_NSUITS; suit++)
for (value = 1; value <= DECK_NVALUES; value++)
  deck[(suit - 1) * DECK_NVALUES + value - 1] = card_compose(suit, value);
}

void card_output(short card) {
 switch (card_suit(card)) {
case 1 : printf("%c", 3); break;
case 2 : printf("%c", 4); break;
case 3 : printf("%c", 5); break;
case 4 : printf("%c", 6); break;
 }
 switch (card_value(card)) {
case 1  : printf("A "); break;
case 11 : printf("Q "); break;
case 12 : printf("J "); break;
case 13 : printf("K "); break;
default : printf("%-2d", card_value(card));
 }
}

void deck_shuffle(short * deck) {
 int i = 0, r = 0;

 for (i = 0; i < DECK_SIZE; i++) {
r = rand() % (DECK_SIZE - i);
card_swap(&deck[r], &deck[i + r]);
 }
}

void hand_sort(short * hand, int size) {
 qsort(hand, size, sizeof(short), card_compare);
}

int main(int argc, char ** argv) {
 short deck[DECK_SIZE];
 short hands[HAND_COUNT][HAND_SIZE];
 int i, j;

 /* start randon number genereation */
 srand(time(NULL));

 /* deck build and shuffle */
 deck_build(deck);
 deck_shuffle(deck);

 /* deck destribution to the players hands */
 for (i = 0; i < HAND_COUNT; i++)
memcpy(hands[i], &deck[i * HAND_SIZE], HAND_SIZE * sizeof(short));

 /* hand sorting */
 for (i = 0; i < HAND_COUNT; i++)
hand_sort(hands[i], HAND_SIZE);

 /* hand presentation */
 for (i = 0; i < HAND_COUNT; i++) {
printf("h%d :", i);
for (j = 0; j < HAND_SIZE; j++) {
  printf(" >");
  card_output(hands[i][j]);
}
printf("\n");
 }

 return 0;
}

edit : alterado para fazer aparecer os caracters dos naipes na consola do windows

Obrigada :)

Share this post


Link to post
Share on other sites
HappyHippyHippo

Obrigada :)

de nada ... espero é que compreendas o código ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.