Aulas do bloco

← Aulas

PythonAula 1228/08/20261h35

Funções e batalha final do RPG

Retoma o RPG com match-case, guard, case _ e random.randint() para o D20, com validação de input() por .isdigit() e int(). Destrava função com def, parâmetro, return, None e escopo para quebrar código grande e reorganizar o jogo em atos, fechando com while, and e break na batalha por turnos. Leitura do TP2 na terça, TP2 vai para dia 4 e TP3 para dia 9.

O que foi falado

  1. Relembrar RPG com match-case e D20

    00:11:49

    O jogo joga um D20 de 1 a 20 com random.randint() e decide com match na resposta. case com if só entra se a igualdade bater e o dado passar do limite, tipo esquiva com dado >= 10 e aura com dado >= 15. | faz OU dentro do case e case _ pega o resto como else, valendo só o primeiro case que bate de cima para baixo.

    Python
    dado = 17
    resposta = 0
    match resposta:
        case 0 | 1 if dado >= 10:
            print("esquivou")
        case _:
            print("atingido")

    Saída

    esquivou
  2. Declarar função com def e invocar com ()

    00:22:28

    Função é um bloco combinado que serve para quebrar código grande e ilegível em partes. Declarar com def sozinho não executa nada, só combina com Python que aquele nome existe. Só roda quando invoca com nome mais ( e ), por isso jogo dentro de rodaJogo nada faz sem a chamada.

    Python
    def soma(a, b):
        return a + b
    
    print(soma(2, 3))

    Saída

    5
  3. Criar input_digito com parâmetro e return

    00:28:05

    A função recebe enunciado, mostra com input(), testa com .isdigit() e converte com int() se válido. Se válido devolve o número com return, se inválido devolve None pelo else. Quem chama precisa guardar em variável com = ou mandar print() direto sem guardar.

    Python
    def input_digito(texto):
        if texto.isdigit():
            return int(texto)
        return None
    
    print(input_digito("20"))
    print(input_digito("oi"))

    Saída

    20
    None
  4. Entender escopo e () obrigatório

    00:41:22

    Variável criada dentro da função como resposta só existe lá dentro e morre ao terminar, então não conflita com mesmo nome fora. Função pode não receber nada e não retornar nada, mas precisa manter ( e ) ao declarar e ao invocar. Python lê de cima para baixo, mas declarar não executa, então primeiroAto pode chamar segundoAto declarado depois porque só roda na chamada final.

    Python
    resposta = "fora"
    def teste():
        resposta = "dentro"
        return resposta
    
    print(teste())
    print(resposta)

    Saída

    dentro
    fora
  5. Reorganizar jogo em rodaJogo e atos

    00:50:14

    O código foi quebrado em rodaJogo, mostraEpilogo, primeiroAto, segundoAto e terceiroAto para ler por partes. Cada ato cuida de uma decisão, e o terceiro testa aura ou esquiva no D20 com match-case e guard. Para testar só um trecho, comenta a chamada de rodaJogo e chama só o ato.

    Python
    def primeiro_ato():
        return "comecou"
    
    def roda_jogo():
        print(primeiro_ato())
    
    roda_jogo()

    Saída

    comecou
  6. Fazer batalha com while, HP e break

    01:12:48

    O quarto ato repete o turno com while enquanto hp_heroina > 0 and hp_demonio > 0. Cada volta mostra HP com f-string, oferece curar, atacar ou aura e aplica dano do demônio. Se o demônio morre no ataque, um if com break escapa do while para não dar turno para morto.

    Python
    hp_heroina = 20
    hp_demonio = 10
    while hp_heroina > 0 and hp_demonio > 0:
        hp_demonio = hp_demonio - 7
        if hp_demonio <= 0:
            break
    print(hp_demonio)

    Saída

    -4

Perguntas que valem a pena

Pode usar or no match-case para alternativa?00:14:28

Não, no match-case o OU é o |, or só vale em contexto booleano.

Para que serve o else na função de ler dígito?00:40:47

Serve para tratar o caso inválido retornando None, sem return explícito também retornaria None.

Variável dentro da função conflita com mesmo nome fora?00:41:12

Não, é escopo, só existe dentro da função e morre ao terminar.

Pode declarar função sem nada dentro dos parênteses?00:57:27

Sim, mas precisa manter ( e ) ao declarar e ao invocar.

Como a função chama outra declarada depois se Python lê de cima para baixo?00:58:25

Declarar é só combinado, primeiroAto só executa na chamada final, quando segundoAto já existe.

Precisa testar se o demônio está vivo antes do turno dele?01:28:14

Sim, foi adicionado if com break para escapar do while.

Conceitos da aula

  • match-case
  • guard
  • case _
  • função
  • def
  • parâmetro / argumento
  • return / retornar
  • None
  • escopo
  • while
  • break
  • f-strings

Reforce este assunto

10 exercíciosComeçar →