python菜根谭小猫_少儿编程国学动画经典案例_作者:李兴球

版权声明:所有文章皆为李兴球先生原创,转载请注明出处,否则保留权利,追究责任。 https://blog.csdn.net/avskya/article/details/82959989

可爱的猫咪们在窗口中走来走去,还时不时地说出句鸡汤文,它们优雅地步伐会让你联想到它们是捉老鼠的家猫吗?

"""
   菜根谭小猫.py
   本程序演示四只行走的小猫,碰到屏幕边缘会反向,有时候它也会向后转。
   它会时不时地说《菜根谭》里面的句子。它有时候还会发出猫叫声。
   作者:李兴球,日期:2018/10/2。
"""

from turtle import *
import os
from random import randint,choice

class Sprite(Turtle):
    def __init__(self,ycor,imagesL,imagesR,sentence,sound = None):
        """参数说明:
           ycor:初始y坐标
           imagesL: 左行列表图
           imgaesR: 右行列表图
           sentence:话语列表
           sound:喵叫声
        """
        Turtle.__init__(self,visible=False)
        self.screen_width = self.screen.window_width()   #屏幕宽度属性
        self.up()
        self.sety(ycor)          #设置初始y坐标
        self.sentence = sentence # 句子列表
        self.sound = sound       #猫叫声
        self.imagesL = imagesL   #左造型列表         
        self.imagesR = imagesR   #右造型列表         
        self.index = 0
        self.images_amount = len(imagesL)   #造型数量 
        self.images = self.imagesL if self.heading()==180 else self.imagesR
        self.word_turtle = Turtle(visible = False,shape='blank')  #用于在self头顶上显示字符的海龟对象
        self.word_turtle.penup()
        self.word_turtle.pencolor("green")
        self.st()
        self.move()
        
    def move(self):
        """让小猫移动,让它有时候会向后转,有时候会说话。"""
        self.word_turtle.clear()
        self.miao()                                        #有时候会发声。
        if randint(1,200) == 1:
           self.shape(self.images[0])                      #切换到索引为0的造型           
           self.speak()                                    #停下来,随机说一句话           
        else:          
           self.fd(10)
           sm = randint(1,50) == 1 and abs(self.xcor())< self.screen_width //3 
           if sm: self.turn_back()       #有时候会向后转,不能在边缘时向后,否则会有冲突
           self.next_image()             #切换到下一个造型
           self.bounce_on_edge()         #碰到边缘就反向
           self.screen.ontimer(self.move,100) #100毫秒后继续移动
           
    def turn_back(self):
        """向后转"""
        
        self.rt(180)             
        self.images = self.imagesL if self.heading()==180 else self.imagesR
        self.index = 0
        
    def next_image(self):
        """切换到下一个造型"""
        self.shape(self.images[self.index])
        self.index = self.index + 1
        self.index = self.index % self.images_amount
        
    def bounce_on_edge(self):
        
        """对象是离边缘50像素时,让它向后转"""
        if abs(self.xcor()) > self.screen_width //2  - 50:
            self.turn_back()                                #到了边缘会向后转
            
    def miao(self):
        """设置一定的机率,让小猫发出喵叫声"""
        if randint(1,300) == 1:
            try:self.sound.play()
            except:pass
        
    def speak(self):
        """让小猫的头顶上显示一行句子,好像小猫在说话"""
        words = choice(self.sentence)
        x = self.xcor()
        y = self.ycor() + 55
        self.word_turtle.goto(x,y)
        self.word_turtle.write(words,align='center',font=("黑体",12,"normal"))
        wait_time = 1000 * len(words) //2         #设定等待时间
        self.screen.ontimer(self.move,wait_time)  # 根据句子的长度决定等待时间
        
        
def load_sentence(filename):
    """读文件内容,返回句子组成的列表,参数为文件名路径"""
    words = []
    f = open(filename)
    for line in f:
        if line.strip() != "": words.append(line)
    f.close()
    return words

def init_screen(width,height,title,background):
    """初始化屏幕,参数分别是:宽度,高度,窗口标题,背景图路径"""
    screen = Screen()
    screen.bgpic(background)
    screen.setup(width,height)
    screen.title(title)    
    screen.delay(0)
    return screen
    
def register_gif(screen):
    """注册gif图形,参数为屏幕对象"""
    images0 = [os.getcwd() + os.sep + "cat_image0\\Walk"+ (2 - len(str(i))) * "0" + str(i) + ".gif"   for i in range(16)]
    images1 = [os.getcwd() + os.sep + "cat_image1\\Walk"+ (2 - len(str(i))) * "0" + str(i) + ".gif"   for i in range(16)]
    [screen.addshape(image ) for image in images0]
    [screen.addshape(image ) for image in images1]
    return images0,images1

def init_audio():
    """播放背景音乐,加载‘喵’声。"""
    try:
        import pygame
        pygame.mixer.init()                  #初始化混音器
        pygame.mixer.music.load("BGM10.mp3") #加载背景音乐
        pygame.mixer.music.play(-1,0)        #循环播放背影音乐
        miao = pygame.mixer.Sound("喵.wav")  #生成音效对象
    except:
        print("音频初始化失败,可能没有安装pygame模块。")
        miao = None
    return miao


def main():
    
    """定义主程序,它的执行步骤为:
    初始化屏幕,注册gif图形,初始化音频,装载菜根谭名句,新建4个小猫对象,主循环
    """    
    screen = init_screen(960,720,"《菜根谭》小猫","stripes.png")  #初始化屏幕
    
    images0,images1 = register_gif(screen)                        #注册gif图到形状列表

    miao = init_audio()                                           #初始化音频
    
    句子 = load_sentence("菜根谭名句摘要.txt")                    #装载菜根谭名句到列表

    [Sprite(y,images0,images1,句子,miao) for y in (80,260,-120,-290)] #生成4只小猫
    
    screen.mainloop()                                            #主循环
    
               
    
if __name__=="__main__":

    main()

   """需要本作品素材请联系风火轮少儿编程李兴球先生"""
    
        
        
        
 

猜你喜欢

转载自blog.csdn.net/avskya/article/details/82959989