1. 绘制瞄准器
- 定义一个函数,给出瞄准器的中心点坐标,实现瞄准镜的绘制。
- 通过pygame.mouse.get_pos()获取鼠标移动的位置
- 调用函数在鼠标位置绘制瞄准器

2. 绘制小球
- 建立一个类存储小球的属性和方法。属性主要有坐标和下落速度,方法是下落。
- 创建一个下落小球的字典
ballArrs={}
- 通过循环语句创建10个小球存放在字典中,x坐标为随机值,y坐标为默认的0.并且判断x坐标不能重叠。
ballArrs={}
for i in range(10):
x = random.randint(20, 560)
for j in ballArrs.keys():
if abs(ballArrs[j].x-x)<=40 :
break
else:
ballArrs[i]=Ball(x)
- 创建moveDown循环调用每个小球的moveDown方法,实现小球的自动下落
def moveDown(arr):
for i in arr.keys():
arr[i].moveDown()
- 在while True循环中调用刚才定义的函数,并且进行小球绘制显示。注意要放在screen.fill()函数之下
moveDown(ballArrs)
for index in ballArrs.keys():
pos_x = ballArrs[index].x
pos_y = ballArrs[index].y
pygame.draw.circle(screen, 'yellow', (pos_x, pos_y), 20)


3. 补全小球的运动
3.1 小球落地(窗口底端)从窗口顶端再次出现,修改刚才的显示代码。
for index in ballArrs.keys():
pos_x = ballArrs[index].x
pos_y = ballArrs[index].y
if ballArrs[index].y >= 500:
ballArrs[index].y = 0
pygame.draw.circle(screen, 'yellow', (pos_x, pos_y), 20)
3.2 小球出现的太少,判断当小球落下200像素距离,再次创建10个小球。
- 创建一个变量height=0 #落下的高度 用于存储落下的高度
- 在死循环中每次给height += 0.05,判断落下高度大于200再次创建10个小球
while True:
height += 0.05
if height >= 200:
height = 0
arrlen = len(ballArrs)
for i in range(arrlen, arrlen + 10):
x = random.randint(20, 560)
for j in ballArrs.keys():
if abs(ballArrs[j].x - x) <= 40:
break
else:
ballArrs[i] = Ball(x)
4. 瞄准射击
4.1 获取鼠标按下的坐标
- 创建两个变量用于存储鼠标按下的坐标,默认值在窗口之外
mos_x,mos_y=-1,-1
- 修改for event in pygame.event.get():循环语句,进行鼠标按下事件的判断,并获取鼠标按下的坐标,存储在刚才的变量中
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == MOUSEBUTTONDOWN:
mos_x, mos_y = event.pos
4.2 判断小球的位置和鼠标按下的距离当在一个范围内,小球重新从顶端出现
- 改造小球显示的循环
for index in ballArrs.keys():
pos_x = ballArrs[index].x
pos_y = ballArrs[index].y
if ballArrs[index].y >= 500:
ballArrs[index].y = 0
leng = pow((pos_x - mos_x), 2) + pow((pos_y - mos_y), 2)
if pow(leng,0.5) <=80:
ballArrs[index].y = -1
mos_y, mos_x = -999, -999
pygame.draw.circle(screen, 'yellow', (pos_x, pos_y), 20)
4.3 成绩计算
- 创建文字打印函数
def print_txt(screen,font,x,y,text,color=(255,255,255)):
imgText=font.render(text,True,color)
screen.blit(imgText,(x,y))
- 创建文字显示的字体
font=pygame.font.SysFont("Microsoft YaHei",20)
- 创建成绩变量score=0
- 改造小球显示循环
for index in ballArrs.keys():
pos_x = ballArrs[index].x
pos_y = ballArrs[index].y
if ballArrs[index].y >= 500:
ballArrs[index].y = 0
score-=1
leng = pow((pos_x - mos_x), 2) + pow((pos_y - mos_x), 2)
if pow(leng,0.5) <=80:
ballArrs[index].y = -1
mos_y, mos_x = -999, -999
score+=1
pygame.draw.circle(screen, 'yellow', (pos_x, pos_y), 20)
- 进行文本显示
txt = "成绩:{}".format(score)
print_txt(screen, font, 0, 0, txt, "yellow")