Jogo de 21 em C

Publicado por Tiago Alves de Oliveira 09/07/2008 (última atualização em 30/11/2012)

[ Hits: 13.900 ]

Download jogo21.c

Download 1353950139.jogo21.c (versão 2)




Este é um exemplo de como fazer o jogo de 21 em C.

A estrutura e procedimentos podem ser usados também para fazer o jogo de truco ou algum outro. Os procedimentos foram implementados usando a estrutura de dados pilha.

Divirtam-se

  



Versões atualizadas deste script

Versão 2 - Enviado por Tiago Alves de Oliveira em 26/11/2012

Changelog: - Erro nos includes
- Corrigido o erro do public

Download 1353950139.jogo21.c


Esconder código-fonte

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * main.c
 * Copyright (C) Tiago Alves de Oliveira e Walisson Maicon Silva 2008 <tiagofga@gmail.com>
 * 
 * main.c is free software.
 * 
 * You may redistribute it and/or modify it under the terms of the
 * GNU General Public License, as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option)
 * any later version.
 * 
 * main.c is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with main.c.  If not, write to:
 *    The Free Software Foundation, Inc.,
 *    51 Franklin Street, Fifth Floor
 *    Boston, MA  02110-1301, USA.
 */

#define LINUX  1
// #define WINDOWS 1
//use define Linux se estiver usando o Linux e Windows para Windows

#ifdef LINUX
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#endif
#ifdef WINDOWS
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <time.h>
#endif

#define ALOCA_NODO()    ( (Tmonte) malloc(sizeof(Tbaralho)) )
#define LIBERA_NODO(p)  ( free(p) )

typedef struct _carta_ //estrutura do baralho que vai ter o naipe o,c,e,p e valor da carta de 1 a 13
{
   char naipe;
   int valor;
} Tcarta;//carta

typedef struct _baralho_ //estrutura do baralho, que vai conter um tipo carta e o apontador para o proximo valor
{
   Tcarta x;
   struct _baralho_ *prox;
} Tbaralho; //baralho

typedef Tbaralho *Tmonte; //definindo o monte do tipo baralho

/*================*
 *  Inicia Fila
 *================*/
PUBLIC Tmonte criaFila (void){
   //aloca uma nova celula
   Tmonte pcabeca = ALOCA_NODO();
   //o valor desta celula recebe -1 para se diferenciar
   pcabeca->x.valor = -1;
   //ela aponta para ela mesma
   pcabeca->prox  = pcabeca;
   //retornando esta celula para fazer ligação com a variavel que pediu ela
   return pcabeca;
}

/*================*
 *  cria Baralho 
 *================*/

PUBLIC void criaBaralho(Tmonte *monte){
   //montando o baralho   
   int i,j;
   for(i=1;i<14;i++)
   for(j=1;j<5;j++){
    Tmonte novo = ALOCA_NODO();
    novo->prox = (*monte)->prox;
    (*monte)->prox = novo;
    if (j == 1)
    novo->x.naipe = 'o';
    if (j == 2)
    novo->x.naipe = 'c';
    if (j == 3)
    novo->x.naipe = 'e';
    if (j == 4)
    novo->x.naipe = 'p';
    novo->x.valor = i;
    (*monte)->prox=novo;
   }
}
/*===================*
 * Exibe o Baralho
 *===================*/
PUBLIC void mostraBaralho(Tmonte *monte){
   //exibe o baralho
    Tbaralho *aux;
   aux = (*monte)->prox;
   while (aux->x.valor != -1){   //comparaçao de início da fila
     printf("\nValor %d Naipe %c\n",aux->x.valor,aux->x.naipe);
     aux = aux->prox;
   }
   
}

/*===========================*
 *    Pega uma carta
 *===========================*/
PUBLIC Tcarta pegaCarta(Tmonte *monte)
{
   Tbaralho *aux; Tcarta x;
   aux = (*monte)->prox;
   (*monte)->prox = aux->prox;
   x = aux->x;   
   LIBERA_NODO(aux);
   return(x);
}

/*==========================*
 *   Devolve uma carta
 *==========================*/

PUBLIC void devolveCarta(Tmonte *monte, Tcarta carta){
   Tbaralho *aux = ALOCA_NODO();
   aux->x = carta;
   aux->prox  = (*monte)->prox;
   (*monte)->prox = aux;
}

/*=======================*
 *   Embaralha o Baralho
 *=======================*/
PUBLIC void embaralha(Tmonte *monte){
   //Embaralhar o Baralho
   //para usar o random
   srand(time(NULL));
   Tbaralho *aux, *aux0;
   Tmonte aux1 = criaFila(),aux2 = criaFila();
   Tcarta x;
   int p;
   //aux está recebendo o monte->prox
   aux = (*monte)->prox;
   //enquanto aux->x.valor for diferente do flag
   while (aux->x.valor != -1){
      //pegando uma carta do endereço do ponteiro para monte
      x = pegaCarta(&(*monte)); 
      //p vai receber um valor aleatório
      p = rand() % 100;
      //se o valor de p for par
      if (p % 2 == 0)
         //jogo ele na fila aux1
         devolveCarta(&aux1,x);
      //caso contrario jogo na fila aux2
      else devolveCarta(&aux2,x);
      //aux vai receber monte->prox
      aux = (*monte)->prox;
   }
   //monte que está vazio vai receber a fila aux1->prox
   (*monte)->prox = aux1->prox;
   aux = (*monte);
   aux0 = (*monte)->prox;
   while(aux0->x.valor != -1){
      aux= aux->prox;
       aux0= aux0->prox;
   }
   aux->prox= aux2->prox;
   
}


/*========================*
 *   destroi Baralho    
 *========================*/

PUBLIC void destroiBaralho (Tmonte *monte)
{
   Tbaralho *aux;
   Tcarta x;
    //aux está recebendo o monte->prox
   aux = (*monte)->prox;
   //enquanto aux->x.valor for diferente do flag
   while (aux->x.valor != -1){
      //pegando uma carta do endereço do ponteiro para monte
      x = pegaCarta(&(*monte));
      aux = (*monte)->prox;
   }
}
/*===================*
 *        Jogar      
 *===================*/
PUBLIC void jogar(Tmonte *monte,char nome1[], char nome2[], int *placar1, int *placar2){
   srand(time(NULL));
   int soma1=0, soma2=0;
   Tcarta x1,x2;
   char ch;
   int op2;
    do{
      x1.valor=x2.valor=0;
      x1.naipe=x2.naipe='a';
      system("clear");
        printf("\n******** Menu do Jogo ************\n\n");
        printf("\n1- Pegar Carta\n");
        printf("\n2- Não Pegar uma Carta\n");
        printf("\n3- Sair \n");
        printf("\nEntre com a sua Opção: \n");
        scanf("%d", &op2);
      switch (op2){
          case 1:{
           system("clear");
           x1 = pegaCarta(&(*monte));
           printf("Você pegou a carta %d %c\n", x1.valor, x1.naipe);
           if (soma2==0){
            x2 = pegaCarta(&(*monte));
            printf("Computador pegou a carta %d %c\n", x2.valor, x2.naipe);
            soma2 += x2.valor;
           }
           else{
              int r=rand()%2;
            if (r==1){
              x2 = pegaCarta(&(*monte));
              soma2 += x2.valor;
              printf("Computador pegou a carta %d %c\n", x2.valor, x2.naipe);
            }
            else printf("Computador não pegou uma carta\n");
           }
           soma1 += x1.valor;           
           scanf("%c", &ch);
           break;
        }
        case 2:{
           system("clear");
           printf("Você não pegou uma carta \n");
           if (soma2==0){
            x2 = pegaCarta(&(*monte));
            printf("Computador pegou a carta %d %c\n", x2.valor, x2.naipe);
            soma2 += x2.valor;
           }
           else{
              int r=rand()%2;
            if (r==1){
              x2 = pegaCarta(&(*monte));
              soma2 += x2.valor;
              printf("Computador pegou a carta %d %c\n", x2.valor, x2.naipe);
            }
            else printf("Computador não pegou uma carta\n");
           }
           soma1 += x1.valor;           
           scanf("%c", &ch);
           break;
        }
        case 3:{
           system("clear");
           printf("\nSaindo do Jogo\n");
           scanf("%c", &ch);
           break;
        }   
        default:{
           printf("\nEntre com um valor válido!\n");
           scanf("%c", &ch);
        }
     }
     printf("Soma do Jogador 1 %d\n", soma1);
     printf("Soma do Jogador 2 %d\n", soma2);
     scanf("%c", &ch);
   }while ((soma1 < 21) && (soma2 < 21) && (op2!=3));
   if ((soma1>21) && (soma2>21))
      printf("O jogo ficou empatado\n");
   else if (soma1 > 21){
      printf("Você perdeu esta rodada\n");
      (*placar2)++;
   }
   else if(soma2 > 21){
      printf("Você ganhou esta rodada\n");
      (*placar1)++;
   }
   else if(soma1 == 21){
      printf("Você ganhou esta rodada\n");
      (*placar1)++;
   }
   else if(soma2 == 21){
      printf("Você perdeu esta rodada\n");
      (*placar2)++;
   }
   else if ((soma1==21) && (soma2==21))
      printf("O jogo ficou empatado\n");
   else if (soma1>soma2){
      printf("Você ganhou esta rodada\n");
      (*placar1)++;
   }
   else if (soma1<soma2){
      printf("Você perdeu esta rodada\n");
      (*placar2)++;
   }
   else printf("O jogo ficou empatado\n");
   destroiBaralho(&(*monte));
}

int main(void){
   char ch;
   int op;
   char nome1[10],nome2[20];
   system("clear");
   printf("Jogador 1 entre com o seu nome : ");
   fflush(stdin);
   fgets(nome1,10,stdin);
   printf("Bem Vindo %s!", nome1);
   strcpy(nome2,"Computador");   
   scanf("%c", &ch);
   system("clear");
   /*Criando a Fila*/
   Tmonte monte = criaFila();
   /*Criando o Baralho */
   criaBaralho(&monte);
   int i;
   /*Embaralhando o Baralho*/
   for (i=0;i<10;i++)
   embaralha(&monte);
   int placar1 = 0, placar2= 0;
   do{ 
     system("clear");
     printf("\n*************** Menu ***************\n\n");
     printf("\n1- Mostrar o Baralho\n");
     printf("\n2- Jogar\n");
     printf("\n3- Ver Placar\n");
     printf("\n4- Zerar Placar\n");
     printf("\n5- Sair \n");
     printf("\nEntre com a sua Opção: \n");
     scanf("%d", &op);
     switch(op){
        case 1:{
           system("clear");
           printf("Mostrando o Baralho\n");
           mostraBaralho(&monte);
           scanf("%c", &ch);
           break;
        }
        case 2:{
           system("clear");
           jogar(&monte, nome1, nome2, &placar1, &placar2);
           scanf("%c", &ch);
           /*Criando o Baralho */
           criaBaralho(&monte);
           int i;
           /*Embaralhando o Baralho*/
           for (i=0;i<10;i++)
            embaralha(&monte);
           break;
        }
        case 3:{
           system("clear");
           printf("Placar de %s : %d \n", nome1, placar1);
           printf("Placar do %s : %d \n", nome2, placar2);
           scanf("%c", &ch);
           break;
        }
        case 4:{
           system("clear");
           placar1 = placar2 = 0;
           printf("Placar Zerado\n");
           scanf("%c", &ch);
           break;
        }
        case 5:{
           system("clear");
           printf("\nSaindo do Programa\n");
           scanf("%c", &ch);
           exit (0);
           break;
        }   
        default:{
           printf("\nEntre com um valor válido!\n");
           scanf("%c", &ch);
        }
     }
     scanf("%c", &ch);
   }while (op != 5);
   
   return 0;
}

Scripts recomendados

Arquivos utilizados no artigo: "Desenvolvendo um plugin para o XMMS"

Gerenciamento de Área de Alocação Dinâmica (Listas Encadeadas)

Tipos de Dados Abstrato - TDA - Números Complexos

Cálculo de logaritmo de um número por Série de Taylor em C

Usando shared memory 2


  

Comentários
[1] Comentário enviado por eduardo em 22/07/2008 - 15:31h

Não está dando pra fazerr o download do Script :)

[2] Comentário enviado por tiagofga em 28/07/2008 - 12:32h

Bem, eu mandei o arquivo do Script... Não sei pq não está disponível

[3] Comentário enviado por canaman em 30/11/2012 - 16:56h

Fiz o download do arquivo mas ele está com as aspas erradas e tem uns erros - na linha 82 os 2 if's foram bagunçados... Peguei o código da página, falta corrigir o PUBLIC nele (adicionar a linha a seguir no começo: #define PUBLIC extern).


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts