Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: slack+flux
Por U-Neeks
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Scripts

Linux user

Publicado por Tiago Alves de Oliveira em 09/07/2008    [ 4829 hits ]

Login: tiagofga, 31992 pontos

   


Descrição

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

[ Download: jogo21.c ]   [ Enviar nova versão ]

[ 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
   Script Linux recomendado RPN (Notação Polar Revesa)
   Script Linux recomendado gerador automatico de Makefiles
   Script Linux recomendado Tipos de Dados Abstrato - TDA - Vetor
   Script Linux recomendado Jogo da Velha com IA invencivel
   Script Linux recomendado Biblioteca dos.h

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


Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.