Jogo de 21 em C

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

[ Hits: 19.625 ]

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

Jogo Simon (Genius) - com gráficos

Ordenar um lista estática sequencial básica (bubblesort)

Jogo Micro Breakout

Joguinho de labirinto usando as setas do teclado

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


  

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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts