书籍:《PYTHON游戏编程入门》(More Python Programming for the Absolute Beginner)
本文为第二章后面的挑战题,欢迎交流
第二章
- 第一题
- 题目
- 关于pygame.draw.ellipse函数
- 代码
- 结果
- 第二题
- 题目
- 代码
- 结果
- 第三题
- 题目
- 代码
- 结果
第一题
题目
使用本章的示例作为起点,编写一个程序来绘制一个椭圆,这是我们在本章中没有介绍的形状。
关于pygame.draw.ellipse函数
得到ellipse函数的定义:ellipse(Surface, color, Rect, width=0)
第一个参数是要绘制的平面,第二个参数是绘制椭圆使用的颜色,第三个参数是目标椭圆对应的那个外框矩形,用矩形左上角顶点的坐标对和右下角顶点的坐标对组成,第四个参数是椭圆边的宽度。
代码
# ch2 Question1: Drawing Ellipse
# python 3.8.0
# pygame 1.9.6
import pygame
import sys
from pygame.locals import *
pygame.init()
screen_size = 1000,600
screen = pygame.display.set_mode(screen_size)
# 建立一个“画布”,名字为screen
pygame.display.set_caption("Draw the Ellipse")
# 设置窗口标题
while True:
# 实现循环显示
for event in pygame.event.get():
# 读取当前事件状态
if event.type in (QUIT, KEYDOWN):
# 监听鼠标和键盘,点右上角的X或者长按键盘退出
sys.exit()
background_colour = 0,0,0
screen.fill(background_colour)
# 使用此颜色清除窗口,即用改颜色填充窗口
e_colour = 200,0,0
rect = 200,100,500,300
pygame.draw.ellipse(screen, e_colour, rect, 10)
# 绘制椭圆
pygame.display.update()
# 更新屏幕显示
结果
第二题
题目
选取一个示例,例如,绘制线条示例,修改它以便用随机的值绘制1000个线条。了解一下random库和random.randint()函数。
代码
# ch2 Question2: Drawing Random Lines
# python 3.8.0
# pygame 1.9.6
import pygame
import sys
import random
import time
from pygame.locals import *
pygame.init()
screen_size_x = 1000
screen_size_y = 600
screen_size = screen_size_x, screen_size_y
screen = pygame.display.set_mode(screen_size)
# 建立一个“画布”,名字为screen
pygame.display.set_caption("Draw Lines Randomly")
# 设置窗口标题
background_colour = 0,0,0
screen.fill(background_colour)
# 只在开始画第一条线之前清除画板,后面画的线累积显示
line_num = 1000
for i in range(line_num):
# 一共显示line_num条直线
for event in pygame.event.get():
# 读取当前事件状态
if event.type in (QUIT, KEYDOWN):
# 监听鼠标和键盘,点右上角的X或者长按键盘退出
sys.exit()
r_e_colour = random.randint(0, 255)
g_e_colour = random.randint(0, 255)
b_e_colour = random.randint(0, 255)
e_colour = r_e_colour, g_e_colour, b_e_colour
# 设置线条的颜色
start_x = random.randint(0, screen_size_x)
start_y = random.randint(0, screen_size_y)
end_x = random.randint(0, screen_size_x)
end_y = random.randint(0, screen_size_y)
rect = 200,100,500,300
pygame.draw.line(screen, e_colour, (start_x, start_y), (end_x, end_y), 5)
# 绘制椭圆
pygame.display.update()
# 更新屏幕显示
time.sleep(0.05)
# 一次做完延迟0.05秒做下一次显示
结果
第三题
题目
绘制矩形示例是唯一一个绕着屏幕移动形状的示例。修改该程序,以便任何时候,当矩形碰到屏幕边界时,矩形都将会改变颜色。
代码
# ch2 Question3:Rectangle Flying
# python 3.8.0
# pygame 1.9.6
import pygame
import sys
import random
import time
from pygame.locals import *
pygame.init()
screen_size_x = 1000
screen_size_y = 600
screen_size = screen_size_x, screen_size_y
screen = pygame.display.set_mode(screen_size)
# 建立一个“画布”,名字为screen
pygame.display.set_caption("Rectangles Flying")
# 设置窗口标题
# 初始位置
pos_x = 300
pos_y = 250
# 矩形边长
rect_x = 100
rect_y = 100
# 矩形初始颜色
colour = random.randint(0,255), random.randint(0,255), random.randint(0,255)
# 设置速度方向
flag_x = 1
flag_y = 1
# 标记是否变色
change_colour = False
while True:
for event in pygame.event.get():
# 读取当前事件状态
if event.type in (QUIT, KEYDOWN):
# 监听鼠标和键盘,点右上角的X或者长按键盘退出
sys.exit()
background_colour = 0,0,0
screen.fill(background_colour)
vel_x = random.randint(0,5)
vel_y = random.randint(0,5)
pos_x += vel_x * flag_x
pos_y += vel_y * flag_y
# 保证方块在屏幕上,且实现变色
if pos_x > screen_size_x - rect_x:
flag_x = -flag_x
pos_x = screen_size_x - rect_x
change_colour = True
elif pos_x < 0:
flag_x = -flag_x
pos_x = 0
change_colour = True
if pos_y > screen_size_y - rect_y:
flag_y = -flag_y
pos_y = screen_size_y - rect_y
change_colour = True
elif pos_y < 0:
flag_y = -flag_y
pos_y = 0
hange_colour = True
if change_colour:
change_colour = False
colour = random.randint(0,255), random.randint(0,255), random.randint(0,255)
# 绘制矩形
width = 0 #solid fill
pos = pos_x, pos_y, rect_x, rect_y
pygame.draw.rect(screen, colour, pos, width)
pygame.display.update()
这里的代码比原代码稍微改进了一下:
- 移动速度稍微有一些变化,每一次在两个方向上的移动速度是一个随机数。
- 原代码中如果检测当前位置会超出框,则更改速度的方向,使其下一次可以回头,但是注意这里并不能保证当前步没有超出框,不是绝对的满足要求。因此在这里做了一点小改进。
结果
emmm这个好像没法截图哦,,那就留个悬念吧