美文网首页
Day11-pygame应用

Day11-pygame应用

作者: ____空白 | 来源:发表于2018-07-30 17:35 被阅读0次

    上周内容回顾:


    1.列表、字典、集合、元祖
    {key:value}, key唯一的,key值是不可变的

    元祖:不可变的,有序的
    (元素,)

    集合:可变、无序
    {元素}
    数学相关的集合运算

    dict1 = {'a':12,'b':[
    {'aa':1, 'bb':2},
    {'aa':100, 'bb':200}
    ]}
    dict1['b'].append
    dict1['b'].remove
    dict1['b'][]

    dict1['b'][1]['bb']

    怎么选是用字典还是列表?:
    (1.同时存储多个信息 --> 考虑使用容器类型(列表、字典、集合、元祖)
    (2.是否可以对数据进行增删改查---> 是:列表、字典 否:元祖、集合
    (3.看存储的数据是否是同一类数据---> 是:列表 否:字典


    2.函数
    (1.怎么声明函数
    def 函数名(参数列表):
    函数体

    (2.参数
    参数的功能是从函数外面给函数传值

    传参:位置参数、关键参数(保证每个参数都要有值)

    参数可以有默认值:1.有默认值的参数要放到没有默认值的参数的后面 2.可以不用传参

    参数个数可以不定:参数名前加'',参数就变成元祖
    补充:容器类型前面加'
    ',就是将容器中的所有的元素全部取出(元祖用得比较多)

    (3.返回值
    return后面的表达式的值(没有遇到return,默认是None)
    函数调用表达式的值

    凡是函数功能会产生数据,或者想要给调用者返回信息的时候,都需要返回值

    (4.函数的调用过程
    a.回到函数声明的位置
    b.用实参给形参赋值
    c.执行函数体
    d.遇到return 或者函数体执行完,将返回值返回给调用者
    e.回到函数调用的位置(调用表达式的值是返回值),接着往下执行

    (5.函数作为变量

    (6.匿名函数
    函数名 = lambda 参数列表:返回值(不需要return)
    函数名(实参)

    (7.递归(了解)

    (8.yeild函数(迭代器和生成器)


    3.文件操作
    打开文件-操作文件-关闭文件
    open()、colse() \ with open() as
    read()
    wirte()

    打开方式:'r','rb'\ 'w','wr','a'

    json文件的操作
    json内置模块,load,drump
    loads\drumps


    4.异常捕获

    try:
    需要捕获异常的代码
    except: -- 捕获所有的异常
    出现异常执行的代码

    try:
    需要捕获异常的代码
    except(异常类型1,异常类型2):
    出现异常执行的代码

    try:
    需要捕获异常的代码
    except 异常类型1:
    代码块1
    except 异常类型2:
    代码块2
    except:
    代码块3

    try-except-finally
    """

    
    def func2(*nums):
    
        print(sum(nums))
    
    def func1(*numbers):
    
        print(numbers)
        func2(*numbers)
    
    
    if __name__ == '__main__':
    
        func1(1, 2, 3)
    
        number = {11, 21, 33}
        print(number, *number)
    
        dict1 = {'a': 12, 'b': [
            {'aa': 1, 'bb': 2},
            {'aa': 100, 'bb': 200}
        ]}
        # 这个是个列表
        list_b = dict1['b']
        # 这个是一个字典
        dict_1 = list_b[1]
        # dict1['b'].append
        # dict1['b'].remove
        # dict1['b'][]
        print(dict1['b'][1]['bb'])
    

    1. pygame事件

    if __name__ == '__main__':
        pygame.init()
        screen = pygame.display.set_mode((600, 400))
        screen.fill((255, 255, 255))
        # 设置窗口标题
        pygame.display.set_caption('游戏事件')
    
        pygame.display.flip()
    
        """
        QUIT:关闭按钮被点击事件
        MOUSEBUTTONDOWN: 鼠标按下事件
        MOUSEBUTTONUP: 鼠标按下弹起
        MOUSEMOTION:鼠标移动
        鼠标相关事件关心事件产生的位置
        
        KEYDOWN: 键盘按下
        KEYUP: 键盘弹起
        """
        while True:
            # 每次循环检测有没有事件发生
            for event in pygame.event.get():
                # 不同类型的事件对应的type值不一样
                if event.type == pygame.QUIT:
                    exit()
    
                # 鼠标相关事件
                # pos属性,获取鼠标事件产生的位置
                if event.type == pygame.MOUSEBUTTONDOWN:
                    print('鼠标按下', event.pos)
    
                if event.type == pygame.MOUSEBUTTONUP:
                    print('鼠标弹起', event.pos)
    
                if event.type == pygame.MOUSEMOTION:
                    print('鼠标移动', event.pos)
    
                # 键盘相关事件
                # key属性,被按的按键对应的值的编码
                if event.type == pygame.KEYDOWN:
                    print('键盘按键被按下',chr(event.key))
    
                if event.type == pygame.KEYUP:
                    print('键盘按钮弹起', chr(event.key))
    

    2.鼠标事件的应用

    if __name__ == '__main__':
        pygame.init()
        screen = pygame.display.set_mode((600, 400))
        screen.fill((255, 255, 255))
        # 设置窗口标题
        pygame.display.set_caption('游戏事件')
    
        pygame.display.flip()
    
        """
        QUIT:关闭按钮被点击事件
        MOUSEBUTTONDOWN: 鼠标按下事件
        MOUSEBUTTONUP: 鼠标按下弹起
        MOUSEMOTION:鼠标移动
        鼠标相关事件关心事件产生的位置
        
        KEYDOWN: 键盘按下
        KEYUP: 键盘弹起
        """
        while True:
            # 每次循环检测有没有事件发生
            for event in pygame.event.get():
                # 不同类型的事件对应的type值不一样
                if event.type == pygame.QUIT:
                    exit()
    
                # 鼠标相关事件
                # pos属性,获取鼠标事件产生的位置
                if event.type == pygame.MOUSEBUTTONDOWN:
                    print('鼠标按下', event.pos)
    
                if event.type == pygame.MOUSEBUTTONUP:
                    print('鼠标弹起', event.pos)
    
                if event.type == pygame.MOUSEMOTION:
                    print('鼠标移动', event.pos)
    
                # 键盘相关事件
                # key属性,被按的按键对应的值的编码
                if event.type == pygame.KEYDOWN:
                    print('键盘按键被按下',chr(event.key))
    
                if event.type == pygame.KEYUP:
                    print('键盘按钮弹起', chr(event.key))
    

    3. 鼠标事件的应用2

    # 要求:先在屏幕上显示一张图片,鼠标按下移动的时候,拽着图片跟着一起动。鼠标弹起就不动了
    import pygame
    
    
    # 写一个函数,判断一个点是否在某个范围内
    # 点(x,y)
    # 范围 rect(x,y,w,h)
    def is_in_rect(pos, rect):
        x, y = pos
        rx, ry, rw, rh = rect
        if (rx <= x <= rx+rw) and (ry <= y <= ry+rh):
            return True
        return False
    
    
    if __name__ == '__main__':
        pygame.init()
        screen = pygame.display.set_mode((600, 400))
        screen.fill((255, 255, 255))
        pygame.display.set_caption('图片拖拽')
    
        # 显示一张图片
        image = pygame.image.load('./luffy2.png')
        image_x = 100
        image_y = 100
        screen.blit(image,(image_x, image_y))
        pygame.display.flip()
    
        # 用来存储图片是否可以移动
        is_move = False
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
    
                # 鼠标按下,让状态变成可以移动
                if event.type == pygame.MOUSEBUTTONDOWN:
                    w,h = image.get_size()
                    if is_in_rect(event.pos, (image_x, image_y, w, h)):
                        is_move = True
    
                # 鼠标弹起,让状态变成不可以移动
                if event.type == pygame.MOUSEBUTTONUP:
                    is_move = False
    
    
                # 鼠标移动对应的事件
                if event.type == pygame.MOUSEMOTION:
                    if is_move:
                        screen.fill((255, 255, 255))
                        x, y = event.pos
                        image_w, image_h = image.get_size()
                        # 保证鼠标在图片的中心
                        image_y = y-image_h/2
                        image_x = x-image_w/2
                        screen.blit(image, (image_x, image_y))
                        pygame.display.update()
    
    
    

    4. 动画效果

    
    """
    动画原理:不断的刷新界面上的内容(一帧一帧的画)
    """
    import pygame
    from random import randint
    
    
    def static_page(screen):
        """
        页面上的静态内容
        """
        # 静态文字
        font = pygame.font.SysFont('Times', 40)
        title = font.render('Welcome', True, (0, 0, 0))
        screen.blit(title, (200, 200))
    
    def animation_title(screen):
        """
        字体颜色发生改变
        """
        font = pygame.font.SysFont('Times', 40)
        title = font.render('Python', True, (randint(0,255), randint(0,255), randint(0,255)))
        screen.blit(title, (100, 100))
    
    
    if __name__ == '__main__':
        pygame.init()
        screen = pygame.display.set_mode((600, 400))
        screen.fill((255, 255, 255))
    
        static_page(screen)
    
        pygame.display.flip()
    
        while True:
            # for里面的代码只有事件发生后才会执行
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
    
            # 在下面去写每一帧要显示的内容
            """程序执行到这个位置,cup休息一段时间再执行后面的代码(线程在这儿阻塞指定的时间)
            单位:毫秒  (1000ms == 1s)
            """
            pygame.time.delay(60)
    
            # 动画前要将原来的内容全部清空
            screen.fill((255, 255, 255))
    
            static_page(screen)
            animation_title(screen)
    
            # 内容展示完成后,要更新到屏幕上
            pygame.display.update()
    
    
    

    **6.ballgame

    import pygame
    
    
    def draw_ball(place, color, pos):
        """
        画球
        """
        pygame.draw.circle(place, color, pos, 20)
    
    # 方向对应的key值
    Up = 273
    Down = 274
    Left = 276
    Right = 275
    
    if __name__ == '__main__':
        pygame.init()
        screen = pygame.display.set_mode((600, 400))
        screen.fill((255, 255, 255))
        pygame.display.flip()
    
        # 保存初始坐标
        ball_x = 100
        ball_y = 100
        x_speed = 5
        y_speed = 0
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
    
                # 通过上下左右键控制球的方向
                if event.type == pygame.KEYDOWN:
                    if event.key == Up:
                        y_speed = -5
                        x_speed = 0
                    elif event.key == Down:
                        y_speed = 5
                        x_speed = 0
                    elif event.key == Right:
                        x_speed = 5
                        y_speed = 0
                    elif event.key == Left:
                        x_speed = -5
                        y_speed = 0
    
    
            # 刷新屏幕
            screen.fill((255, 255, 255))
    
            # 每次循环让球的x和y坐标变化
            ball_x += x_speed
            ball_y += y_speed
    
            # 边界检测
            if ball_x + 20 >= 600 or ball_x <= 20 or ball_y + 20 >= 400 or ball_y <= 20:
                print('游戏结束')
                exit()
                # ball_x = 600 -20
                # x_speed *= -1
            draw_ball(screen, (255, 0, 0), (ball_x, ball_y))
    
            pygame.display.update()
    

    6. 多个球一起运动

    import pygame
    
    
    def draw_ball(place, color, pos):
        """
        画球
        """
        pygame.draw.circle(place, color, pos, 20)
    
    # 方向对应的key值
    Up = 273
    Down = 274
    Left = 276
    Right = 275
    
    if __name__ == '__main__':
        pygame.init()
        screen = pygame.display.set_mode((600, 400))
        screen.fill((255, 255, 255))
        pygame.display.flip()
    
        # 保存初始坐标
        ball_x = 100
        ball_y = 100
        x_speed = 5
        y_speed = 0
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
    
                # 通过上下左右键控制球的方向
                if event.type == pygame.KEYDOWN:
                    if event.key == Up:
                        y_speed = -5
                        x_speed = 0
                    elif event.key == Down:
                        y_speed = 5
                        x_speed = 0
                    elif event.key == Right:
                        x_speed = 5
                        y_speed = 0
                    elif event.key == Left:
                        x_speed = -5
                        y_speed = 0
    
    
            # 刷新屏幕
            screen.fill((255, 255, 255))
    
            # 每次循环让球的x和y坐标变化
            ball_x += x_speed
            ball_y += y_speed
    
            # 边界检测
            if ball_x + 20 >= 600 or ball_x <= 20 or ball_y + 20 >= 400 or ball_y <= 20:
                print('游戏结束')
                exit()
                # ball_x = 600 -20
                # x_speed *= -1
            draw_ball(screen, (255, 0, 0), (ball_x, ball_y))
    
            pygame.display.update()
    

    相关文章

      网友评论

          本文标题:Day11-pygame应用

          本文链接:https://www.haomeiwen.com/subject/vanfvftx.html