Jogo de 21 em C
Publicado por Tiago Alves de Oliveira 09/07/2008 (última atualização em 30/11/2012)
[ Hits: 19.574 ]
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;
}
Algoritmo de Fatoração de Fermat (FFA) em C
Thread, Courses, Shell e Aquivo
Função "Partição de Inteiros" Recursiva COM Tabela Estática em C
3 EP - Poli USP - Angry Birds (angry bixos)
Cálculo de logaritmo de um número por um terceiro método em C
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Instalar Linux em notebook Sony Vaio VPCEG13EB (10)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)









