CS61A: Projeto Hog (Parte 2)
Tags: braziliandevs, python
Published: 2023-10-16 12:10:47

## Introdução

> O curso CS 61A da Universidade da Califórnia, Berkeley, é um curso de introdução à ciência da computação. Ele busca fornecer uma base sólida em programação, abordando conceitos fundamentais de estruturas de dados, algoritmos e paradigmas de programação. O curso é conhecido por sua ênfase em Python como a linguagem principal de programação e pela abordagem prática e desafiadora.

---

## Fase 1: Problema 2

> Implemente `boar_brawl`, que recebe a pontuação do jogador `player_score` e a pontuação do oponente `opponent_score`, e retorna o número de pontos feitos pelo **Boar Brawl** quando o jogador joga 0 dados.

- **Boar Brawl**: Jogador que rola pontuação zero do dado pontua três vezes a diferença absoluta entre o digito das dezenas da pontuação do oponente e o dígito da unidade da pontuação do jogador, ou 1, o que for maior. Se a pontuação do jogador for de dígito único (menor do que 10), o dígito das dezenas do jogador será 0.

### Exemplos
- *Exemplo 1*: 
	- A pontuação atual do jogador é de `21` pontos e a da oponente é de `46` pontos, e o jogador da rodada escolher rodar nenhum dado (zero dados).
	- O dígito das dezenas da pontuação do oponente é `4` e o dígito das unidades do jogador é `1`.
	- Então, o jogador ganha `3 * abs(4 - 1) = 9` pontos.
- *Exemplo 2*:
	- A pontuação atual do jogador é de `45` pontos e o oponente é de `52` pontos, o jogador da rodada escolhe rodar nenhum dado (zero dados).
	- O dígito das dezenas da pontuação é `5` e o das unidades do jogador é `5`.
	- Então, `3 * abs(5 - 5) = 0`, o jogador ganhará `1` ponto.
- *Exemplo 3*:
	- A pontuação atual do jogador é de `2` pontos e a do oponente é de `5` pontos, o jogador da rodada escolhe rodar nenhum dado (zero dados).
	- O dígito das dezenas do oponente é `0` e o dígito das unidades do jogador é `2`.
	- Então, o jogador ganha `3 * abs(0 - 2) = 6` pontos.

> **Dica importante!**
> Don't assume that scores are below 100. Write your `boar_brawl` function so that it works correctly for any non-negative score.

### Solução

A solução deste desafio é puramente matemática, e passa pelo entendimento das operações `//` e `%`, e da manipulação dos termos chamados `resto` e `quociente`.

O operando `//` retorna o `quociente` de uma divisão.
O operando `%` retorna o `resto` de uma divisão.

Segue na imagem abaixo uma representação melhor do uso destes operandos:
![três operações de divisão](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nsn9qlc4d1m1fle3h8oj.png)

A partir daí, eu já posso olhar para os exemplos dados pela atividade para elaborar o algoritmo a ser utilizado para a solução desta fase do projeto.

Então, olhando para o *Exemplo 1*.
- Pontuação do jogador é `21` pontos, quero o valor do seu dígito das unidades que é `1`;
- Pontuação do oponente é `46` pontos, quero o valor do seu dígito das dezenas que é `4`;

Quais operações devo fazer, usando apenas a divisão para extrair os números que quero na proposta deste desafio. Deixei uma pista na divisão do 15 ÷ 10.

- Se eu realizar a operação `21 ÷ 10` e procurar pelo o seu resto, vou obter `1`.
- Se eu realizar a operação `46 ÷ 10` e procurar pelo o seu quociente, vou obter `4`.

Excelente!

Mas e nas situações que o valor da pontuação for `maior do que 100`? Igual ao colocado na terceira representação de divisão da imagem acima.

Vamos para mais uma imagem para a representação deste caso:

![duas operações de divisão](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3x5pmnp5k7dyyi648mhr.png)

- Observamos que para o caso da pontuação do jogador, onde se busca o dígito das unidades, `nada se altera`.
- Para o caso da pontuação do oponente, precisamos realizar duas operações.
	- Primeiro buscamos o seu `quociente` através do operador `//`.
	- Com o seu `quociente`, repetimos a operação mas agora buscando o seu `resto` através do operador `%`.

A partir do entendimento do problema e da criação da solução, podemos então ir para a parte do código e testar para ver se atende todos os casos possíveis.

Solução em Python:

![Solução em Python](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n3mk18p8t2beitfbzm8a.png)

Aprovado em todos os testes:

![Casos de Teste aprovados](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/00jtcss4409nl3g27puc.png)

## Conclusão

A partir do momento que se entende o padrão, utilizar a ferramenta da **linguagem de programação** é o processo mais fácil da atividade. Este desafio testou muito mais a utilização de operações matemáticas para encontrar a sua solução e manter a lógica de pontuação do 'Jogo do Hog', através deste sistema **Boar Brawl**.

Espero que a explicação esteja clara e ajude a quem está começando. Nos vemos na próxima!