鱼C论坛

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

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

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

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

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

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

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

#==============pygame区===================
#------------球(心)--------------------
screen = pygame.display.set_mode(size)  # 显示窗口
ball = pygame.image.load(work_path+'ball.png')  # 加载图片
ballrect = ball.get_rect()
ballrect = ballrect.move([random.randint(0,width-ballrect.w),random.randint(0,height-ballrect.h)]) # 获取矩形区域
#------------门--------------------
#++++++++图像对象++++++++++
door = pygame.image.load(work_path+'door.png')
doors = []
doors_index = 0
for i in range(4):
    doors.append(pygame.image.load(work_path+'door{0}.png'.format(i+1)))
#++++++++++位置对象++++++++    
doorrect = door.get_rect()# 获取矩形区域
doorrect = doorrect.move(width//2-doorrect.w//2,height-doorrect.h-1)#居中
#------------箭头-------------------
#++++++++图像对象++++++++++ 
rarrow = pygame.image.load(work_path+'rarrow.png')
larrow = pygame.image.load(work_path+'larrow.png')
#++++++++++位置对象++++++++ 
rarrowrec = rarrow.get_rect()
larrowrec = larrow.get_rect()
arr_wid = rarrowrec.w
arr_hei = rarrowrec.h
larrowrec = larrowrec.move(width//8-arr_wid//2,height//2-arr_hei//2+20)
rarrowrec = rarrowrec.move(7*(width//8)-arr_wid//2,height//2-arr_hei//2+20)

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

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

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

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

#数据区end
#函数区begin
def change_color(trans_color,speed = 4):
    if speed>0:
        min_ = 0
        max_ = 240
    else:
        min_ = 10
        max_ = 255
    if min_<=trans_color[0]<=max_:
        for i in range(3):
            trans_color[i] += speed
        if(trans_color[0]>max_):
            for i in range(3):
                trans_color[i] = max_
        elif(trans_color[0]<min_):
            for i in range(3):
                trans_color[i] = min_
    else:
        pass
    screen.fill(trans_color)
    return trans_color
def arrow_click_check(x,y,rect,change,doors_index):
    if rect.left<=x<=rect.right and rect.top<=y<=rect.bottom:#向右箭头被点击
        sound_change.play()
        doors_index += change
        if doors_index>=len(doors):
            doors_index -= len(doors)
        if doors_index<0:
            doors_index += len(doors)
        return 2,doors_index
    return 0,doors_index
                            
def show_photo(photo_name,dict_photo = {}):
    if dict_photo == {}:
        photo = pygame.image.load(work_path+photo_name)
        rect = photo.get_rect()# 获取矩形区域
        wid = rect.w
        hei = rect.h
        rect = rect.move(width//2-wid//2,height//2-hei//2)#居中
        dict_photo["rect"] = rect
        dict_photo["photo"] = photo
    screen.blit(dict_photo["photo"],dict_photo["rect"])
    pygame.display.flip()
    return dict_photo
#函数区end

while True:  # 死循环确保窗口一直显示
    clock.tick(sec_tick) #时钟每秒执行30(sec_tick)次
    if not flag_door:
        if flag_click1: 
            for event in pygame.event.get():  # 遍历所有事件
                if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
                    sys.exit()
                if event.type == pygame.MOUSEBUTTONDOWN:
                    mx,my = event.pos
                    if ballrect.left<=mx<=ballrect.right\
                       and ballrect.top<=my<=ballrect.bottom:
                        sound_b.play()
                        flag_click1 = False 
            ballrect = ballrect.move(speed)  # 移动心
            # 碰到左右边缘
            if ballrect.left < 0 or ballrect.right > width:
                speed[0] = -speed[0]
            # 碰到上下边缘
            if ballrect.top < 0 or ballrect.bottom > height:
                speed[1] = -speed[1]
            screen.fill(color)  # 填充颜色
            screen.blit(font.render(reminder, -1, (0,72,102)), (width//2-9*len(reminder), 100))
            screen.blit(ball, ballrect)  # 将图片画到窗口上
        elif color[0]<=230 and flag_click2:
            color = change_color(color)
            for event in pygame.event.get():  # 遍历所有事件
                if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
                    sys.exit()
        elif flag_click2:
            screen.blit(door, doorrect)
            for event in pygame.event.get():  # 遍历所有事件
                if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
                    sys.exit()
                if event.type == pygame.MOUSEBUTTONDOWN:
                    mx,my = event.pos
                    if doorrect.left<=mx<=doorrect.right\
                       and doorrect.top<=my<=doorrect.bottom:
                        flag_click2 = False
                        sound_open.play()
        else:
            if change_flag == 0:
                screen.blit(doors[doors_index], doorrect)
                screen.blit(rarrow,rarrowrec)
                screen.blit(larrow,larrowrec)
                for event in pygame.event.get():  # 遍历所有事件
                    if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
                        sys.exit()
                    if event.type == pygame.MOUSEBUTTONDOWN:#点击事件
                        mx,my = event.pos
                        if doorrect.left<=mx<=doorrect.right\
                           and doorrect.top<=my<=doorrect.bottom:#门被点击
                            sound_open.play()
                            flag_door = True
                            door_time = pygame.time.get_ticks()
                        change_flag1,doors_index = arrow_click_check(mx,my,rarrowrec,1,doors_index)
                        change_flag2,doors_index = arrow_click_check(mx,my,larrowrec,-1,doors_index)#左右箭头点击检查
                        change_flag = max(change_flag1,change_flag2)
            elif change_flag == 2:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.quit()
                color = change_color(color,-12)
                if color[0]<=11:
                    change_flag = 1
            elif change_flag == 1:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.quit()
                color = change_color(color,12)
                if color[0]>=239:
                    change_flag = 0
        pygame.display.flip()
    else:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
        screen.fill(color)
        try:
            file = '\\doors_com\\'+doors_file[doors_index][doors_inter]
            road,ext = os.path.splitext(file)
            if ext =='.mp4':
                pygame.mixer.music.fadeout(1000)
                vedio = VideoFileClip(work_path+file)
                vedio.preview()
                door_time = pygame.time.get_ticks()
                doors_inter += 1
                screen = pygame.display.set_mode(size)  # 显示窗口
                bgm_init()
            else:
                if dict_photo:
                    pass
                else:
                    dict_photo = show_photo(file,dict_photo)
                    screen.blit(dict_photo["photo"],dict_photo["rect"])
                    pygame.display.flip()
            if (pygame.time.get_ticks()-door_time)//(10*sec_tick)>3:
                door_time = pygame.time.get_ticks()
                dict_photo = {}
                doors_inter += 1
        except IndexError:
            screen.fill(color)
            flag_door = False
            dict_photo = {}
            doors_inter = 0
            pygame.display.flip()
#        if (pygame.time.get_ticks()-door_time)//sec_tick>sep:
#            flag_door = False
#            screen.fill(color)
      # 更新全部显示
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-11-16 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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