Nessa aula vamos modelar um jogo bem conhecido, o 21, ou BlackJack. Nele os jogadores devem tentar chegar mais perto da soma de cartas 21, sem estourar. Quem chegar mais perto ganha.
Cada jogador começa com duas cartas, sendo que as cartas tem o seu valor nominal, as figuras (J, Q, K), que valem 10. Além disso, o Ás, pode valer 1 ou 11. O que for mais vantajoso para o jogador.
Para começar vamos fazer uma simulação com um baralho, ou seja 52 cartas. Já que] para o jogo, não importa o naipe da carta, vamos supor que existem quatro cartas de cada. Para isso, vamos criar duas funções, uma que cria um baralho e o guarda em um vetor, e uma segunda que pega uma carta do baralho. Nessa segunda função temos que “retirar” a carta do vetor. Caso já não exista a carta do tipo desejado, temos que sortear uma nova carta.
functioncriaBaralho() cards =zeros(Int8, 13) i =1while i <14 cards[i] =4 i +=1endreturn cardsendfunctionpegarCarta(cards) sorteio =rand(1:13)while cards[sorteio] ==0 sorteio =rand(1:13)end cards[sorteio] -=1if sorteio >10# se a carta for figura, ela vale 10 sorteio =10endreturn sorteioend
pegarCarta (generic function with 1 method)
De posse dessas duas funções, podemos criar outras que simulam o comportamento dos jogadores. Vamos usar algumas estratégias simples, como o jogador que fica com as duas cartas que recebeu.
Notem que acima, usamos a estratégia de usar o Ás da forma mais vantajosa.
Para os outros jogadores, vamos usar estratégias mais elaboradas, ou seja o jogador fica pegando cartas enquanto não chegar a um valor pré-determinado, como por exemplo 21, 19, 17, 15 e 13.
Como cada jogador pode ter um número grande de cartas e no caso dele ter um Ás, a conta tem que ser feita da maneira mais vantajosa, vamos usar uma função que recebe um vetor de cartas e calcula a soma.
functionsomaCartas(c) soma =0 temAz =falsefor i in c soma += iif c ==1 temAz =trueendendif soma <=11&& temAzreturn soma +10elsereturn somaendend
somaCartas (generic function with 1 method)
De posse do soma cartas, podemos modelar os jogadores.