猫史档案馆


【Python作品分享】【36强进10】给中国航天人的 明信片

用户:oooRZoooRZ查看:0 回复:3 评论:0 创建时间:2021-05-23T12:14:13


【作品展示】

center_image

 

【作品介绍】

程序开始时

按空格键开始采集

按wasd或上下左右移动

天上按时间顺序掉落图片

采集期间不可关闭窗口

碰到图片可以弹出对应故事,按空格键采集

全部图片采集完以后开始生成明信片

明信片中有9张图片,点击可以查看对应故事

 

【作品源代码】

# -*- coding: utf-8 -*-
"""
    程序开始时
    按空格键开始采集
    按wasd或上下左右移动
    天上按时间顺序掉落图片
    采集期间不可关闭窗口
    碰到图片可以弹出对应故事,按空格键采集
    全部图片采集完以后开始生成明信片
    明信片中有9张图片,点击可以查看对应故事
"""
from arcade import*
from PIL import Image,ImageDraw,ImageFilter
import easygui
import random
import os
SCREEN_WIDTH,SCREEN_HEIGHT = (800,600)  # 窗体宽与高
SCREEN_TITLE:str = "航天人的明星片"  # 窗体标题
game:object = None  # 准备game

def Alpha(path:str):  # 设置bg3透明度
    img = Image.open(path).convert("RGBA")  #转换RGBA
    img.putalpha(76)  # 设置透明度为76
    img.save("bg3.png")  # 保存
    return Sprite("bg3.png")  # 返回对象

def Aplta(img:str,num:int=1):  # 自适应
    temp = Image.open(img)  # 打开图片
    """判断对应情况下的图片大小"""
    if num == 3:
        size = (1200, SCREEN_HEIGHT)
    else:
        size = (SCREEN_WIDTH, SCREEN_HEIGHT)
    if num == 1:
        temp.putalpha(190)
    temp.resize(size).save(f"bg{num}.png")  # 保存
    return Sprite(f"bg{num}.png")  # 返回对象

class PlayEr(Sprite):  # 玩家角色
    """喵家角色封装成类,代码更简洁"""
    def __init__(self:object, image:str):  # 构造函数
        super().__init__(image)  # 初始化Sprite(父)类
        self.center_x, self.center_y = (SCREEN_WIDTH//2, 30)  # 起始位置
        self.scale = 0.3  # 缩放系数

    def update(self:object):  # 更新位置函数
        super().update()  # 使用Sprite(父)类的update方法
        """ 
            判断角色是否超出窗体边缘
            是则不移动
        """
        if self.left < 0:
            self.left = 0
        elif self.right > SCREEN_WIDTH:
            self.right = SCREEN_WIDTH
        if self.top > SCREEN_HEIGHT-70:
            self.top = SCREEN_HEIGHT-70
        elif self.bottom < 0:
            self.bottom = 0

class Speac(Sprite):  # 图片角色
    """把图片角色的代码封装成类,代码更简洁"""
    def __init__(self:object,file:str,op:int,scale:float=0.2):  # 构造函数
        super().__init__(file,scale)  # 初始化Sprite(父)类
        """随机位置"""
        self.center_x = random.randint(self.width//2, SCREEN_WIDTH-self.width//2)
        self.center_y = SCREEN_HEIGHT+90
        self.change_y = -2  # 下落速度
        self.op = op
        self.file = os.path.splitext(file)[0]  # 获取文件名,不带后缀

    def update(self:object):  # 更新位置函数
        if game.io == self.op:  # 如果游戏时间等于当前时间
            super().update()  # 更新位置
        if self.top < 0:  # 如果离开下边缘
            """重置位置"""
            self.center_x = random.randint(self.width-50, SCREEN_WIDTH)
            self.center_y = SCREEN_HEIGHT+90

class MyGame(Window):  # 主类
    """用类(class)的方式编辑,可以达到维护代码的效果"""
    def __init__(self:object,width:int,height:int,title:str):  # 构造函数
        super().__init__(width, height, title)  # 初始化Window(父)类
        self.setup()  # 调用初始化函数

    def setup(self: object):  # 初始化函数
        self.index = 0  # 进度
        self.speacs = SpriteList()  # 图片类
        self.gril = None  # 网格
        self.io = 0  # 游戏时间
        self.pouint = [" 弘扬航天精神,拥抱星辰大海",
                       "探索浩瀚宇宙,发展航天事业,建设航天强国,是我们不懈追求的航天梦。",
                       "  航天梦,喵",
                       "扬帆起航,逐梦九天",
                       "  致敬中国航天人",
                       " 弘扬航天精神,自立自强,创新超越",
                       "一代航天人,承载一代梦;一代航天梦,铸就中华魂!",
                       " 希望我国的航天事业能够蒸蒸日上,不断突破创新,祝愿每一位航天人身体健康!",
                       "把我们的梦想和期待送上太空,你们才是我们最大的骄傲!",
                       "希望我国的航天事业越来越好,在这里向所有为我国航天事业努力奋斗的人真诚地说一声,你们辛苦了,你们最可爱。",
                       "  走过昨天的艰难,紧握今天的硕果,书写明天的辉煌! 祝我国航天事业越来越强,祖国越来越好。",
                       " 寻根航天,探梦苍穹",
                       "  中国航天事业正如翱翔的喵,展翅高飞,划破长空!",
                       "向中国航天人学习",
                       "中国航天人您辛苦了!您是我们的榜样!",
                       "好好学习,天天向上,希望将来我也能成为中国航天家族的一员,为中国航天事业续写传奇。"]
        self.showp = "\n\n".join(random.sample(self.pouint, 3))
        self.px = self._width+400
        self.g = True
        self.INFO = "    2021年5月15日中国祝融号火星车在火星着陆,\n\n书写中国航天事业新篇章。让我们跟随作者虚构的\n\n飞船去虚拟太空寻找中国航天事业的发展足迹,并\n\n采集资料,为我们敬爱的航天人制作一张明信片。"
        self.show = {
            0: "1956年10月8日,钱学森受命组建的喵个火箭与导弹研究机构成立。1956年也被认为是中国导弹梦、航天梦的元年。",
            1: "1970年,中国用第一枚运载火箭“长征一号”将第一颗人造地球卫星“东方红一号”送入太空,中国成为世界上第五个用自制火箭发射国产卫星的国家。",
            2: "2003年,航天员杨利伟穿越大气层,不远万里为浩瀚星空增添了一抹中国红,标志着中国成为世界上第三个将人类送上太空的国家。",
            3: "2008年,“神州七号”搭载三名航天员,航天员翟志刚完成中国航天员首次空间出舱活动。",
            4: "2010年,“嫦娥二号”获得更高精度的月球表面三维影像,探测月球物质成分、月壤特性、地月与近月空间环境,刷新中国航天新高度。",
            5: "2012年,“神州九号”与“天宫一号”实现载人“太空之吻”。",
            6: "2013年,“嫦娥三号”成为喵个月球软着陆的无人登月探测器。\n2018年,“嫦娥喵”带着“玉兔二号”来到了月球背面,开启月球探测新旅程,为人类首次揭开月球背面的神秘面纱。",
            7: "2020年7月,中国首次火星探测任务“天问一号”发射升空,迈出了中国自主开展行星探测的第一步。",
            8: "2020年11月,“长征五号”成功将“嫦娥五号”送入地月转移轨道,开启中国首次地外天体采样返回之旅。",
            9: "2021年5月,天问一号火星探测器所携带的祝融号火星车及其着陆组合体成功着陆于火星。我国首次火星探测任务着陆火星取得圆满成功。"
        }
        self.setBg()  # 初始化背景
        self.setSprite()  # 初始化角色

    def setBg(self: object):  # 初始化背景函数
        """添加背景"""
        self.bg1 = Aplta("背景1.png")
        self.bg1.center_x,self.bg1.center_y = (self._width//2,self._height//2)
        self.bg2 = Aplta("bg.png",2)
        self.bg2.center_x, self.bg2.center_y = (self._width//2, self._height//2)
        self.bg3 = Alpha("背景2.png")
        self.bg3.center_x, self.bg3.center_y = (1200//2, self._height//2)

    def setSprite(self: object):  # 初始化角色函数
        self.player = PlayEr("player.png")  # 创建玩家
        self.player.su = 4  # 玩家速度
        self.piao = Sprite("邮票.png")  # 邮票
        self.piao.scale = 0.25  # 邮票缩放系数
        self.piao.center_x,self.piao.center_y = (1150,550)  # 邮票位置
        self.srea_spec()  # 创建图片

    def on_draw(self: object):  # 帧率绘制:FPS 60
        start_render()  # 清除并开始绘制
        """根据进度绘制不同的东西"""
        if self.index == 0:
            self.bg1.draw()
            draw_text("给中国航天人的 “明信片”", 200, self._height-100,
                      color.YELLOW, 30, font_name=("simhei", "PingFang"))
            draw_text(self.INFO, 170, self._height-350,
                      color.GREEN, 20, font_name=("simhei", "PingFang"))
            draw_text("  按下空格键,进入我们的太空之旅吧……", 200, 130,color.RED, 20, font_name=("simhei", "PingFang"))
        elif self.index == 1:
            self.bg2.draw()
            if self.speacs:
                self.speacs.draw()
            self.player.draw()
        elif self.index == 2:
            self.bg3.draw()
            self.gril.draw()
            x = 600+50
            bm = "100000"
            for i in range(0,6,1):
                draw_rectangle_outline(
                    x, self._height-50, 30, 30, color.ORANGE, 4)
                draw_text(bm[i],x-5,self._height-60,color.WHITE,15)
                x += 50
            x = 1200-50
            bm = "601153"
            for j in range(0,6,1):
                draw_rectangle_outline(
                    x, 50, 30, 30, color.ORANGE, 4)
                draw_text(bm[j],x-5,40,color.WHITE,15)
                x -= 50
            self.piao.draw()
            s = 43
            draw_text("收件地址:",650,410,color.ORANGE,20,font_name=("simhei", "PingFang"))
            draw_text("北京市海淀区阜成路甲8号局",790,410,color.WHITE,20,font_name=("simhei", "PingFang"))
            draw_text("国家航天局",790,410-s,color.WHITE,20,font_name=("simhei", "PingFang"))    
            draw_text("收件人:",650,324,color.ORANGE,20,font_name=("simhei", "PingFang"))
            draw_text("  全体航天人(收)",770,324,color.WHITE,20,font_name=("simhei", "PingFang"))
            draw_text("寄件地址:",650,281,color.ORANGE,20,font_name=("simhei", "PingFang"))
            draw_text("福建省莆田市荔城区第四实",790,281,color.WHITE,20,font_name=("simhei", "PingFang"))
            draw_text("验小学四(5)班",790,281-s,color.WHITE,20,font_name=("simhei", "PingFang"))    
            draw_text("寄件人:",650,195,color.ORANGE,20,font_name=("simhei", "PingFang"))
            draw_text("  天寻",770,195,color.WHITE,20,font_name=("simhei", "PingFang"))
            y = 410
            for _ in range(0,6,1):
                draw_line(774,y,1110,y,color.ORANGE,2)
                y -= s
            if self.g:
                draw_text(self.showp, self.px, 470, color.YELLOW,
                        15, font_name=("simhei", "PingFang"))

    def on_update(self: object,delta_time: float):  # 帧率数据处理:FPS 60
        if self.index == 1:
            self.player.update()
            if self.speacs:
                self.speacs.update()
                Lst = check_for_collision_with_list(self.player, self.speacs)
                if Lst:
                    for ht in Lst:
                        easygui.msgbox(self.show[ht.op],ht.file,image=f"{ht.file}.png",ok_button="采集")
                        ht.喵()
                        self.player.change_x = 0
                        self.player.change_y = 0
                        self.io += 1
            if self.io > 9 and self.index == 1:
                self.speacs = None
                easygui.msgbox("采集完毕,开始制作明信片送给可爱的中国航天人",
                               "制作明信片", ok_button="开始制作")
                self.index = 2
                self.width,self.height = (1200,600)
                self.gril = self.images()
                self.gril.center_x,self.gril.center_y = (300,300)
        elif self.index == 2 and self.g:
            self.px -= 1
            if self.px <= -100:
                self.px = 1200
                self.showp = "\n\n".join(random.sample(self.pouint, 3))

    def on_key_release(self: object, symbol: int, modlflers: int):
        if symbol == key.SPACE and self.index == 0:
            self.index = 1
        if symbol == key.DOWN or symbol == key.S or symbol == key.UP or symbol == key.W:
            self.player.change_y = 0
        elif symbol == key.LEFT or symbol == key.A or symbol == key.RIGHT or symbol == key.D:
            self.player.change_x = 0
        if symbol == key.G and self.index == 2:
            self.g = not self.g

    def on_key_press(self: object, symbol: int, modlflers: int):  # 侦测按键被按下
        """按对应键移动"""
        if symbol == key.LEFT or symbol == key.A:
            self.player.change_x = -self.player.su
        elif symbol == key.RIGHT or symbol == key.D:
            self.player.change_x = self.player.su
        elif symbol == key.UP or symbol == key.W:
            self.player.change_y = self.player.su
        elif symbol == key.DOWN or symbol == key.S:
            self.player.change_y = -self.player.su
    
    def srea_spec(self:object):
        temp_spec = Speac("钱学森.png", op=0)
        self.speacs.append(temp_spec)
        temp_spec = Speac("东方红一号.png", op=1)
        self.speacs.append(temp_spec)
        temp_spec = Speac("杨利伟.png", op=2)
        self.speacs.append(temp_spec)
        temp_spec = Speac("翟志刚.png", op=3,scale=0.4)
        self.speacs.append(temp_spec)
        temp_spec = Speac("嫦娥二号.png", op=4)
        self.speacs.append(temp_spec)
        temp_spec = Speac("天宫一号.png", op=5,scale=0.1)
        self.speacs.append(temp_spec)
        temp_spec = Speac("嫦娥三喵.png", op=6)
        self.speacs.append(temp_spec)
        temp_spec = Speac("天问一号.png", op=7)
        self.speacs.append(temp_spec)
        temp_spec = Speac("嫦娥五号.png", op=8)
        self.speacs.append(temp_spec)
        temp_spec = Speac("祝融号.png", op=9)
        self.speacs.append(temp_spec)

    def close(self:object):
        if self.io <= 9 and self.index == 1:
            easygui.msgbox("你还未收集完毕,请先收集", "关闭")
            return
        try:
            os.unlink("bg1.png")
            os.unlink("bg2.png")
            os.unlink("bg3.png")
            os.unlink("gril.png")
        except:
            pass
        super().close()
    
    def images(self:object):
        gril = Image.new("RGBA",(600,600))
        imageList = [
                     ["钱学森.png", "东方红一号.png", "杨利伟.png"],
                     ["翟志刚.png", "嫦娥二号.png", "天宫一号.png"],
                     ["嫦娥三喵.png", "嫦娥五号.png", "祝融号.png"]
        ]
        x,y = 0,0
        for h in range(3):
            for w in range(3):
                temp = Image.open(imageList[h][w]).resize((200, 200))
                gril.paste(temp,(x,y))
                x += 200
            y += 200
            x = 0
        gril.save("gril.png")
        return Sprite("gril.png")
    
    def on_mouse_press(self:object,x:float,y:float,button:int,modlflers:int):
        print((x,y))
        if self.index == 2:
            if x <=200 and y >= 400:
                easygui.msgbox(self.show[0],"钱学森",image="钱学森.png",ok_button="了解")
            elif x <=400 and y >= 400:
                easygui.msgbox(self.show[1],"东方红一号",image="东方红一号.png",ok_button="了解")
            elif x <=600 and y >= 400:
                easygui.msgbox(self.show[2],"杨利伟",image="杨利伟.png",ok_button="了解")
            elif x <=200 and y >= 200:
                easygui.msgbox(self.show[3],"翟志刚",image="翟志刚.png",ok_button="了解")
            elif x <=400 and y >= 200:
                easygui.msgbox(self.show[4],"嫦娥二号",image="嫦娥二号.png",ok_button="了解")
            elif x <=600 and y >= 200:
                easygui.msgbox(self.show[5],"天宫一号",image="天宫一号.png",ok_button="了解")
            elif x <=200 and y >= 0:
                easygui.msgbox(self.show[6],"嫦娥三喵",image="嫦娥三喵.png",ok_button="了解")
            elif x <=400 and y >= 0:
                easygui.msgbox(self.show[8],"嫦娥五号",image="嫦娥五号.png",ok_button="了解")
            elif x <=600 and y >= 0:
                easygui.msgbox(self.show[9],"祝融号",image="祝融号.png",ok_button="了解")

def main():  # 主要函数
    global game  # 全局变量
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)  # 创建游戏对象
    run()  # 运行

if __name__ == "__main__":  #当python文件在本地运行时执行
    main()  # 调用主函数

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
oooRZoooRZ

背景1.png

center_image

bg.png

center_image

背景2.png

center_image

点赞0


评论


oooRZoooRZ

player.png

center_image

邮票.png

center_image

点赞0


评论


oooRZoooRZ

钱学森.png

center_image

东方红一号.png

center_image

杨利伟.png

center_image

翟志刚.png

center_image

嫦娥二号.png

 

center_image

天宫一号.png

center_image

嫦娥三四号.png

center_image

天问一号.png

center_image

嫦娥五号.png

center_image

祝融号.png

center_image

 

点赞0


评论