O dono de um cassino de ``Las Begas'', em ``ABUSA'', pretente fazer uma máquina jogadora de ``Seven & Half'' para jogar contra seus clients, digo, seus clientes. O dono do cassino, Mr. H. R. Whole, deseja que o jogador aposte contra a máquina (que faz as vezes da banca) como descreveremos abaixo.
Daremos primeiramente a descrição do jogo como normalmente é jogado em ABUSA.
Veremos agora um exemplo de quatro jogos:
jogo | jogador | cartas | pontuação | situação final |
jogo 1 | apostador | ás, 3, dama, rei, 2 |
![]() |
apostador vence |
banca | 4, 2, rei, 5 |
![]() |
||
jogo 2 | apostador | ás, 3, 6 | ![]() |
banca vence |
banca | ||||
jogo 3 | apostador | ás, rei, 6 |
![]() |
banca vence |
banca | 7, valete | ![]() |
||
jogo 4 | apostador | 7 | ![]() |
apostador vence |
banca | 7, ás | ![]() |
Cada jogador possui um objetivo e uma estratégia. O objetivo de cada jogador é vencer. Quanto às estratégias não são muito mais complicadas.
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, adotaremos uma estratégia simples: adotaremos 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 jogador não tenha estourado, ela 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á terá ganho, ela vai sorteando cartas para si enquanto a pontuação obtida não lhe garantir a vitória sobre o apostador e houver ainda alguma chance de obter uma pontuação vencedora com um novo sorteio. Ao final, a banca terá feito uma pontuação que lhe garanta a vitória sobre o apostador, ou terá estourado.
O dono do cassino, Mr. Whole, decidiu contratar vocês para construir um programa que simule o jogo de suas máquinas de ``Seven n Half''. Como vimos antes, o apostador joga contra a máquina que por sua vez faz o papel da banca.
Por simplicidade2, após sortear uma carta qualquer, o jogador em questão contabiliza os pontos da carta que foi sorteada para si e a carta é devolvida ao baralho. O mesmo é 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, digo, na última vez. Pode inclusive repetir-se a mesma carta.
Primeiro, o programa deve inicializar uma variável de nome passado com o valor real:
passado = 0.<seu número USP> /* exemplo: passado = 0.5262199 */
Depois deve ser feito o seguinte cálculo:
sorteio = ( 9821.0 * fabs( seno(passado) ) + 0.211327 ) (1)
passado = sorteio - floor( sorteio ) (2)
onde fabs(x) é uma função que devolve o módulo de x,
floor(x) é uma função que devolve o maior inteiro não maior que x,
As fórmulas em (1) e (2) (nesta ordem) nos fornecem um número no intervalo
. Para obtermos um número inteiro entre 1 e 10 basta fazer a
seguinte conta:
carta = floor( passado*10 + 1 ); (3)
Isto fornece-nos uma carta, sendo que ,
e
representam
respectivamente uma dama, valete e rei. Observe que os
náipes não interessam. Sempre que for desejado um sorteio de uma carta, o
programa DEVE fazer as operações descritas nos passos (1), (2) e (3).
Observe que durante as repetições da (1) e (2) o valor da variável passado vai sendo alterado e portanto os valores sorteados para as cartas vão se alterando.
Mr. Hole, digo Mr. Whole, deseja saber se a sua máquina de Seven & Half
alferirá bons lucros, qualquer que seja a estratégia adotada pelo apostador.
Por isto, o dono do casino3 contratou o supra-sumo das turmas supra-citadas para
fazer um programa em C que simule os jogos de suas máquinas. Seu programa
deve testar as estratégias do apostador e da banca CONFORME descrito
anteriormente, para todos os valores possíveis que teto possa
assumir. Para cada valor de teto, de a
, o
programa deve simular
jogos e computar em 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 máquina de Mr. Hole Rule Whole
perdeu). Para cada um destes testes com teto, o programa deve
imprimir uma linha dizendo qual valor de teto está sendo considerado,
quantas vezes o apostador venceu (o valor de derrotas) e em seguida
tantos caracteres '*' quanto for o valor de derrotas. Se
para teto=4.5 e teto=5 os valores encontrados de
derrotas forem respectivamente 20 e 29, deverão ser impressas linhas
como as abaixo:
4.5 20 ******************** 5.0 29 *****************************
IMPORTANTE: Todo exercício-programa deve seguir as
observações contidas nos folhetos distribuídos a parte. Nestes folhetos estão
descritas as diretrizes para a forma de entrega do exercício, aspectos
importantes na avaliação, etc. Para calcular os valores do
seno(x) USE OBRIGATORIAMENTE a seguinte aproximação: