CS61A: Projeto HOG (Parte 1)
Tags: braziliandevs, cs61a, python
Published: 2023-10-13 22:07:12

## 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.

Esta publicação vai focar no primeiro projeto desta disciplina que é chamado 'O jogo de Hog'. Eu confesso que não conhecia este jogo até começar a fazer este desafio, continuo não tendo o jogado mas compreendi as regras que são explicadas na [página do projeto](https://cs61a.org/proj/hog/).

Ainda não terminei de fazer este desafio, então vou publicar meus sucessos, dúvidas e dificuldades como forma de estudo e buscar trabalhar em cima da minha comunicação também. O projeto está divido em fases e cada fase possui uma série de problemas a serem solucionados.

---
## Fase 1: Problema 1

> Implemente a função `roll_dice` em `hog.py`. Esta função recebe dois argumentos: um número inteiro positivo chamado `num_rolls` recebendo o número de vezes que o dado será rolado e uma função `dice`. Esta função retornará o número de pontos ao rolar o dado aquele número de vezes em uma rodada: será tanto a soma de suas saídas ou 1 (*Sow Sad*).

- **Sow Sad**. Se qualquer resultado do dado lançado for 1, a pontuação do jogador na rodada será `1`.

### Exemplos
- *Exemplo 1*: O jogador da rodada joga o dado 7 vezes, 5 destas são 1. A pontuação do turno será `1`.
- *Exemplo 2*: O jogador da rodada joga o dado 4 vezes, em todas são 3. Como Sow Sad não ocorreu, a pontuação do turno ao jogador será de `12`.

### Solução

Uma dica importante fornecida na descrição do problema é a seguinte:

"You should call `dice()` exactly `num_rolls` times in the body of `roll_dice`."

A primeira abordagem que me veio à mente ao olhar para os exemplos foi utilizar as condicionais para verificar se o valor de algum dos dados é igual a 1 e, caso positivo, retornar 1.

No entanto, essa abordagem enfrenta um desafio que vai em direção oposta a **dica importante** fornecida na descrição do problema. No momento que o laço repetitivo encontrar o valor, interromperá o laço, ou seja, impedirá que a função `dice()` seja chamada exatamente `num_rolls` vezes, como exigido pelo problema.

Uma alternativa que encontrei foi a utilização de uma flag (valor booleano).  Quando um valor igual a 1 é encontrado em uma jogada, a flag é definida como verdadeira. O loop continua rodando o número de vezes especificado em num_rolls.

Após o término do loop, outra condicional pode ser usada para determinar o valor da resposta, que será 1 se a flag for verdadeira (indicando que ocorreu o **Sow Sad**), ou o valor acumulado das jogadas, caso contrário.

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

## Conclusão

Trocar um `for _ in range()` por um `while` foi um marco para mim na solução deste desafio, e a utilização de flags para indicar a ocorrência de uma ação tornou o código mais claro.

Quero buscar falar de cada problema que for fazendo e aprimorar minha capacidade de solucionar problemas, espero que isto ajude a quem buscar fazer este curso.