python从入门到实践 练习题13-3;13-4

这篇博客介绍了作者在使用Python的Pygame库制作雨滴下落动画时遇到的问题,即当设置雨滴速度为小数时,雨滴会停止不动。作者分享了代码实现,包括生成随机位置的雨滴、控制下落行数以及尝试调整雨滴速度等。同时,展示了程序的效果图。目前存在的问题是雨滴速度为小数时不工作,作者希望寻求帮助找出问题所在。
摘要由CSDN通过智能技术生成

练习13-4

说明:练习13-3可以由13-4简单修改后得到

题目要求

题目要求生成一行雨滴,下落到底端消失,重复在上面生成。

自己在题目要求上做了扩展

1.雨滴位置加入随机数,使得看起来不整齐

2.可设置一次下落多少行,这里设置为3行

3.存在问题:因为刚刚学习,对程序不太了解,仿造书上想要控制雨滴的速度,但是雨滴速度一旦为小数就停止不动,

希望大家能帮我找出问题出在哪里了?万分感谢!

 

所用到的图片(名称rain.bmp  分辨率 25*40)

主函数 main.py

import sys
import pygame
from rain import Rain
from random import randint





class Gamemain:
    """
    成行成列的显示
    """
    def __init__(self):
        pygame.init()#初始化

        self.screen = pygame.display.set_mode((1200, 800))
        self.screen.fill((255, 255, 255))#背景颜色
        self.screen_height = self.screen.get_height()
        self.screen_width = self.screen.get_width()
        pygame.display.set_caption("下雨天")
        self.icon = pygame.image.load('image/rain.bmp')
        pygame.display.set_icon(self.icon)   #个性化设置窗口图标为要显示的照片

        self.rains= pygame.sprite.Group()#很重要!相当于一个有很多类的编组,可以统一管理
        self.rain_speed = 1.0#雨滴速度   问题就在这里,如果设置为1.5 雨滴就停止不动
    def creat_rain(self):
        """
        判断行列有多少元素
        设置间距
        生产雨添加到Group组
        """
        new_rain = Rain(self)
        available_x = self.screen_width - 2*new_rain.rect_width
        number_x = available_x //(2*new_rain.rect_width)#一行里面有的个数
        available_y = self.screen_height-3*new_rain.rect_height
        number_y = available_y //(2*new_rain.rect_height)#一列有的个数
        for y in range(3):#这里只生成3行
            for x in range(number_x):
                new_rain = Rain(self)#在这里是因为每次循环都创造一个实例
                random_number = randint(-10, 10)  # 加入一些随机数使得排列不那么整齐
                new_rain.rect.x = 20 + random_number + x*(2*new_rain.rect_width)
                random_number = randint(-20, 20)  # 加入一些随机数使得排列不那么整齐
                new_rain.rect.y = 20 + random_number + y*(2*new_rain.rect_height)
                self.rains.add(new_rain)#通过循环创造的实例都添加到组中


    def rain_drop(self):
        #更新雨下落的Y轴位置
        for read_rain in self.rains.sprites():#从组中逐个读出雨滴,并修改Y轴参数
            read_rain.rect.y += self.rain_speed



    def check_rain(self):
        #检查是否到达边界,删除到达边界的元素
        for read_rain in self.rains.copy():
            if read_rain.rect.bottom >= self.screen_height:
                self.rains.remove(read_rain)#到达边界删除
        if len(self.rains) == 0:#雨滴下落完
            self.creat_rain()  # 创造出雨的组

    def game_run(self):
        self.creat_rain()#创造出雨的组
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            self.screen.fill((255, 255, 255))  # 需要再绘制背景颜色,不然会有阴影
            self.rains.draw(self.screen)#将雨的组集体绘制
            self.rain_drop()#更新下落
            self.check_rain()#检查是否到达边界
            pygame.display.flip()#绘制屏幕


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    rain = Gamemain()
    rain.game_run()


雨滴rain.py

""""
雨滴的类 设置雨滴
"""

import pygame
from pygame.sprite import Sprite

class Rain(Sprite):
    def __init__(self, ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        #导入雨滴
        self.image = pygame.image.load('image/rain.bmp')
        self.rect = self.image.get_rect()
        self.rect_width = self.rect.width
        self.rect_height = self.rect.height

效果图:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值