Jogo de 21 em C
Publicado por Tiago Alves de Oliveira 09/07/2008 (última atualização em 30/11/2012)
[ Hits: 19.534 ]
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;
}
Controle de estoque com listas
Cálculo de logaritmo de um número por Série de Taylor em C
Script MakePach para correção de platarforma 32 bits para 64
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como impedir exclusão de arquivos por outros usuários no (Linux)
Cirurgia no Linux Mint em HD Externo via USB
Anúncio do meu script de Pós-Instalação do Ubuntu
Formas seguras de instalar Debian Sid (2)
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (12)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (5)
Alguém executou um rm e quase mata a Pixar! (3)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (6)









