Jogo de 21 em C
Publicado por Tiago Alves de Oliveira 09/07/2008 (última atualização em 30/11/2012)
[ Hits: 19.438 ]
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;
}
gerador automatico de Makefiles
[GAME-2] Acerte os rortões nas janelas (jogo com gráficos)
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
O programa assinador digital (1)
PIP3 - erro ao instalar módulo do mariadb para o Python (9)
É normal não gostar de KDE? (8)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)









