鱼C论坛

 找回密码
 立即注册
查看: 1218|回复: 5

[原创] 七夕礼物撒,也算是零基础入门python的038作业,虽然没有用类(该打)

[复制链接]
发表于 2022-8-8 23:11:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import pygame
  2. from moviepy.editor import *
  3. import sys
  4. import os
  5. import random
  6. import pickle
  7. #pygame.init()   初始化pygame,由于在moviepy中初始化了,所以不用重复
  8. pygame.mixer.init()
  9. pygame.display.set_caption("七夕礼物鸭")
  10. icon = pygame.image.load('data_qixi\\ico.ico')
  11. pygame.display.set_icon(icon)

  12. def bgm_init():
  13.     pygame.mixer.music.load(work_path+'七夕.mp3') # 加载歌曲
  14.     pygame.mixer.music.set_volume(0.3)
  15.     pygame.mixer.music.play(-1) # 播放
  16. #数据区begin
  17. #=================常量=============================
  18. reminder = "click the Heart"    #设置提醒语
  19. sec_tick = 30   #设置时间
  20. size = width, height = 1280, 820  # 设置窗口大小
  21. color = [0,0,0]  # 设置颜色
  22. dict_photo = {}
  23. work_path = os.getcwd()+'\\data_qixi\\'
  24. speed = [random.randint(1,9), random.randint(1,9)]  # 设置移动的X轴、Y轴
  25. #------------文件列表
  26. with open(work_path+"doors_file.pkl",'rb') as picklefile:
  27.     doors_file = pickle.load(picklefile)
  28. doors_inter = 0#迭代器

  29. #==============pygame区===================
  30. #------------球(心)--------------------
  31. screen = pygame.display.set_mode(size)  # 显示窗口
  32. ball = pygame.image.load(work_path+'ball.png')  # 加载图片
  33. ballrect = ball.get_rect()
  34. ballrect = ballrect.move([random.randint(0,width-ballrect.w),random.randint(0,height-ballrect.h)]) # 获取矩形区域
  35. #------------门--------------------
  36. #++++++++图像对象++++++++++
  37. door = pygame.image.load(work_path+'door.png')
  38. doors = []
  39. doors_index = 0
  40. for i in range(4):
  41.     doors.append(pygame.image.load(work_path+'door{0}.png'.format(i+1)))
  42. #++++++++++位置对象++++++++   
  43. doorrect = door.get_rect()# 获取矩形区域
  44. doorrect = doorrect.move(width//2-doorrect.w//2,height-doorrect.h-1)#居中
  45. #------------箭头-------------------
  46. #++++++++图像对象++++++++++
  47. rarrow = pygame.image.load(work_path+'rarrow.png')
  48. larrow = pygame.image.load(work_path+'larrow.png')
  49. #++++++++++位置对象++++++++
  50. rarrowrec = rarrow.get_rect()
  51. larrowrec = larrow.get_rect()
  52. arr_wid = rarrowrec.w
  53. arr_hei = rarrowrec.h
  54. larrowrec = larrowrec.move(width//8-arr_wid//2,height//2-arr_hei//2+20)
  55. rarrowrec = rarrowrec.move(7*(width//8)-arr_wid//2,height//2-arr_hei//2+20)

  56. #===============功能=================
  57. clock = pygame.time.Clock() #设置时钟

  58. bgm_init()
  59. sound_open = pygame.mixer.Sound(work_path+"sound_open.mp3")#开门音效
  60. sound_open.set_volume(0.2)
  61. sound_change = pygame.mixer.Sound(work_path+"change.mp3")#转头音效
  62. sound_change.set_volume(0.6)
  63. sound_b = pygame.mixer.Sound(work_path+"boom.mp3")#点“心”音效

  64. font = pygame.font.SysFont("Arial", 50)

  65. #================flag标志===============================
  66. flag_click1 = True #心是否被点击
  67. flag_click2 = True #第一道白门是否被点击
  68. flag_door = False   #门是否被点击:进入照片事件
  69. change_flag = 0 #颜色切换模式

  70. #数据区end
  71. #函数区begin
  72. def change_color(trans_color,speed = 4):
  73.     if speed>0:
  74.         min_ = 0
  75.         max_ = 240
  76.     else:
  77.         min_ = 10
  78.         max_ = 255
  79.     if min_<=trans_color[0]<=max_:
  80.         for i in range(3):
  81.             trans_color[i] += speed
  82.         if(trans_color[0]>max_):
  83.             for i in range(3):
  84.                 trans_color[i] = max_
  85.         elif(trans_color[0]<min_):
  86.             for i in range(3):
  87.                 trans_color[i] = min_
  88.     else:
  89.         pass
  90.     screen.fill(trans_color)
  91.     return trans_color
  92. def arrow_click_check(x,y,rect,change,doors_index):
  93.     if rect.left<=x<=rect.right and rect.top<=y<=rect.bottom:#向右箭头被点击
  94.         sound_change.play()
  95.         doors_index += change
  96.         if doors_index>=len(doors):
  97.             doors_index -= len(doors)
  98.         if doors_index<0:
  99.             doors_index += len(doors)
  100.         return 2,doors_index
  101.     return 0,doors_index
  102.                            
  103. def show_photo(photo_name,dict_photo = {}):
  104.     if dict_photo == {}:
  105.         photo = pygame.image.load(work_path+photo_name)
  106.         rect = photo.get_rect()# 获取矩形区域
  107.         wid = rect.w
  108.         hei = rect.h
  109.         rect = rect.move(width//2-wid//2,height//2-hei//2)#居中
  110.         dict_photo["rect"] = rect
  111.         dict_photo["photo"] = photo
  112.     screen.blit(dict_photo["photo"],dict_photo["rect"])
  113.     pygame.display.flip()
  114.     return dict_photo
  115. #函数区end

  116. while True:  # 死循环确保窗口一直显示
  117.     clock.tick(sec_tick) #时钟每秒执行30(sec_tick)次
  118.     if not flag_door:
  119.         if flag_click1:
  120.             for event in pygame.event.get():  # 遍历所有事件
  121.                 if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
  122.                     sys.exit()
  123.                 if event.type == pygame.MOUSEBUTTONDOWN:
  124.                     mx,my = event.pos
  125.                     if ballrect.left<=mx<=ballrect.right\
  126.                        and ballrect.top<=my<=ballrect.bottom:
  127.                         sound_b.play()
  128.                         flag_click1 = False
  129.             ballrect = ballrect.move(speed)  # 移动心
  130.             # 碰到左右边缘
  131.             if ballrect.left < 0 or ballrect.right > width:
  132.                 speed[0] = -speed[0]
  133.             # 碰到上下边缘
  134.             if ballrect.top < 0 or ballrect.bottom > height:
  135.                 speed[1] = -speed[1]
  136.             screen.fill(color)  # 填充颜色
  137.             screen.blit(font.render(reminder, -1, (0,72,102)), (width//2-9*len(reminder), 100))
  138.             screen.blit(ball, ballrect)  # 将图片画到窗口上
  139.         elif color[0]<=230 and flag_click2:
  140.             color = change_color(color)
  141.             for event in pygame.event.get():  # 遍历所有事件
  142.                 if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
  143.                     sys.exit()
  144.         elif flag_click2:
  145.             screen.blit(door, doorrect)
  146.             for event in pygame.event.get():  # 遍历所有事件
  147.                 if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
  148.                     sys.exit()
  149.                 if event.type == pygame.MOUSEBUTTONDOWN:
  150.                     mx,my = event.pos
  151.                     if doorrect.left<=mx<=doorrect.right\
  152.                        and doorrect.top<=my<=doorrect.bottom:
  153.                         flag_click2 = False
  154.                         sound_open.play()
  155.         else:
  156.             if change_flag == 0:
  157.                 screen.blit(doors[doors_index], doorrect)
  158.                 screen.blit(rarrow,rarrowrec)
  159.                 screen.blit(larrow,larrowrec)
  160.                 for event in pygame.event.get():  # 遍历所有事件
  161.                     if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
  162.                         sys.exit()
  163.                     if event.type == pygame.MOUSEBUTTONDOWN:#点击事件
  164.                         mx,my = event.pos
  165.                         if doorrect.left<=mx<=doorrect.right\
  166.                            and doorrect.top<=my<=doorrect.bottom:#门被点击
  167.                             sound_open.play()
  168.                             flag_door = True
  169.                             door_time = pygame.time.get_ticks()
  170.                         change_flag1,doors_index = arrow_click_check(mx,my,rarrowrec,1,doors_index)
  171.                         change_flag2,doors_index = arrow_click_check(mx,my,larrowrec,-1,doors_index)#左右箭头点击检查
  172.                         change_flag = max(change_flag1,change_flag2)
  173.             elif change_flag == 2:
  174.                 for event in pygame.event.get():
  175.                     if event.type == pygame.QUIT:
  176.                         pygame.quit()
  177.                 color = change_color(color,-12)
  178.                 if color[0]<=11:
  179.                     change_flag = 1
  180.             elif change_flag == 1:
  181.                 for event in pygame.event.get():
  182.                     if event.type == pygame.QUIT:
  183.                         pygame.quit()
  184.                 color = change_color(color,12)
  185.                 if color[0]>=239:
  186.                     change_flag = 0
  187.         pygame.display.flip()
  188.     else:
  189.         for event in pygame.event.get():
  190.             if event.type == pygame.QUIT:
  191.                 pygame.quit()
  192.         screen.fill(color)
  193.         try:
  194.             file = '\\doors_com\\'+doors_file[doors_index][doors_inter]
  195.             road,ext = os.path.splitext(file)
  196.             if ext =='.mp4':
  197.                 pygame.mixer.music.fadeout(1000)
  198.                 vedio = VideoFileClip(work_path+file)
  199.                 vedio.preview()
  200.                 door_time = pygame.time.get_ticks()
  201.                 doors_inter += 1
  202.                 screen = pygame.display.set_mode(size)  # 显示窗口
  203.                 bgm_init()
  204.             else:
  205.                 if dict_photo:
  206.                     pass
  207.                 else:
  208.                     dict_photo = show_photo(file,dict_photo)
  209.                     screen.blit(dict_photo["photo"],dict_photo["rect"])
  210.                     pygame.display.flip()
  211.             if (pygame.time.get_ticks()-door_time)//(10*sec_tick)>3:
  212.                 door_time = pygame.time.get_ticks()
  213.                 dict_photo = {}
  214.                 doors_inter += 1
  215.         except IndexError:
  216.             screen.fill(color)
  217.             flag_door = False
  218.             dict_photo = {}
  219.             doors_inter = 0
  220.             pygame.display.flip()
  221. #        if (pygame.time.get_ticks()-door_time)//sec_tick>sep:
  222. #            flag_door = False
  223. #            screen.fill(color)
  224.       # 更新全部显示
  225. pygame.quit()  # 退出pygame
复制代码

打包的exe就不放上来了,有私人图片(笑),还有pkl。

可以猜猜这是在做什么^_^(虽是小计,但是都用上!)

可以猜猜这是在做什么^_^(虽是小计,但是都用上!)

开始界面,点心心,有popo猫的音效

开始界面,点心心,有popo猫的音效

本来想做宫殿一样的记忆相册,时间和记忆力双双有限,下次

本来想做宫殿一样的记忆相册,时间和记忆力双双有限,下次

箭头用来换门(换时间段)本来是想走廊的,最后像是锈湖

箭头用来换门(换时间段)本来是想走廊的,最后像是锈湖

快乐切换的渐变画面

快乐切换的渐变画面

一共四个门

一共四个门

评分

参与人数 2荣誉 +7 鱼币 +8 贡献 +6 收起 理由
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^
柿子饼同学 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 08:14:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 16:27:08 | 显示全部楼层
不错不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 17:22:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 21:33:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-27 14:01:14 | 显示全部楼层
11111111111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表