Jump to content

Como dar um nó na cabeça de um neófito ingênuo...


fredericopissarra

Recommended Posts

Posted

Participo de alguns grupos e um sujeito me posta um código para "embaralhar" cartas totalmente esquisito. A rotina de "embaralhamento" cheia de ifs e loops... Ai venho eu, pego o código do sujeito, altero e mostro isso:

/* card.c
 
   gcc -std=c11 -o card card.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
// Essas enumerações estão aqui por causa do
// código original
enum Suit { 
  SPADES = 0, 
  HEARTS, 
  CLUBS, 
  DIAMONDS 
};
 
enum Card_Value { 
  ACE = 0, 
  TWO, 
  THREE, 
  FOUR, 
  FIVE, 
  SIX, 
  SEVEN, 
  EIGHT, 
  NINE, 
  TEN, 
  JACK, 
  QUEEN, 
  KING 
};
 
// Essa estrutura também...
typedef struct
{
  enum Suit suit;
  enum Card_Value card;
} Card;
 
// Modifiquei esses protótipos (que
// eram bem mais esquisitos) e os coloquei
// como 'static' só para não exportar os símbolos
// pro linker (deu o primeiro nó na cabeça dele)...
static void init_deck( Card * );
static void shuffle_deck ( Card * );
static char *get_card( Card * );
 
int main( void )
{
  Card deck[52];  // EU coloquei o array aqui.
                  // No código original havia uma
                  // chamada do tipo:
                  //
                  //  Card *deck = init_deck();
                  //  ...
                  //  Card *init_deck() // Isso não é C!
                  //  /* Engraçado que ele não achou ISSO esquisito! */
                  //  { static Card deck[52]; return deck; }
                  //
  int i;
 
  init_deck( deck );
 
  srand( time(NULL) );
 
  shuffle_deck ( deck );
 
  // O sujeito não entendeu o 'deck + i' ai embaixo! :)
  for ( i = 0; i < 52; i++ )
    printf( "%s ", get_card( deck + i ) );
  putchar('\n');
}
 
void init_deck( Card *deckp )
{
  int i, j, k;
 
  // Não entendeu, muito menos, o "compound"!! :)
  k = 0;
  for (i = SPADES; i <= DIAMONDS; i++)
    for (j = ACE; j <= KING; j++)
      deckp[k++] = (Card){ i, j };
}
 
#define swap_cards( a, b ) { Card tmp; tmp = (a); (a) = (b); (b) = tmp; }
 
void shuffle_deck ( Card *deckp )
{
  int i, j;
  Card tmp;
 
  // Esse simples loop deu OUTRO nó na cabeça dele!
  for ( i = 0; i < 52; i++ )
  {
    j = rand() % 52;
    swap_cards( deckp[i], deckp[j] );
  }
}

// Tive que ajustar a string com os códigos UTF-8
// "na unha" porque o forum estava bagunçando o código,
// ignorando uma belíssima consulta por tabela...
//
// Claro... isso EXPLODIU a cabeça do sujeito...
char *get_card( Card *deckp )
{
  static char s[5] = { 0 };
 
  int c = 0x1f0a1; // ÁS de espadas!
 
  switch ( deckp->suit )
  {
    case 2: // clubs
      c += 0x10;
    case 3: // diamonds
      c += 0x10;
    case 1: // hearts
      c += 0x10;
  }  
 
  c += deckp->card;
  if ( deckp->card > 10 )
    c++;
 
  s[0] = 0xf0 | ((c >> 18) & 7);
  s[1] = 0x80 | ((c >> 12) & 0x3f);
  s[2] = 0x80 | ((c >> 6) & 0x3f);
  s[3] = 0x80 | (c & 0x3f);
 
  return s;
}

Well... depois de compilado e executado, o resultado:

Untitled.thumb.png.5ee62d35737477f90fe42d817bc23b36.png

Acreditam que a cabeça do sujeito explodiu, de novo, ao saber que pode usar UNICODE no terminal?

BWAHAHAHAHAHAHA...

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...