• python小游戏-pygame模块


    一、tkinter模块的GUI

      基本上使用tkinter来开发GUI应用需要以下5个步骤:

    1. 导入tkinter模块中我们需要的东西。
    2. 创建一个顶层窗口对象并用它来承载整个GUI应用。
    3. 在顶层窗口对象上添加GUI组件。
    4. 通过代码将这些GUI组件的功能组织起来。
    5. 进入主事件循环(main loop)。

    代码:

     1 import tkinter
     2 import tkinter.messagebox
     3 
     4 def main():
     5     flag = True
     6     #修改标签上的文字
     7     def change_label_text():
     8         nonlocal flag
     9         flag = not flag
    10         color,msg = ('red','hello,world')
    11             if flag else ('blue','Goodbye,world!')
    12         label.config(text=msg, fg=color)
    13     #确认退出
    14     def confirm_to_quit():
    15         if tkinter.messagebox.askokcancel('温馨提示','确认要退出吗?'):
    16             top.quit()
    17 
    18     #创建顶层窗口
    19     top = tkinter.Tk()
    20     #设置窗口大小
    21     top.geometry('240x160')
    22     #设置窗口标题
    23     top.title('小游戏')
    24     #创建标签对象并添加到顶层窗口
    25     label = tkinter.Label(top,text='hello,world!',font = 'Arial -32',fg = 'red')
    26     label.pack(expand = 1)
    27     #创建一个装按钮的容器
    28     panel = tkinter.Frame(top)
    29     #创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
    30     button1 = tkinter.Button(panel,text = '修改',command = change_label_text)
    31     button1.pack(side = 'left')
    32     button2 = tkinter.Button(panel,text = '退出',command = change_label_text)
    33     button2.pack(side = 'right')
    34     panel.pack(side = 'bottom')
    35     #开启主事件循环
    36     tkinter.mainloop()
    37 #主函数
    38 if __name__ == '__main__':
    39     main()
    View Code

    二、pygame的游戏窗口

    制作游戏窗口

     1 import pygame
     2 def main():
     3     # 初始化导入pygame中的模块
     4     pygame.init()
     5     #初始化用于显示的窗口并设置窗口尺寸
     6     screen = pygame.display.set_mode((800,600))
     7     # 设置当前窗口的标题
     8     pygame.display.set_caption('大球吃小球')
     9     running = True
    10     # 开启一个事件 循环处理发生的事件
    11     while running:
    12         for event in pygame.event.get():
    13             if event.type == pygame.QUIT:
    14                 running = False
    15 if __name__ == '__main__':
    16     main()

    运行效果:

     三、往游戏窗口里画一个圆

    通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。需要说明的是,屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0),向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是像素。所谓像素就是屏幕上的一个点,你可以用浏览图片的软件试着将一张图片放大若干倍,就可以看到这些点。pygame中表示颜色用的是色光三原色表示法,即通过一个元组或列表来指定颜色的RGB值,每个值都在0~255之间,因为是每种原色都用一个8位(bit)的值来表示,三种颜色相当于一共由24位构成,这也就是常说的“24位颜色表示法”。

     1 import pygame
     2 def main():
     3     # 初始化导入pygame中的模块
     4     pygame.init()
     5     #初始化用于显示的窗口并设置窗口尺寸
     6     screen = pygame.display.set_mode((800,600))
     7     # 设置当前窗口的标题
     8     pygame.display.set_caption('大球吃小球')
     9 
    10     # 设置窗口的背景色
    11     screen.fill((242,242,242))
    12     # 绘制一个圆,参数分别为:(屏幕,颜色,圆心位置,半径,0表示填充圆)
    13     pygame.draw.circle(screen,(255,0,0),(100,100),30,0)
    14     # 刷新当前窗口
    15     pygame.display.flip()
    16     running = True
    17     # 开启一个事件 循环处理发生的事件
    18     while running:
    19         for event in pygame.event.get():
    20             if event.type == pygame.QUIT:
    21                 running = False
    22 if __name__ == '__main__':
    23     main()

    画了一个圆:

     四、加载图像

    使用pygame中image模块的函数来加载图像,再通过之前获得的窗口对象的blit方法渲染图像。

        ball_image = pygame.image.load("ball.png") 

      # 刷新当前窗口
        pygame.display.flip()

    效果图

    五、实现动画效果

    要让上面代码中的小球动起来,可以将小球的位置用变量来表示,并在循环中修改小球的位置再刷新整个窗口即可。

    import pygame
    def main():
        # 初始化导入pygame中的模块
        pygame.init()
        #初始化用于显示的窗口并设置窗口尺寸
        screen = pygame.display.set_mode((800,600))
        # 设置当前窗口的标题
        pygame.display.set_caption('大球吃小球')
        # 定义变量来表示小球在屏幕上的位置
        x,y = 50,50
        running = True
        # 开启一个事件 循环处理发生的事件
        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
    
            # 设置窗口的背景色
            screen.fill((255, 255, 255))
            # 绘制一个圆,参数分别为:(屏幕,颜色,圆心位置,半径,0表示填充圆)
            pygame.draw.circle(screen,(255,0,0),(x,y),30,0)
            # 刷新当前窗口
            pygame.display.flip()
            # 每隔50毫秒改变小球的位置
            pygame.time.delay(50)
            x,y = x+5,y+5
    
        running = True
    
    if __name__ == '__main__':
        main()

    效果图

     http://ww1.sinaimg.cn/large/0069IOlEly1gepsrb3ndwg30rs0kumxp.gif

    六、加入碰撞检测,做成一个大球吃小球小游戏

    代码

    from enum import Enum,unique
    from math import sqrt
    from random import randint
    import pygame
    
    # unique
    class Color(Enum):
        """颜色配置"""
        RED = (255,0,0)
        GREEN = (0,255,0)
        BLUE = (0,0,255)
        BLACK = (0,0,0)
        WHITE = (255,255,255)
        GRAY = (242,242,242)
    
        #随机获取颜色
        def random_color():
            r = randint(0,255)
            g = randint(0,255)
            b = randint(0,255)
            return (r,g,b)
    class Ball(object):
        """球类"""
        def __init__(self,x,y,radius,sx,sy,color = Color.RED):
            #初始化方法
            self.x = x
            self.y = y
            self.radius = radius
            self.sx = sx
            self.sy = sy
            self.color = color
            self.alive = True
        def move(self,screen):
            """移动"""
            self.x += self.sx
            self.y += self.sy
            if self.x - self.radius <= 0 or self.x + self.radius >= screen.get_width():
                self.sx = -self.sx
            if self.y - self.radius <= 0 or self.y + self.radius >= screen.get_width():
                self.sy = -self.sy
        def eat(self,other):
            """吃其他球"""
            if self.alive and other.alive and self != other:
                dx,dy = self.x - other.x,self.y-other.y
                distance = sqrt(dx**2 + dy ** 2)
                if distance <self.radius+other.radius and self.radius > other.radius:
                    other.alive = False
                    self.radius = self.radius + int(other.radius*0.146)
        def draw(self,screen):
            """在窗口上绘制球"""
            pygame.draw.circle(screen,self.color,(self.x,self.y),self.radius,0)
    
    
    def main():
        balls = []  # 装球的容器
        # 初始化导入pygame中的模块
        pygame.init()
    
        #初始化用于显示的窗口并设置窗口尺寸
        screen = pygame.display.set_mode((800,600))
        # 设置当前窗口的标题
        pygame.display.set_caption('大球吃小球')
    
        running = True
        # 开启一个事件 循环处理发生的事件
        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
            #处理鼠标事件的代码
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                x,y = event.pos# 获取鼠标点击的事件
                radius = randint(10,100)
                sx,sy = randint(-10,10),randint(-10,10)
                color = Color.random_color()
                # 在鼠标点下的位置创建一个球(大小/速度和颜色随机)
                ball = Ball(x,y,radius,sx,sy,color)
                # 将球添加到列表容器中
                balls.append(ball)
    
            # 设置窗口的背景色
            screen.fill((255, 255, 255))
            # 取出容器中被吃掉的球,如果没吃掉就绘制,吃掉了就移除
            for ball in balls:
                if ball.alive:
                    ball.draw(screen)
                else:
                    balls.remove(ball)
    
            # 刷新当前窗口
            pygame.display.flip()
            # 每隔50毫秒改变小球的位置
            pygame.time.delay(50)
            for ball in balls:
                ball.move(screen)
                #检查有没有吃到其它的球
                for other in balls:
                    ball.eat(other)
    
    if __name__ == '__main__':
        main()

    最终效果图:

    点击查看

  • 相关阅读:
    arcgis使用python,做arctoolbox,渔网裁剪gdb里的要素,四等分
    arcgis计算中心点的质心XY,并根据属性Label进行标注。
    arcpy对要素类每个图斑批量出图。
    python安装模块wheel步骤
    arcgis中shp文件的字符串string型字段转换为日期型Date格式。如“20190426”转为“2019/4/26”
    .tar.gz海量遥感影像解压
    python压缩解压文件(天地图切片批量解压缩)
    python读取多层嵌套文件夹中的文件(zip文件嵌套在不同层级的文件夹中)
    使用Binding时关于数据更新的注意事项
    滑动列表底部自动加载下一页。修改旧代码ing
  • 原文地址:https://www.cnblogs.com/ma1998/p/12877560.html
Copyright © 2020-2023  润新知