这是一个我用来教我7岁小俊马的雨点例程,2022年网络上已经宣传未来小学生都将会python了,那么我们这些爸爸还不赶快学吗?说句实话我本意是觉得小孩子就是先学好数理化就行了,编程这事有了数理逻辑思维长大之后自然就很快学会了,但是挡不住历史洪流,顺之者昌,我们也只能先顺应了。我们这一辈是快20岁从C、C++学起的,无奈C和C++还是太抽象,库也没有那么多,对7岁的孩子来说一点吸引力都没有,孩子们都喜欢形象和好玩。python横空出世,就让下一辈从面向对象的python游戏开始吧。这个动画程序主要就是用了pygame这个第三方库,仅用了画线段line和椭圆ellipse两个绘图函数就实现了模拟下雨的动画,最简单基础的雨点类向小朋友形象的说明类的概念。
import pygame, sys, random, math, pygame.locals
import win32api, win32con
import pygame_menuclass raindrop():                           #定义一个雨点类,雨点有位置、重量、颜色、是否落到水面、是否存在、绘制线宽等属性raindrop_max_radius = 15                # 雨滴落到水面后产生涟漪的初始最大圆的默认半径color_R = 0                             #雨滴颜色的默认红色分量color_G = 255                           #雨滴颜色的默认绿色分量color_B = 255                           #雨滴颜色的默认蓝色分量def __init__(self,screen_width,screen_heght,raindrop_weight):               #雨点初始化构造函数self.raindrop_x = random.choice(range(screen_width))                    #雨点落到水面时在窗口中x坐标#随机生成雨点落到水面时在窗口中x坐标,0到窗口最大值self.raindrop_y = random.choice(range(int(screen_heght/2),screen_heght))#雨点落到水面时在窗口中y坐标#随机生成雨点落到水面时在窗口中y坐标,窗口最大值的一半到窗口最大值,即雨点只落在屏幕的下半屏self.raindrop_weight=random.choice(range(1,raindrop_weight))            #随机生成雨滴的重量,默认1-8,可在初始化时由调用函数传入self.raindrop_radius=random.choice(range(1,self.raindrop_max_radius))   #随机生成涟漪的初始最小圆的半径,默认1-5self.line_width = 1                                                     #绘制雨滴只有线段和椭圆,定义绘制的默认线宽,雨滴比涟漪宽一个像素# self.color_R = random.choice(range(255))                              #随机生成雨滴颜色的红色分量# self.color_G = random.choice(range(255))                              #随机生成雨滴颜色的绿色分量# self.color_B = random.choice(range(255))                              #随机生成雨滴颜色的蓝色分量self.raindrop_move_x = self.raindrop_x                                  #雨滴下落过程中的x坐标就是前面随机生成的滴落点x坐标self.raindrop_move_y = 2                                                #雨滴下落过程中的y坐标初始为2,滴落运行过程中会增大,但不会大于滴落点的y坐标self.raindrop_yself.raindrop_move_x_dev = 0                                            # 雨滴下落过程中的x坐标的移动增量self.raindrop_move_y_dev = 0                                            # 雨滴下落过程中的y坐标的移动增量self.raindrop_move_y_dev = random.choice(range(10, 60))                 #随机生成雨滴下落的移动速度,这样雨滴就不会整齐划一的落下了self.rain_transparency = random.choice((255,230,205,180,155))           #定义雨点滴落过程中的透明度self.raindrop_transparency = 255                                        #定义雨点滴落后产生涟漪的透明度self.raindrop_dripped = False                                           #雨滴构造时都是没有滴落到水面的self.raindrop_over = True                                               # 雨滴是否存在bool变量def get_x(self):return self.raindrop_xdef get_y(self):return self.raindrop_ydef get_weight(self):return self.raindrop_weightdef get_radius(self):return self.raindrop_radiusdef get_over(self):return self.raindrop_overdef transparency_Diminishing(self):                                     #涟漪透明度逐渐低减函数if self.raindrop_transparency>5:self.raindrop_transparency=self.raindrop_transparency-4return self.raindrop_transparencydef weight_Diminishing(self):                                           #雨滴重量递减函数if self.raindrop_weight>0 :self.raindrop_weight=self.raindrop_weight-1return self.raindrop_weightdef radius_Increasing(self):                                            #涟漪绘制半径递增函数if self.raindrop_radius<=30*self.raindrop_weight:                   #涟漪的最大半径为雨滴重量的20倍self.raindrop_radius=self.raindrop_radius+2else:self.raindrop_over = False                                      #涟漪一旦超过最大半径,则标识雨滴为不存在return self.raindrop_radiusdef move_Increasing(self):                                              #雨滴滴落移动位置递增函数,只定义了y坐标的移动if (self.raindrop_move_y + self.raindrop_move_y_dev) < self.raindrop_y :self.raindrop_move_y = self.raindrop_move_y + self.raindrop_move_y_develse:self.raindrop_dripped = True                                    #一旦雨滴滴落到水面就将雨滴标识为“已滴落”def draw_raindrop(self,raindrop_screen,color=(0, 255, 0,255),line_width=1):#################################开始####绘制雨滴下落代码####开始#######################################if self.raindrop_dripped==False:pygame.draw.line(raindrop_screen,(self.color_R, self.color_G, self.color_B, self.rain_transparency),(self.raindrop_move_x,self.raindrop_move_y),(self.raindrop_move_x,self.raindrop_move_y+self.raindrop_weight),self.line_width+1)self.move_Increasing()#################################结束####绘制雨滴下落代码####结束########################################################################开始####绘制椭圆形雨滴涟漪代码####开始#######################################if self.raindrop_dripped == True:pygame.draw.ellipse(raindrop_screen, (self.color_R, self.color_G, self.color_B, self.raindrop_transparency),(self.raindrop_x - self.raindrop_radius,self.raindrop_y - self.raindrop_radius / 2, self.raindrop_radius * 2,self.raindrop_radius), self.line_width)if self.raindrop_radius-60>0:pygame.draw.ellipse(raindrop_screen, (self.color_R, self.color_G, self.color_B, min(self.raindrop_transparency+60,255)),(self.raindrop_x - (self.raindrop_radius-60),self.raindrop_y - (self.raindrop_radius-60) / 2, (self.raindrop_radius-60) * 2,(self.raindrop_radius-60)), self.line_width)if self.raindrop_radius-100>0:pygame.draw.ellipse(raindrop_screen, (self.color_R, self.color_G, self.color_B, min(self.raindrop_transparency+100,255)),(self.raindrop_x - (self.raindrop_radius-100),self.raindrop_y - (self.raindrop_radius-100) / 2, (self.raindrop_radius-100) * 2,(self.raindrop_radius-100)), self.line_width)self.radius_Increasing()self.transparency_Diminishing()#################################结束####绘制椭圆形雨滴涟漪代码####结束#######################################returnclass Rain_Curtain():          #定义一个雨幕类,雨幕类包含很多雨点raindrops对象raindrops = []default_weight = 8def __init__(self,screen,width,height):             #需要绘制屏幕和屏幕的宽和高进行初始化self.screen =screenself.width = widthself.height = heightself.alpha_screen = screen.convert_alpha()      #用屏幕构造一个相同大小的画板,raindrops先画在这个画板上def run(self):                                      #让雨幕运行起来的函数self.raindrops.append(raindrop(self.width, self.height, self.default_weight))  # 构造一个雨滴,追加到雨滴链表raindrops_len = 1  # 定义雨滴链表长度整型变量i = 0print(len(self.raindrops))while i < raindrops_len:raindrops_len = len(self.raindrops)if not self.raindrops[i].get_over():del self.raindrops[i]raindrops_len = len(self.raindrops)i = i + 1self.alpha_screen.fill(pygame.Color(0, 0, 0,0))             #绘制雨点链表前,先将画板清空for i in range(len(self.raindrops)):if self.raindrops[i].get_over():self.raindrops[i].draw_raindrop(self.alpha_screen)self.screen.blit(self.alpha_screen, (0, 0))def get_default_weight(self):return self.default_weightdef set_default_weight(self,default_weight):self.default_weight=default_weightdef set_difficulty(screen,width, height):# Do the job here !print("已经设置!")passdef start_the_game(screen,width,height):print("已经开始!")pass#print(width,height)FPS = 35#default_weight = 8                                          #定义雨滴的最大重量pygame.display.set_caption("西西设计平台")new_Rain_Curtain=Rain_Curtain(screen,width,height)  # 定义一个雨滴链表,保存了很多个雨滴while True:  # 窗口主循环开始for event in pygame.event.get():  # 窗口事件监听开始if event.type == pygame.QUIT:pygame.quit()sys.exit()else:passif event.type == pygame.KEYDOWN:if event.key == pygame.K_ESCAPE:pygame.quit()sys.exit()elif event.key == pygame.K_UP:FPS = FPS + 10elif event.key == pygame.K_DOWN:if FPS > 10:FPS = FPS - 10elif event.key == pygame.K_RIGHT:if new_Rain_Curtain.get_default_weight() < 15:new_Rain_Curtain.set_default_weight(new_Rain_Curtain.default_weight+1)elif event.key == pygame.K_LEFT:if new_Rain_Curtain.get_default_weight() > 3:new_Rain_Curtain.set_default_weight(new_Rain_Curtain.get_default_weight()-1)###游戏程序循环代码开始screen.fill(pygame.Color(0, 0, 0))new_Rain_Curtain.run()pygame.time.delay(FPS)pygame.display.flip()  # 更新全部显示return Nonedef main():width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)MyWin =pygame.init()print(MyWin)screen = pygame.display.set_mode((width, height), flags=pygame.FULLSCREEN)pygame.font.init()###############################################################################################################menu = pygame_menu.Menu('Rian Drop', 800, 400,theme=pygame_menu.themes.THEME_DARK)menu.add.text_input('姓名:', default='mathfrog',font_name='方正粗黑宋简体.ttf')menu.add.selector('游戏难度 :', [('骨灰级', 1), ('高手级', 2),('入门级', 3)], οnchange=set_difficulty(screen,width, height),font_name='方正粗黑宋简体.ttf')menu.add.button('开始游戏', start_the_game,screen,width,height,background_color=(0,124,11),border_color=(255,0,0),font_name='方正粗黑宋简体.ttf',font_color=(0,0,255),font_size=40)# menu.add.button('开始', start_the_game,font_name='方正粗黑宋简体.ttf')menu.add.button('Quit',pygame_menu.events.EXIT, font_name='方正粗黑宋简体.ttf')menu.mainloop(screen)################################################################################################################ Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

基于python pygame实现的雨点动画相关推荐

  1. 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...

  2. Maze_AI: 一款基于 Python + Pygame + AI 算法的迷宫小游戏

    (一)课题内容 实现走迷宫. 主要功能为界面显示.上下左右键的响应以及当前步数统计. 通过该课题全面熟悉数组.字符串等的使用,掌握程序设计的基本方法及友好界面的设计. (二)课题要求 1. 基本要求 ...

  3. 【四二学堂】基于python+pygame的太空阻击游戏(python版带视频)

    csdn课程视频地址:https://edu.csdn.net/course/detail/28487 import pygame from pygame.locals import* from sy ...

  4. 基于Python生成OPENSEES结构动画

    基于Python生成OPENSEES结构动画 ==== [Github地址]:GitHub - dinochen1983/Opensees_Python: Opensees_Python [下载实例文 ...

  5. 基于python的pygame实现造梦西游天宫道的笔记(一)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 基于python的pygame实现造梦西游天宫道的笔记(一) 一.屏幕及动画的绘制 1.图片加载 2.图片的绘制 3.pyg ...

  6. python os模块安装方法_基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...

  7. 如何用python制作动画_如何基于Python Matplotlib实现网格动画

    -1- 如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看.第一次运行的时候会报一个错误(还没找到解决办法),不过只要再运行一次就正常了. 这篇文章虽然不是篇典型的数据科学类文章,不过 ...

  8. 设置按键退出python pygame动画(animation)程序,python检测键盘按键

    功能:设置按键退出python pygame动画(animation)程序,python3.6检测键盘按键 pygame运行起来,不弄个强行终止都刹不住....为此研究了一下怎么退出. 实现的效果是: ...

  9. 基于Python的Pygame带背景音乐的五子棋游戏的设计与实现

    源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 基于Python的Pygame带背景音乐的五子棋游戏的设计与实现 用户需求分析 通过软件功能的分析, ...

最新文章

  1. Leetcode PHP题解--D16 922. Sort Array By Parity II
  2. 计算机系统与网络技术简答题,计算机与网络技术基础 简答题
  3. 你不能错过这些美食!
  4. C++学习基础八——重载输入和输出操作符
  5. 计算矢量面积_航天器轨道参数计算推导
  6. 变化的和不变的-让自己慢下来(49)
  7. CCIE理论-第一篇-SDN概念复习
  8. Java依赖注入 - DI设计模式示例教程
  9. perf in linux,[Package Request] 仓库请添加 linux-perf-5.4
  10. Moss 2007 升级到 Moss2010 成功但界面仍然保持07?
  11. 项目盈利模式分析报告
  12. 游戏英文词汇700+
  13. JAVA 事务回滚方法调用非事务回滚方法
  14. MATLAB如何创建表格
  15. Hearbeat + Nginx 安装配置
  16. 磨刀不误砍柴工——模板方法模式
  17. 我用Python爬虫获取数据,分析双色球中奖概率,差点就中了
  18. dismiss和ignore区别_词汇辨析:dismiss, discharg, expell, resign的区别
  19. hillin:浮木漂流
  20. automagica 调用windows画图以及登录qq

热门文章

  1. 利用AI+大数据的方式分析恶意样本(十三)
  2. Fusion360显示模糊怎么办?
  3. 坑爹!攻城狮老爸被苹果解雇 只因女儿晒iPhone X
  4. 小米9私密相册怎么找_小米手机私密相册怎么用?怎么打开查看?
  5. 微信开发 免费服务器,微信开发详解:[1]免费服务器
  6. c语言控制输出间隔大小,C/C++ 输出间隔控制
  7. 使用Excel和Matlab批量修改图片名称
  8. 百度云盘上传显示服务器异常,百度网盘常见问题之网络异常,这里有最全面的解决方法...
  9. js 大数字单位处理 千、万、千万、亿....
  10. 《影响力》第七章:稀缺