Program Arcade Games
With Python And Pygame

Chapter 6: Voltando aos Laços (loops)

fig.nested_loops

Jogos envolvem uma série de laços (loops) cmplexos. Neste cápitulo “desafiamos” você a ser um expert em laços de repetição (loops). Se você puder entender os problemas propostos nesse capítulo, no final, você vai poder ter a certeza de que se tornou um expert em laços de repetição (loops).

Se tornar-se um especialista em loops não for sua meta, pelo menos, certifique-se que você pode responder os oito primeiros problemas. Isso lhe dará o suficiente conhecimento para continuar este livro. (Embora, ser um especialista em laços de repetição (loops) nunca agregue qualquer valor. Exceto para aquele cara no Filme Groundhog Day).

Tem explicações no vídeo das respostas on-line e nas repostas tem como você ver o código funcionando clicando no botão “animate” ou no botão “step”.

6.1 Caractere de finalização (end)

Por padrão, o comando print imprime um retorno de carro carriage return no final de toda saida para o console. Como foi explicado no capítulo um, o retorno de carro (carriage return) é um caractere que faz com que com que as linhas impressas no console sejam impressas uma debaixo da outra. Na maior parte das vezes, isso é exatamente o que queremos, mas algumas vezes, não. Se precisarmos que algo que estamos imprimindo continue na mesma linha, precisamos mudar o caractere padrão de finalização. Isto mostra um exemplo de como isso acontece realmente:

print("Pink")
print("Octopus")

...assim será a saída no console:

Pink
Octopus

Mas se precisarmos que o nosso códido imprima isso na mesma linha, devemos usar essa nova opção definindo o caractere de finalização end. Por exemplo:

print("Pink", end="")
print("Octopus")

Insto irá imprimir:

PinkOctopus

Podemos usar um espaço entre as aspas, como se ve abaixo:

print("Pink", end=" ")
print("Octopus")

Insto irá imprimir:

Pink Octopus

Aqui um exemplo usando uma variável:

i = 0
print(i, end=" ")
i = 1
print(i, end=" ")

Isto irá imprimir:

0 1

6.2 Problemas Avançados de laços de repetição (loops)

  1. Escreva um código que imprima 10 asteriscos “*” como mostrado a seguir:
    * * * * * * * * * *
    

    Este código deve imprimir usando um laço for, e imprimir cada asterisco individualmente, ao contrário de imprimir 10 asteriscos em um comando print. Isto pode ser feito em duas linhas de código, em uma um laço for e logo abaixo, na linha em seguida, um comando print. Mesmo que você tenha percebido isso, ou desistido, aqui vai a reposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_1.php

  2. Escreva um código que imprima isso:
    * * * * * * * * * *
    * * * * *
    * * * * * * * * * * * * * * * * * * * *
    

    Isto é exatamente como no problema anterior, mas também imprime outros cinco e mais vinte asteriscos. Copie e cole o mesmo e ajuste o laço for para tal.

    Mesmo que você tenha percebido a solução, ou desistido, aqui está a reposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_2.php

  3. Use dois laços for, um aninhado dentro do outro, para imprimir um retângulo com 10x10 asteriscos:
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    

    Para começar, de uma olhada no problema 1. O código no problema que gera uma linha de asteriscos. Ele precisa ser repetido dez vezes. Trabalhe neste problema pelo menos dez minutos antes de olhar a reposta.

    Mesmo que tenha percebido ou desistido, veja a solução aqui:
    ProgramArcadeGames.com/chapters/06_back_to_looping/10x10box.php

  4. Use dois laços for, uma aninhado dentro do outro para imprimir seguidos asteriscos e formar um retângulo de 5x10:
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    

    Isto é muito parecido com o problema anterior. Experimente com intervalos no laço para encontrar a faixa exata de valores que a funçao range deve controlar.

    Mesmo que você tenha percebido a solução, ou desistido, aqui vai a resposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_4.php

  5. Use laços for, um aninhado dentro do outro para imrprimir esse retângulo de 20x5 asteriscos:
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    

    Aqui também é como nos problemas 3 e 4, a diferença está somente na faixa de valores.

    Mesmo que você saiba a reposta ou mesmo se desistiu, aqui está ela:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_5.php

  6. Escreva um código para imprimir o seguinte:
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8 9
    

    Use dois laços aninhados. Imprima a primeira linha com o laço, e não com:

    print("0 1 2 3 4 5 6 7 8 9")
    

    Dica: Primeiro, crie um laço (loop) que imprime a primeira linha. Em seguida, coloque dentro desse laço, um outro laço que repete a linha 10 vezes. Utilize as variáveis i ou j para imprimir pelo programa. Este exemplo e o próximo ajudam a reforçar o que essas variáveis de índice fazem.

    Trabalhe nesse programa pelo menos dez minutos antes de olhar a reposta. Dispensar esses dez minutos trabalhando na solução é muito mais importante do que a solução em si.
    ProgramArcadeGames.com/chapters/06_back_to_looping/number_square_answer.php

  7. Ajuste o programa anterior para imprimir:
    0 0 0 0 0 0 0 0 0 0
    1 1 1 1 1 1 1 1 1 1
    2 2 2 2 2 2 2 2 2 2
    3 3 3 3 3 3 3 3 3 3
    4 4 4 4 4 4 4 4 4 4
    5 5 5 5 5 5 5 5 5 5
    6 6 6 6 6 6 6 6 6 6
    7 7 7 7 7 7 7 7 7 7
    8 8 8 8 8 8 8 8 8 8
    9 9 9 9 9 9 9 9 9 9
    

    Resposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_7.php

  8. Escreva um código que imprima o seguinte:
    0
    0 1
    0 1 2
    0 1 2 3
    0 1 2 3 4
    0 1 2 3 4 5
    0 1 2 3 4 5 6
    0 1 2 3 4 5 6 7
    0 1 2 3 4 5 6 7 8
    0 1 2 3 4 5 6 7 8 9
    

    Dica: Isto é o mesmo que o problema 6, mas o laço (loop) de dentro não iterage um número fixo de vezes. Não use range(10), mas ajuste a faixa de valores.

    Depois de tentar pelo menos dez minutos no problema, olhe a reposta aqui::
    ProgramArcadeGames.com/chapters/06_back_to_looping/top_right_triangle.php

    Tenha certeza que você pode escrever o código para os problemas anteriores. Sim, praticar isso é trabalhoso, mas irá recompensar depois e você ganhará muito tempo com isso ao escrever códigos para programas efetivos.

  9. Escreva um código para imprimir o seguinte:
    0 1 2 3 4 5 6 7 8 9
      0 1 2 3 4 5 6 7 8
        0 1 2 3 4 5 6 7
          0 1 2 3 4 5 6
            0 1 2 3 4 5
              0 1 2 3 4
                0 1 2 3
                  0 1 2
                    0 1
                      0
    

    Isto é um pouco difícil. Dica: necessita ter dois laços (loops) um dentro do outro controlando cada linha. Primeiro, um laço para imprimir espaços, depois, um laço para imprimir os números. Ambos os laços imprimem cada linha. Para treinar um pouco, tente escrever um código que imprima isso:

    0 1 2 3 4 5 6 7 8 9
    0 1 2 3 4 5 6 7 8
    0 1 2 3 4 5 6 7
    0 1 2 3 4 5 6
    0 1 2 3 4 5
    0 1 2 3 4
    0 1 2 3
    0 1 2
    0 1
    0
    

    Então, quando estiver funcionando, adicione um laço depois do laço inicial mais externo e antes do laço que já existe. Use este novo laço para imprimir espaços suficientes para justificar o que os outros laços irão imprimir.

    Depois de trabalhar pelo menos dez minutos nesse problema, veja a reposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/bottom_left_triangle.php

  10. Escreva um código para imprimir o seguinte (Obter alinhamento é difícil, pelo menos obtenha os números):
      1   2   3   4   5   6   7   8   9
      2   4   6   8  10  12  14  16  18
      3   6   9  12  15  18  21  24  27
      4   8  12  16  20  24  28  32  36
      5  10  15  20  25  30  35  40  45
      6  12  18  24  30  36  42  48  54
      7  14  21  28  35  42  49  56  63
      8  16  24  32  40  48  56  64  72
      9  18  27  36  45  54  63  72  81
    

    Dica: Inicie ajustando o código do problema 1 para imprimir isto:

     0  0  0  0  0  0  0  0  0  0
     0  1  2  3  4  5  6  7  8  9
     0  2  4  6  8  10  12  14  16  18
     0  3  6  9  12  15  18  21  24  27
     0  4  8  12  16  20  24  28  32  36
     0  5  10  15  20  25  30  35  40  45
     0  6  12  18  24  30  36  42  48  54
     0  7  14  21  28  35  42  49  56  63
     0  8  16  24  32  40  48  56  64  72
     0  9  18  27  36  45  54  63  72  81
    

    Então depois, ajuste para imprimir isto:

     1  2  3  4  5  6  7  8  9
     2  4  6  8  10  12  14  16  18
     3  6  9  12  15  18  21  24  27
     4  8  12  16  20  24  28  32  36
     5  10  15  20  25  30  35  40  45
     6  12  18  24  30  36  42  48  54
     7  14  21  28  35  42  49  56  63
     8  16  24  32  40  48  56  64  72
     9  18  27  36  45  54  63  72  81
    

    Finalmente, use uma declaração SE if para imprimir espaços se o número que está sendo impresso for menor que 10.

    Depois de tentar por pelo menos dez minutos na solução desse problema, veja a reposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/multiplication_table.php

  11. Escreva um código para imprimir isso:
                      1
                    1 2 1
                  1 2 3 2 1
                1 2 3 4 3 2 1
              1 2 3 4 5 4 3 2 1
            1 2 3 4 5 6 5 4 3 2 1
          1 2 3 4 5 6 7 6 5 4 3 2 1
        1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
    

    Dica: primeiro escreva um código que imprime isso:

    1
    1 2
    1 2 3
    1 2 3 4
    1 2 3 4 5
    1 2 3 4 5 6
    1 2 3 4 5 6 7
    1 2 3 4 5 6 7 8
    1 2 3 4 5 6 7 8 9
    

    Depois escreva um que imprime isso:

    1
    1 2 1
    1 2 3 2 1
    1 2 3 4 3 2 1
    1 2 3 4 5 4 3 2 1
    1 2 3 4 5 6 5 4 3 2 1
    1 2 3 4 5 6 7 6 5 4 3 2 1
    1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
    1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
      

    Finalmente, adicione espaços para imprimir a resposta final.

    Tente pelo menos 10 minutos na solução, depois, veja a reposta:
    ProgramArcadeGames.com/chapters/06_back_to_looping/top_triangle.php

  12. Escreva um código para imprimir o seguinte:
                      1
                    1 2 1
                  1 2 3 2 1
                1 2 3 4 3 2 1
              1 2 3 4 5 4 3 2 1
            1 2 3 4 5 6 5 4 3 2 1
          1 2 3 4 5 6 7 6 5 4 3 2 1
        1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
        1 2 3 4 5 6 7 8
          1 2 3 4 5 6 7
            1 2 3 4 5 6
              1 2 3 4 5
                1 2 3 4
                  1 2 3
                    1 2
                      1
    

    Isto pode ser feito combinando o código dos problemas 11 e 9.

    Tente pelo menos dez minutos na solução para isso, depois, veja a reposta aqui:
    ProgramArcadeGames.com/chapters/06_back_to_looping/three_quarters.php

  13. Escreva um código que imprime isso:
                      1
                    1 2 1
                  1 2 3 2 1
                1 2 3 4 3 2 1
              1 2 3 4 5 4 3 2 1
            1 2 3 4 5 6 5 4 3 2 1
          1 2 3 4 5 6 7 6 5 4 3 2 1
        1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
        1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
          1 2 3 4 5 6 7 6 5 4 3 2 1
            1 2 3 4 5 6 5 4 3 2 1
              1 2 3 4 5 4 3 2 1
                1 2 3 4 3 2 1
                  1 2 3 2 1
                    1 2 1
                      1
    
    
    

    Depois de tentar pelo menos dez minutos para solucionar esse problema, veja a reposta aqui:
    ProgramArcadeGames.com/chapters/06_back_to_looping/full_diamond.php

6.3 Revisão

6.3.1 Teste de Mútiplas Escolha

Click here for a multiple-choice quiz.

6.3.2 Repostas Escritas

Click here for the chapter worksheet.

6.3.3 Lab

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.