Program Arcade Games
With Python And Pygame

Chapter 6: 回到循环

fig.nested_loops

游戏通常会涉及到到许多复杂的循环。这是一个“充满挑战的章节”,来学着成为使用循环的专家。 如果你呢理解和掌握这一章的问题, 到章末你便可以认证自己已经是循环专家了。

如果成为循环专家并不是你的目标,只是你要保证能写出前八个问题的答案。 这样会给你足够的知识储备继续前进。(另外,成为循环专家并不能让你得到一个约会,除了那位土拨鼠电影中的住巨。)

在线有对答案的视频解释,并且答案代码是“动画化的”。 只需要点击 “step”按钮拉查看代码是如何执行的。

6.1 打印语句的终止字符

默认情况下, print语句会放置一个回车符,在打印出内容的结束出。 如我们在第一章所解释的,回车符会提示把下一行的输出打印到新的一行。 大多数时候这是我们想要的。有时候不是。如果我们想继续打印在相同的一行,我们可以更改打印语句末尾的默认符号。 这是一个更改前的例子:

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

...它会打印出:

Pink
Octopus

但是如果我们想打印在同一行, 可以使用一个新的选项去设置end的字符。 例如:

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

这会打印出:

PinkOctopus

我们也可以设置成一个空的字符串。

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

T这回打印出:

Pink Octopus

这是另一个使用了变量的例子:

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

这会打印出:

0 1

6.2 高级的循环习题

  1. 写一段代码,打印出10个星号(*),如下所示:
    * * * * * * * * * *
    

    可以使用for循环,打印出每颗单独的星号,而不是用一个print语句打印十个星号。 只需要两行代码:一个for循环和一个print语句。

    如果你做出来了, 或者放弃了,答案在这里:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_1.php

  2. 写一段代码,打印如下内容:
    * * * * * * * * * *
    * * * * *
    * * * * * * * * * * * * * * * * * * * *
    

    这和之前的题目类似,只不过还需分别打印5颗和20颗星号。 复制和粘贴先前的代码,只需要对for循环稍加调整。

    如果你做出来了, 或者放弃了,答案在这里:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_2.php

  3. 使用两个for循环,一个嵌套在另一个之内,打印出如下的 10x10的矩形:
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * *
    

    首先,回顾下习题1。习题1的代码生成了一行星星。 只需要重复十次。 在看答案前先自己尝试至少10分钟哦。

    如果你做出来了, 或者放弃了,答案在这里:
    ProgramArcadeGames.com/chapters/06_back_to_looping/10x10box.php

  4. 使用两个for循环,一个嵌套在另一个之内,打印出如下的 5x10矩形:
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    

    这和前面一题非常相似。对循环的范围多次尝试,找到合适的range函数的传递参数。

    如果你做出来了, 或者放弃了,答案在这里:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_4.php

  5. 使用两个for循环,一个嵌套在另一个之内,打印出如下的 20x5的矩形:
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    

    也和问题3和4一样,只是使用不同的范围。

    如果你做出来了, 或者放弃了,答案在这里:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_5.php

  6. 下一段代码,打印如下内容:
    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
    

    使用两个嵌套的循环。用循环打印出第一行,而不是:

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

    提示: 首先,创造一个循环打印出第一行。然后再套上一个循环,重复10次。 使用i或者j变量来控制程序打印的内容。 这个例子和下面一个例子会有助于增强这些索引变量的理解。

    在看答案之前至少花十分钟自己来试图完成。十分钟的思考过程远比答案本身重要。
    ProgramArcadeGames.com/chapters/06_back_to_looping/number_square_answer.php

  7. 调整之前的程序来打印如下内容:
    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
    

    答案如下:
    ProgramArcadeGames.com/chapters/06_back_to_looping/problem_7.php

  8. 写一段代码,打印如下内容:
    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
    

    提示: 这其实就是问题6,只不过内循环不再是一个固定的循环次数。不再使用range(10), 而是可更改的范围。

    砸花了至少10分钟过后在 可以参看这里的答案:
    ProgramArcadeGames.com/chapters/06_back_to_looping/top_right_triangle.php

    确保你能自己写出这题和上题的代码。 你的练习时间会在今后得到回报。

  9. 写一段代码,打印如下内容:
    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
    

    这一题有点难。提示:在控制每一行的外循环之内需要两个循环 一个循环打印空格,另一个循环打印数字。 每一行都循环这两项内容。 首先,先试着用一个内熏画打印出如下的内容

    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
    

    一旦这个成功了,再在外循环开始之后、已经存在的内循环之前,添加一个循环。 用这个新的循环控制足够的空格来控制对齐。

    在花了至少10分钟过后, 可以参看这里的答案:
    ProgramArcadeGames.com/chapters/06_back_to_looping/bottom_left_triangle.php

  10. 写一段代码,打印如下内容 (对齐是有难度的,至少先确保数字正确):
      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
    

    提示: 先调整问题1的代码来打印:

     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
    

    然后进一步调整代码来打印:

     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
    

    最后,当打印的数字小于10的时候,使用一个if语句来打印空格。

    在花了至少10分钟过后, 可以参看这里的答案:
    ProgramArcadeGames.com/chapters/06_back_to_looping/multiplication_table.php

  11. 写一段代码,打印如下内容:
                      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
    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
    

    然后写代码打印出:

    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
      

    最后添加空格来打印出最后的结果。

    在花了至少10分钟过后, 可以参看这里的答案:
    ProgramArcadeGames.com/chapters/06_back_to_looping/top_triangle.php

  12. 写一段代码,打印如下内容:
                      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
    

    这一题可以结合习题11和习题9。

    在花了至少10分钟过后, 可以参看这里的答案:
    ProgramArcadeGames.com/chapters/06_back_to_looping/three_quarters.php

  13. 写一段代码,打印如下内容:
                      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
    
    
    

    在花了至少10分钟过后, 可以参看这里的答案:
    ProgramArcadeGames.com/chapters/06_back_to_looping/full_diamond.php

6.3 复习

6.3.1 选择题小测验

Click here for a multiple-choice quiz.

6.3.2 练习表

Click here for the chapter worksheet.

6.3.3 实验

Click here for the chapter lab.


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