《父與子的程式設計之旅(第3版)》第16章習題答案

謝婷婷發表於2020-08-27

本文針對第16章章末的習題提供參考答案。當然,有些習題的正確答案不止一個,特別是“動手試一試”,不過你可以通過這些答案來判斷自己的思路是否正確。

第16章 圖形

測試題

(1) RGB值[255, 255, 255]表示白色。

(2) RGB值[0, 255, 0]表示綠色。

(3) 可以使用Pygame模組中的pygame.draw.rect()方法來畫矩形。

(4) 可以使用pygame.draw.lines()方法來實現多點連線(如連連看)。

(5) “畫素”是“影像元素”的簡寫,表示螢幕上(或紙上)的一個點。

(6) 在Pygame視窗中,位置[0, 0]位於左上角。

(7) 圖中B的座標是[50, 200]。

(8) 圖中D的座標是[300, 50]。

(9) 可以使用blit()方法在Pygame中複製影像。

(10) 在移動影像或者實現動畫時,可以執行以下兩個步驟。

  • 擦除原來的位置上的影像。
  • 在新的位置上繪製影像。

動手試一試

(1) 下面的程式會在螢幕上畫出一些不同的形狀。你也可以在answers資料夾中和本書的網站上找到TIO_CH16_1.py檔案。

import pygame, sys
pygame.init()
screen=pygame.display.set_mode((640, 480))
screen.fill((250, 120, 0))
pygame.draw.arc(screen, (255, 255, 0), pygame.rect.Rect(43, 368, 277, 235), -6.25, 0, 15)
pygame.draw.rect(screen, (255, 0, 0), pygame.rect.Rect(334, 191, 190, 290))
pygame.draw.rect(screen, (128, 64, 0), pygame.rect.Rect(391, 349, 76, 132))
pygame.draw.line(screen, (0, 255, 0), (268, 259), (438, 84), 25)
pygame.draw.line(screen, (0, 255, 0), (578, 259), (438, 84), 25)
pygame.draw.circle(screen, (0, 0, 0), (452, 409), 11, 2)
pygame.draw.polygon(screen, (0, 0, 255), [(39, 39), (44, 136), (59, 136), (60, 102), (92, 102), (94, 131), (107, 141), (111, 50), (97, 50), (93, 86), (60, 82), (58, 38)], 5)
pygame.draw.rect(screen, (0, 0, 255), pygame.rect.Rect(143, 90, 23, 63), 5)
pygame.draw.circle(screen, (0, 0, 255), (153, 60), 15, 5)
clock = pygame.time.Clock()
pygame.display.flip()
running = True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            running = False
pygame.quit()

(2) 要把沙灘球影像換成另外的影像,只需把這行程式碼中的檔名替換成另一張圖片的檔名即可。

my_ball = pygame.image.load('beach_ball.png')

(3) 在程式碼清單16-16中,只需修改下面這兩行程式碼:

x_speed = 10
y_speed = 10

修改後的程式碼如下所示(答案不唯一)。

x_speed = 20
y_speed = 8

(4) 要讓球在隱形的牆上反彈,需要修改程式碼清單16-16中的以下程式碼:

if x > screen.get_width() - 90 or x < 0:

下面是修改後的程式碼:

if x > screen.get_width() - 250 or x < 0:

這會讓球在到達視窗邊界之前就反向彈回去。可以對y座標做同樣的處理,讓球在到達地板時也會反彈。

(5) 將程式碼清單16-6中的pygame.display.flip()移到for迴圈內部,並增加延遲時間後,程式碼如下所示:

import pygame, sys, random
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255, 255, 255])
for i in range (100):
    width = random.randint(0, 250)
    height = random.randint(0, 100)
    top = random.randint(0, 400)
    left = random.randint(0, 500)
    pygame.draw.rect(screen, [0,0,0], [left, top, width, height], 1)
    pygame.display.flip()
    pygame.time.delay(30)
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

執行這個程式,你應該能看到各個矩形會單獨出現,因為我們放慢了程式的執行速度,並且在畫出各個矩形後都會重新整理螢幕。如果對正弦曲執行緒序做同樣的處理,就可以看出正弦曲線上的每個點是怎麼畫出來的。

相關文章