【Python个人学习笔记】---《Python游戏编程入门》第二章小结挑战习题(二)
问题:选取一个示列,例如,绘制线条示例,修改它以便用随机的值绘制1000个线条。了解一下random库和random.randint()函数。
最开始想法是,用pygame.draw.line(Surface, color, start_pos, end_pos, width) 来绘制,给start_pos, end_pos 赋予随机数。
运行结果后发现,绘制的线条不会在屏幕surface上出现复数条,只有一条随机变动。
import sys
import random
import time
import pygame
from pygame.locals import *
# 初始化
pygame.init()
# 创建窗口
screen = pygame.display.set_mode((600, 500))
pygame.display.set_caption("Drawing Lines")
FPS = 60
fps_clock = pygame.time.Clock()
# 主循环(绘制随机线条)
n = 1
while n < 1000:
# 键鼠事件
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
# 绘制屏幕颜色
screen.fill((0, 80, 0))
# 绘制线条
color = 100, 255, 200
width = 2
x_random = random.randint(10, 200)
y_random = random.randint(20, 300)
x_end_random = random.randint(200,600)
y_end_random = random.randint(300,500)
start_point = (x_random, y_random)
end_point = (x_end_random, y_end_random)
# start_point = (10,200)
pygame.draw.line(screen, color, start_point, end_point, width)
# 更新屏幕显示
pygame.display.update()
fps_clock.tick(FPS)
time.sleep(0.05) # 做完一次,延迟0.05秒
n += 1
显示效果如下:
很明显,不是很符合要求,肯定是哪里出错了。
最后找出来的错误是把screen.fill()
放进主循环while
中了,于是每次循环都会把屏幕screen
重新绘制一遍背景颜色,因此把上一次绘制的线条给覆盖掉了,从而显示在屏幕screen
上的永远只有这一次绘制的线条。(有错请指正)
解决方法:把screen.fill()
扔到while
循环外面(上面)去。
最后修改后的代码:
import sys
import random
import time
import pygame
from pygame.locals import *
# 初始化
pygame.init()
# 创建窗口
screen = pygame.display.set_mode((600, 500))
pygame.display.set_caption("Drawing Random Lines")
# 帧率
FPS = 60
fps_clock = pygame.time.Clock()
# 绘制屏幕颜色
# 放主循环外,否则会覆盖掉上次绘制的线条
screen.fill((0, 80, 0))
# 主循环(绘制随机线条)
n = 1
while n < 1000:
# 键鼠事件
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
# 绘制线条
# 起始点,和结束点必须在主循环内,否则只会绘制一条线条,下方的颜色同理
width = 2
x_start_random = random.randint(0, 600)
y_start_random = random.randint(0, 500)
x_end_random = random.randint(0, 600)
y_end_random = random.randint(0, 500)
start_point = (x_start_random, y_start_random)
end_point = (x_end_random, y_end_random)
# 添加颜色的变化(题目未作要求233)
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
color = r, g, b
pygame.draw.line(screen, color, start_point, end_point, width)
# 更新屏幕显示
pygame.display.update()
fps_clock.tick(FPS)
time.sleep(0.05) # 做完一次,延迟0.05秒
n += 1
呈现的效果:
完成题目要求。