Jogo de 21 em C
Publicado por Tiago Alves de Oliveira 09/07/2008 (última atualização em 30/11/2012)
[ Hits: 19.115 ]
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; }
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Encontre seus arquivos facilmente com o Drill
Mouse Logitech MX Ergo Advanced Wireless Trackball no Linux
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Remoção de propaganda com o programa Comskip[AJUDA] (5)
Linux Lite Demorando Muito Para Ligar (2)