Jogo de 21 em C
Publicado por Tiago Alves de Oliveira 09/07/2008 (última atualização em 30/11/2012)
[ Hits: 19.056 ]
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ão 2 - Enviado por Tiago Alves de Oliveira em 26/11/2012
Changelog: - Erro nos includes
- Corrigido o erro do public
/* -*- 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; }
Tipos de Dados Abstrato - TDA - Vetor
3º EP - Poli USP - Angry Birds (angry bixos)
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)