• 0
Sign in to follow this  
Guest HunterX

GrayJack (quase BlackJack) erro!

Question

Guest HunterX

Gente to com um problemão aqui...

tenho esse exercicio pra entregar até sábado (05/abril), eu to tentando fazer desde o fim de semana... mas ainda não consegui e como eu não tenho compilador no trabalho, acabo ficando com pouco tempo pra tentar fazer durante a semana.

se alguém puder me ajudar eu vou agradecer muito!

vou postar o que foi pedido, e o meu código como está...

deem uma olhada pls =)

-------------------------------------------------------------------

Exercicio GrayJack

-------------------------------------------------------------------

Regras do Jogo entre Banca e Apostador

As regras do jogo, para este Exercício-Programa, estão descritas a seguir:

• Tanto a banca quanto o apostador são genericamente chamados de jogador.

• Dizemos que a pontuação de um jogador é o total dos valores das cartas que foram sorteadas para este jogador. Vence aquele jogador cuja pontuação for maior. Em caso de empate, vence aquele que fez a pontuação com o menor número de cartas. Caso ainda haja empate, a banca é que ganha.

• A banca administra o baralho e sorteia, suponha que honestamente, as cartas. Primeiro, tantas cartas quanto o apostador quiser; em seguida, tantas cartas quanto a banca desejar para si.

• A cada novo sorteio, a carta sorteada é virada sobre a mesa de modo que o jogador e a banca a vejam.

• O baralho possui 52 (cinquenta e duas) cartas. É um baralho comum com as 13 (treze) cartas dos quatro naipes usuais.

• O valor das cartas:

• ás vale 1 (um),

• as figuras (rei, dama e valete) valem 10 (dez),

• e as demais cartas valem o número correspondente.

• Caso a pontuação do apostador supere 21 (vinte e um), situação em que se diz que a pontuação do apostador estourou, o apostador perde automaticamente.

• Por simplicidade, vamos adotar que, após sortear uma carta, a mesma é devolvida ao baralho. Depois o baralho é então honestamente embaralhado antes de um novo sorteio de uma carta, caso seja necessário. Assim o sorteio de uma segunda carta é completamente independente da carta sorteada na vez passada, ou seja, na última vez. Pode-se inclusive repetir a mesma carta.

Estratégias da Banca e do Apostador

Cada jogador (a banca e o apostador) possui um objetivo e uma estratégia. O objetivo de cada jogador obviamente é vencer. Quanto às estratégias, elas podem ser as descritas a seguir.

A estratégia do apostador é pedir que a banca sorteie uma nova carta para ele enquanto achar necessário. O apostador sabe que precisa ter a maior pontuação possível, sem no entanto estourar. Assim, uma estratégia bastante simples é adotar um teto para o apostador. Se sua pontação corrente for menor que o teto, ele pede mais uma carta; caso contrário, ele diz à banca que não quer mais nenhuma carta e, caso o apostador não tenha estourado, a banca passa a sortear cartas para si própria.

Quanto à estratégia da banca, é mais simples ainda. Se o apostador não tiver estourado, pois caso contrário a banca já teria ganho, ela vai sorteando cartas para si enquanto a mão obtida não lhe garantir a vitória sobre o apostador e houver ainda alguma chance de obter uma mão vencedora com um novo sorteio. Ao final, a banca terá uma mão que lhe garanta a vitória sobre o apostador (por exemplo, maior pontuação; ou, no caso de empate, menor número de cartas - ver a Seção Regras do Jogo), ou terá estourado.

----------------------------------------------------

Tarefa

----------------------------------------------------

Neste Exercício-Programa você deverá escrever um programa em C que faça uma estatística de várias simulações do jogo GrayJack entre a banca e o apostador. Seu programa deve testar as estratégias do apostador e da banca conforme descritas anteriormente, para todos os valores possíveis que teto possa assumir. Para cada valor de teto, de 1 (um) a 21 (vinte e um), o programa deve simular 100 (cem) jogos e computar quantos jogos o apostador venceu. Chamemos de derrotas o número de vezes que o apostador venceu (portanto o número de vezes que a banca perdeu). Para cada um destes testes com teto, o programa deve imprimir uma linha dizendo qual valor de teto está sendo considerado e em seguida tantos caracteres '*' quanto for o valor de derrotas . Se para teto=4 e teto=5 os valores encontrados de derrotas forem respectivamente 20 (vinte) e 29 (vinte e nove), deverão ser impressas linhas como as abaixo:

4: ********************

5: *****************************

O Sorteio

O procedimento para o sorteio das cartas deverá ser o mesmo feito no Exercício-Programa 1 (EP1), ou seja, usando a fórmula mágica

carta = 1 + (int) (13.0 * (rand() /(RAND_MAX + 1.0)));

seguindo todas as observações relativas à inclusão de <stdlib.h>.

Vimos no EP1 que para que a fórmula mágica funcione corretamente é necessário colocar início do programa (na primeira linha depois da declaração das variáveis, e somente aí) o seguinte comando mágico:

srand(123456);

Sem entrar em muitos detalhes, este comando mágico inicializa o gerador de números (o rand da fórmula mágica). Esta inicialização depende do inteiro colocado entre parênteses (no caso acima, o inteiro 123456). Este número é chamado de semente. Ou seja, dependendo o inteiro colocado (semente), outros números (cartas) serão gerados.

Neste Exercício-Programa, vamos permitir que o usuário digite (entre com) a semente para geração dos números (cartas) da seguinte forma:

printf ("Entre com uma semente: ");

scanf ("%d", &semente);

srand (semente);

O trecho de programa acima deve ser colocado no início do programa (na primeira linha depois da declaração da última variável, e somente aí).

Observe que, dependendo da semente colocada, outros números (cartas) serão gerados, e portanto, outras estatísticas serão obtidas. Porém, para garantir uniformidade dos resultados das execuções para uma mesma semente, nenhuma carta deve ser sorteada desnecessariamente.

Exemplos de execução do programa

Considere os seguintes exemplos de possíveis execuções de seu programa. Observamos que dependendo do Sistema Operacional em uso, é possível resultados diferentes dos exemplos abaixo. Os números em vermelho foram digitados pelo usuário.

Exemplo 1

Entre com uma semente: 123456

1:

2:

3:

4:

5: *

6: *

7: ***

8: ***

9: ***********

10: ******

11: **************************

12: ***********************************

13: ***********************************

14: ***************************************

15: **********************************

16: ********************************

17: *********************************************

18: ******************************

19: *******************************

20: ***********************************

21: ****************

----------------------------------------------------

Meu código

----------------------------------------------------

#include <stdlib.h>
#include <stdio.h>

int main(){
    int carta, teto, jogador, banca, semente, cjog, cbanca, cont;
    
    printf("Entre com uma semente: ");
    scanf("%d", &semente);
    
    srand(semente);
    
    for(teto = 1; teto <= 21; teto++){
        printf("\n%d: ", teto);
        jogador=0;
        banca=0;
        cjog=0;
        cbanca=0;
        
        for(cont = 0; cont < 100; cont++){
                            
          do{
                carta = 1 + (int) (13.0 * (rand() /(RAND_MAX + 1.0)));
                if((carta==11)||(carta==12))
                jogador+=10;
                else
                jogador+=carta;
                cjog++;
          }while(jogador < teto);
          
          if(jogador > 21) break;
          
          do{ 
                carta = 1 + (int) (13.0 * (rand() /(RAND_MAX + 1.0)));
                if((carta==11)||(carta==12))
                banca+=10;
                else
                banca+=carta;
                cbanca++;
           }while(banca < jogador);
                
            if((banca == jogador)&&(cjog<cbanca))
                printf("*");
                
            else if((jogador <= 21)&&(banca>21))
                printf("*");
            
        }
        
    }
    
    
    /*for(cont=0; cont<50; cont++){
        carta = 1 + (int) (10.0 * (rand() /(RAND_MAX + 1.0)));
        printf("%d\n", carta);
    }*/
    printf("\n");
    system("PAUSE");
    
    return 0;
}

Coloquei o .exe enviado pelo prof no mediafire, se alguém quiser pegar pra testar... ai vai o link:

http://www.mediafire.com/?syj9z2tnmmm

Então é isso.

se puderem me ajudar... eu agradeço.

Abraço!

Obrigado!

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this