Páginas

sexta-feira, 21 de maio de 2010

Zum para Leigos

Esse post foi inspirado pelo atual post do blog do Jan, o Cinco Síncopes, sobre brincadeiras sociais entre amigos. Lembrei de um jogo que teve em um churrasco, o Zum, que eu já tinha colocado no Google Docs mas não havia disponibilizado para todos.

Pois bem, esse erro foi corrigido e vos deixo com Zum!

Zum é um jogo de bêbados. Aprendi isso em um dos churrascos do pessoal dos primeiros períodos, esse backup é de maio de 2006. Como qualquer jogo de bêbado, é feito para quem errar tomar uma dose da bebida em questão.

Os jogadores sentam-se em roda e decidem aleatoriamente quem começa. Cada jogador pode dizer as palavras válidas que indicam qual é o próximo participante. O sentido normal é o horário.

Regras:

Zum - Passa para o próximo jogador no sentido atual.
Lombada - Pula um jogador no sentido atual.
I (Ih) - Inverte o sentido (de horário para anti-horário) e passa para o próximo jogador no novo sentido.
Lombadinha - Pula um jogador para trás, mas não inverte o sentido.

O jogador que errar ou falar fora de sua vez deve tomar a bebida. Preenche-se novamente o copo e é dado início a uma nova rodada a partir do jogador que errou.

Esse programa foi feito numa manhã de sábado pós-churrasco para curar a ressaca de forma lúdica e não se preocupa em manter uma boa estrutura de código ou permitir reinício da partida.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
 
/* Funcoes de jogo e impressao */
void zum (int* posicao, int* flag_i){
   if (*flag_i == 1){
      *posicao -= 1;
      return;
   }
   else{
      *posicao += 1;
      return;
   }
}
 
void lombada (int* posicao, int* flag_i){
   if (*flag_i == 1){
      *posicao -= 2;
      return;
   }
   else{
      *posicao += 2;
      return;
   }
}
 
void i (int* posicao, int* flag_i){
   if (*flag_i == 0){
      *posicao -= 1;
      *flag_i = 1;
      return;
   }
   else{
      *posicao += 1;
      *flag_i = 0;
      return;
   }
}
 
void lombadinha (int* posicao, int* flag_i){
   i(posicao, flag_i);
   lombada(posicao, flag_i);
   i(posicao, flag_i);
   return;
}
 
 
int analisa_jogada(char* jogada, int* posicao, int* flag_i){
   if ((strcmp(jogada, "zum") == 0) || (strcmp(jogada, "ZUM") == 0)){
      zum(posicao, flag_i);
      return 0;
   }
   else{
      if ((strcmp(jogada, "lombada") == 0) || (strcmp(jogada, "LOMBADA") == 0)){          
         lombada(posicao, flag_i);
         return 0;
      }
      else{
         if ((strcmp(jogada, "i") == 0) || (strcmp(jogada, "I") == 0)){
            i(posicao, flag_i);
            return 0;
         }
         else{
            if ((strcmp(jogada, "lombadinha") == 0) || (strcmp(jogada, "LOMBADINHA") == 0)){
               lombadinha(posicao, flag_i);
               return 0;
            }
            else{
               return 1;
            }
         }
      }
   }
}
 
void analisa_posicao (int* numero, int* posicao){
   if (*posicao < 0){
      *posicao = *numero - fabs(*posicao);
      return;
   }
   else{
      if (*posicao >= *numero){
         *posicao = *posicao - *numero;
         return;
      }
   }
}
 
void atualiza (int* n, int* posicao, int* vetor){
   int i;
   for(i = 0; i < *n; i++){
      if (i == *posicao){
         vetor[i] = 1;
      }
      else{
         vetor[i] = 0;
      }
   }
   return;
}
 
void imprime (int *n, int* vetor){
   int i;
   printf("\n");
   for (i = 0; i < *n; i++){
      printf("%2d ", vetor[i]);
   }
   printf("\n");
   for (i = 0; i < *n; i++){
      printf("%2d ", i+1);
   }
   printf("\n");
   return;
}
 
/* Principal */
int main (void){
   int participantes = -1;
   char jogada[11];
   int* jogadores;
   int flag_i = 0;
   int posicao = 0;
   int rodada = 0;
   int em_jogo = 1;
    
   printf("\n*******************\n*\tZum\t  *\n*******************\n\n");
    
   do{
      printf("Entre com o numero de jogadores: ");
      scanf("%d", &participantes);
   } while (participantes <= 0);
    
   jogadores = (int*)malloc(participantes*sizeof(int));
    
   /* Loop */
    
   while(em_jogo == 1){
       
      printf("\nRodada %d:\n", rodada);
      atualiza(&participantes, &posicao, jogadores);
      imprime(&participantes,jogadores);
      printf("\nJogadas possiveis:\nzum\t\ti\nlombada\t\tfim\nlombadinha\n\n");
      printf("Entre com a jogada: ");
      scanf(" %10[^\n]", jogada);
       
      if ((strcmp("fim",jogada) == 0) || (strcmp("FIM",jogada) == 0)){
         break;
      }
      else{
         if (analisa_jogada(jogada, &posicao, &flag_i) == 1){
            printf("\nJogada invalida!\n");
            continue;
         }
         else{
            analisa_posicao(&participantes, &posicao);
         }
      }
      rodada++;
   }
    
   free(jogadores);
   printf("\nObrigado por me utilizar.\n");
 
   return 0;
}
PS: Esse syntax highlighting eu devo ao Google ter me indicado o site http://www.craftyfella.com/2010/01/syntax-highlighting-with-blogger-engine.html após alguns segundos de pesquisa. Nesse outro link, há mais opções de brushes.

PS2: Eu to devendo as regras do Idiota. Um dia eu escrevo direito e posto aqui com direito a imagens.

PS3: Esse eu to indo jogar agora =)

3 comentários:

  1. >> printf("\nObrigado por me utilizar.\n");
    Sua piranha arrombada e oferecida!

    >> PS3: Esse eu to indo jogar agora =)
    *tu run tun tssssssh*

    ResponderExcluir
  2. Fora que eu não verifico se o malloc retornou um valor correto né? Que feio um ex-monitor fazer isso =)

    ResponderExcluir
  3. aaaaaaaaaahhhhhnnnnnnn....

    até onde só falou do jogo eu entendi bem! auhauhauha
    que maneira de se divertir... não entendo essas pessoas... programar brincadeira de bebado...
    tsc tsc tsc

    ResponderExcluir