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: