Python模拟海底世界章鱼哥_向面对象

你好,请进入Q群:225792826,免费下载本站最新提供的视频教程原创源码资料,从2020年2月20号到3月底,成为本站会员只要原价的3折,即2980元*0.3 = 894元 ,向微信scratch8付款即可成为本站会员。即可拥有本站所有原创资源,并提供技术支持。如本消息修改,以最后时间的为准。

Python模拟海底世界章鱼哥_向面对象

下面是部分代码预览:

'''Python模拟海底世界章鱼哥_向面对象 .py
   本程序采用面向对象方法编程,新建了Bubble类,Octopus类等,栩栩如生地展现了可爱的章鱼吐泡泡和左右摇摆的形态.
   本用也有面向过程的同样效果的程序,还有一个用arcade模块制作的同样效果的程序. 这个版本是有鱼和螃蟹的.
   
'''
import math,time
from turtle import Turtle,Screen              # 导入Turtle类和Screen命令
from random import randint

def follow_mouse(event):
    """本函数让小海龟面朝鼠标指针移动
       由于海龟画图的坐标和tkinter画布原生坐标不一样,所以要进行坐标转换。
    """
    x = event.x - width//2                   # 转换成海龟坐标系中的x坐标
    y = height//2 - event.y                  # 转换成海龟坐标系中的y坐标
     
class Bubble(Turtle):
    def __init__(self,images,master,delaytime):
        Turtle.__init__(self,visible=False)
        self.speed(0)                                  # 动作速度为最快
        self.penup()                                                  
        self.images = images                           # 造型列表
        self.amounts = len(images)                     # 造型数量
        self.master = master                           # 它的主人是章鱼
        self.delaytime = delaytime                     # 延迟总时间
        self.delaycounter = 0                          # 延时出现计时器
        self.screen_height = self.screen.window_height()        
        self.wait_until_time_up()                      # 异步等待,时间到了出现泡泡 调用self.rise

    def wait_until_time_up(self):
        """等到时间到了就显示"""
        if self.delaycounter < self.delaytime:
            self.delaycounter += 1
            self.screen.ontimer(self.wait_until_time_up,1000) # 1秒后再次运行
        else:                                                 # 超时就显示出来
            self.init_costume()                               # 初始化造型等
            self.rise()                                       # 泡泡上升     
 
    def init_costume(self):
        """初始化造型"""
        self.ht()                                       # 隐藏           
        
    def rise(self):
        """泡泡上升"""
                                               
    def alt_costume(self):
        """切换造型,让泡泡变大,为了不让它一下子变大,加了interval"""                 
 
def animate_screen():
    """动态背景,由于要改变bg_index的值,所以申明为全局"""
    global bg_index
    screen.bgpic(waveimages[bg_index])                 # 切换背景
    bg_index = bg_index + 1                            # 背景图像编号加1

class Octopus(Turtle):
    def __init__(self,images):
        Turtle.__init__(self,visible=False)
        self.images = images
        self.penup()
        self.speed(0)
        self.costume_counter = 0                     #  造型计数器,相当于自变量
        self.costume_index = 0                       # 造型索引号
        
    def animate(self):
        """切换造型,此处用到了
           80 - abs(self.costume_counter%160 - 80)   算术表达式
           它的costume_counter相当于自变量,能让造型编号从0增加到80,然后又下降直到0。
           值变化为0,1,2,3,4,...80,79,78,...0,1,2,3....周期性为160。
        """

class Fish(Turtle):
    def __init__(self,images_right,images_left,enemy):
        Turtle.__init__(self,visible=False)
        self.images_right = images_right              # 右造型列表
        self.images_left = images_left                # 左造型列表
        self.images_list = [images_right,images_left] # 造型列表
        
    def wait_until_time_up(self):
        """每条鱼的出现时间不一样"""
        if self.delaycounter < self.delaytime:
            self.delaycounter += 1
            self.screen.ontimer(self.wait_until_time_up,1000) # 1秒后再次运行
        else:                                                 # 超时就显示出来 
            self.move()                           # 移动
            self.animate()                        # 换造型
            self.st()                             # 显示
        
    def set_enemy_dead_rect(self):
        """章鱼脚大概的矩形范围"""
        self.enemy_left = self.enemy.xcor() - 65
        self.enemy_right = self.enemy.xcor() + 65
        self.enemy_top = self.enemy.ycor()  
        self.enemy_bottom = self.enemy.ycor() -125          
        
    def move(self):
        if not self.dead:
            self.fd(10)        
            self.bounce_on_edge()                        # 碰到边缘就反弹
            self.bump_enemy_check()                      # 碰敌人检测
            self.screen.ontimer(self.move,100)

    def bump_enemy_check(self):
        """碰敌人检测"""
        self.set_enemy_dead_rect()
        
    def bounce_on_edge(self):
        if abs(self.xcor()) >= self.screen_width//2:
            self.right(180)
            self.set_costume_list()               
        
    def set_costume_list(self):
        """根据方向设置造型列表,有0和180两个方向"""
        self.images_index = int(self.heading() // 180)     # 根据方向选择用左或右系列造型        
        self.images = self.images_list[self.images_index]  # 当前的造型列表        
        
    def animate(self):
        if not self.dead:
            image = self.images[self.costume_index]        # 取图像
            
            
class Crab(Turtle):
    def __init__(self,images):
        Turtle.__init__(self,visible=False)         
        self.images = images                              # 造型列表        
        self.setheading(randint(0,1)*180)                 # 初始方向,向左或向右               
        self.penup()
        self.speed(0)         
        self.costume_index = 0                            # 造型索引号
        self.costume_amounts = len(images)                # 造型数量    
        self.screen_width = self.screen.window_width()    # 获取屏幕宽
        self.screen_height = self.screen.window_height()  # 获取屏幕高度        
        
    def wait_until_time_up(self):
        """每个crab的出现时间不一样"""
        
    def move(self):
        """移动"""

    def random_turn_back(self):
        """设置一定的概率让它有时候反向""" 
            
    def bounce_on_edge(self):
        """碰到左右边缘就反向"""     
        
    def animate(self):
        """不定时切换造型"""            
            
if __name__ == "__main__":

    bg_index = 0
    width,height = 500,685      
    pop_images = ["bubbles6/" +     str(i) + ".gif" for i in range(20)] 
    octopus_images = ["章鱼/" +     str(i) + ".gif" for i in range(1,82)]
    fish_right_images = ["fishes/0.gif","fishes/1.gif","fishes/2.gif"]
    fish_left_images = ["fishes/0-left.gif","fishes/1-left.gif","fishes/2-left.gif"]
    crab_images = ["crabs/crab-a.gif","crabs/crab-b.gif"]
    waveimages = ["bg2/" + (4-len(str(i))) * "0" + str(i) + ".png" for i in range(1,16)]    
    bg_amounts = len(waveimages)
    
    screen = Screen()
    screen.colormode(255)
    screen.title('章鱼哥')               #写上窗口标题
    screen.setup(width,height)           #设定窗口大小     
    screen.delay(0)    
    [screen.addshape(image) for image in pop_images]       # 添加泡泡从小到大造型
    [screen.addshape(image) for image in octopus_images]   # 添加章鱼的所有造型 
    [screen.addshape(image) for image in fish_right_images]# 添加鱼的右造型表 
    [screen.addshape(image) for image in fish_left_images] # 添加鱼的左造型表
    [screen.addshape(image) for image in crab_images]      # 添加螃蟹的造型表

    animate_screen()
    #Crab(crab_images)
    #Crab(crab_images) 
    octopus = Octopus(octopus_images)    
    [ Bubble(pop_images,octopus,delaytime) for delaytime in range(1,6) ]
    #[ Fish(fish_right_images,fish_left_images,octopus) for i in range(10) ]
   
    screen.cv.bind("<Motion>",follow_mouse)   #画布绑定鼠标移动事件
    screen.mainloop()
 

如需要查看完整源代码,请扫码付款:

VIP免费查看

已有0人支付

本站所有作品,教程等皆为原创,盗版必究。一旦付款,表示同意本站知识付费原则:数字商品,不支持退款。亦可直接向微信号scratch8付款购买。QQ群免费教学群:225792826 (提供真实姓名可入群)
李兴球的博客_Python创意编程技术前沿 » Python模拟海底世界章鱼哥_向面对象

学本领,探索更大的世界!

李兴球博客 风火轮编程主页