当前位置:   article > 正文

06_Python游戏编程(Pygame)_制作一 个跳跃的热气球游戏 创建一个游戏窗口,然后在窗口内创建一个热 气球。

制作一 个跳跃的热气球游戏 创建一个游戏窗口,然后在窗口内创建一个热 气球。

本文为转载文章:

图片下载链接

https://pan.baidu.com/s/1nsj3oaR1MFNmQKxyEWqYmQ#list/path=%2F

对着敲一遍语法都会了

本文链接:https://blog.csdn.net/zha6476003/article/details/82940350

安装Pygame

pip install pygame
  1. C:\Users> pip install pygame
  2. Collecting pygame
  3. Downloading https://files.pythonhosted.org/packages/3e/f5/feabd88a2856ec86166a897b62bfad828bfe7a94a27cbd7ebf07fd
  4. 70399/pygame-1.9.4-cp37-cp37m-win_amd64.whl (4.2MB)
  5. 100% |██████████████████████████| 4.2MB 6.6MB/s
  6. Installing collected packages: pygam
  7. Successfully installed pygame-1.9.4

Pygame常用模块

模块名功能
pygame.cdrom访问光驱
pygame.cursors加载光标
pygame.display访问显示设备
pygame.draw绘制形状、线和点
pygame.event管理事件
pygame.font使用字体
pygame.image加载和存储图片
pygame.joystick使用游戏手柄或者类似的东西
pygame.key读取键盘按键
pygame.mixer声音
pygame.mouse鼠标
pygame.movie播放视频
pygame.music播放音频
pygame.overlay访问高级视频叠加
pygame.rect管理矩形区域
pygame.scrap本地剪贴板访问
pygame.sndarray操作声音数据
pygame.sprite操作移动图像
pygame.surface管理图像和屏幕
pygame.surfarray管理点阵图像数据
pygame.time管理时间和帧信息
pygame.transform缩放和移动图像

简单示例:

  1. import pygame
  2. import sys
  3. pygame.init() # 初始化pygame
  4. size = width, height = 320, 240 # 设置窗口大小
  5. screen = pygame.display.set_mode(size) # 显示窗口
  6. while True: # 死循环确保窗口一直显示
  7. for event in pygame.event.get(): # 遍历所有事件
  8. if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
  9. sys.exit()
  10. pygame.quit() # 退出pygame

执行结果:

制作一个跳跃的小球游戏

创建一个游戏窗口,然后在窗口内创建一个小球。以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续运动按照如下步骤实现该功能:

创建游戏窗口

1. 创建一个游戏窗口,宽和高设置为640*480。代码如下:

  1. import sys
  2. import pygame
  3. pygame.init() # 初始化pygame
  4. size = width, height = 640, 480 # 设置窗口大小
  5. screen = pygame.display.set_mode() # 显示窗口

上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块,接下来,设置窗口的宽和高,最后使用display模块显示窗体。

display模块的常用方法

方法名功能
pygame.display.init()初始化display模块
pygame.display.quit()结束display模块
pygame.display.get_init()如果display模块已经被初始化,则返回True
pygame.display.set_mode()初始化一个准备显示的界面
pygame.display.get_surface()获取当前的Surface对象
pygame.display.flip()更新整个待显示的Surface对象到屏幕上
pygame.display.update()更新部分内容显示到屏幕上,如果没有参数,则与flip功能相同(上一条)

保持窗口显示

2. 运行第一步的代码后会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果想要让窗口一直显示,需要使用while True让程序一直执行,此外,还需要设置关闭按钮。具体代码如下:

  1. import pygame
  2. import sys
  3. pygame.init() # 初始化pygame
  4. size = width, height = 320, 240 # 设置窗口大小
  5. screen = pygame.display.set_mode(size) # 显示窗口
  6. while True: # 死循环确保窗口一直显示
  7. for event in pygame.event.get(): # 遍历所有事件
  8. if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
  9. sys.exit()
  10. pygame.quit() # 退出pygame

上述代码中添加了轮询事件检测。pygame.event.get()能够获取事件队列,使用for...in遍历事件,然后根据type属性判断事件类型。这里的事件处理方式与GUI类似,如event.type等于pygame.QUIT表示检测到关闭pygame窗口事件,pygame.KEYDOWN表示键盘按下事件,pygame.MOUSEBUTTONDOWN表示鼠标按下事件等。

加载游戏图片

开发过程中使用的图片

3. 在窗口添加小球。我们先准备好一张ball.png
图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:

  1. import pygame
  2. import sys
  3. pygame.init() # 初始化pygame
  4. size = width, height = 640, 480 # 设置窗口大小
  5. screen = pygame.display.set_mode(size) # 显示窗口
  6. color = (0, 0, 0) # 设置颜色
  7. ball = pygame.image.load('ball.png') # 加载图片
  8. ballrect = ball.get_rect() # 获取矩形区域
  9. while True: # 死循环确保窗口一直显示
  10. for event in pygame.event.get(): # 遍历所有事件
  11. if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
  12. sys.exit()
  13. screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
  14. screen.blit(ball, ballrect) # 将图片画到窗口上
  15. pygame.display.flip() # 更新全部显示
  16. pygame.quit() # 退出pygame

上述代码中使用iamge模块的load()方法加载图片,返回值ball是一个Surface对象。Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surfacepygame.display.set_mode()就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

Surface对象的常用方法

方法名功能
pygame.Surface.blit()将一个图像画到另一个图像上
pygame.Surface.convert()转换图像的像素格式
pygame.Surface.convert_alpha()转化图像的像素格式,包含alpha通道的转换
pygame.Surface.fill()使用颜色填充Surface
pygame.Surface.get_rect()获取Surface的矩形区域

移动图片

4. 下面让小球动起来,ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以用于移动矩形。move(x, y)函数有两个参数,第一个参数是 X 轴移动的距离,第二个参数是 Y 轴移动的距离。窗口的左上角是(0, 0),如果是move(100, 50)就是左移100下移50。

为实现小球不停移动,将move()函数添加到while循环内,具体代码如下:

  1. import pygame
  2. import sys
  3. pygame.init() # 初始化pygame
  4. size = width, height = 640, 480 # 设置窗口大小
  5. screen = pygame.display.set_mode(size) # 显示窗口
  6. color = (0, 0, 0) # 设置颜色
  7. ball = pygame.image.load('ball.png') # 加载图片
  8. ballrect = ball.get_rect() # 获取矩形区域
  9. speed = [5, 5] # 设置移动的X轴、Y轴
  10. while True: # 死循环确保窗口一直显示
  11. for event in pygame.event.get(): # 遍历所有事件
  12. if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
  13. sys.exit()
  14. ballrect = ballrect.move(speed) # 移动小球
  15. screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
  16. screen.blit(ball, ballrect) # 将图片画到窗口上
  17. pygame.display.flip() # 更新全部显示
  18. pygame.quit() # 退出pygame

碰撞检测

5. 运行上述代码,发现小球在屏幕中一闪而过,此时,小球并没有真正消失,而是移动到窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向,具体代码如下:

  1. import pygame
  2. import sys
  3. pygame.init() # 初始化pygame
  4. size = width, height = 640, 480 # 设置窗口大小
  5. screen = pygame.display.set_mode(size) # 显示窗口
  6. color = (0, 0, 0) # 设置颜色
  7. ball = pygame.image.load('ball.png') # 加载图片
  8. ballrect = ball.get_rect() # 获取矩形区域
  9. speed = [5, 5] # 设置移动的X轴、Y轴
  10. while True: # 死循环确保窗口一直显示
  11. for event in pygame.event.get(): # 遍历所有事件
  12. if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
  13. sys.exit()
  14. ballrect = ballrect.move(speed) # 移动小球
  15. # 碰到左右边缘
  16. if ballrect.left < 0 or ballrect.right > width:
  17. speed[0] = -speed[0]
  18. # 碰到上下边缘
  19. if ballrect.top < 0 or ballrect.bottom > height:
  20. speed[1] = -speed[1]
  21. screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
  22. screen.blit(ball, ballrect) # 将图片画到窗口上
  23. pygame.display.flip() # 更新全部显示
  24. pygame.quit() # 退出pygame

上述代码中,添加了碰撞检测功能。如果碰到左右边缘,更改X轴数据为负数,如果碰到上下边缘,更改Y轴数据为负数。

限制移动速度

6. 运行上述代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉,使用pygame的time模块,使用pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次。

  1. import pygame
  2. import sys
  3. pygame.init() # 初始化pygame
  4. size = width, height = 640, 480 # 设置窗口大小
  5. screen = pygame.display.set_mode(size) # 显示窗口
  6. color = (0, 0, 0) # 设置颜色
  7. ball = pygame.image.load('ball.png') # 加载图片
  8. ballrect = ball.get_rect() # 获取矩形区域
  9. speed = [5, 5] # 设置移动的X轴、Y轴
  10. clock = pygame.time.Clock() # 设置时钟
  11. while True: # 死循环确保窗口一直显示
  12. clock.tick(60) # 每秒执行60
  13. for event in pygame.event.get(): # 遍历所有事件
  14. if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
  15. sys.exit()
  16. ballrect = ballrect.move(speed) # 移动小球
  17. # 碰到左右边缘
  18. if ballrect.left < 0 or ballrect.right > width:
  19. speed[0] = -speed[0]
  20. # 碰到上下边缘
  21. if ballrect.top < 0 or ballrect.bottom > height:
  22. speed[1] = -speed[1]
  23. screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
  24. screen.blit(ball, ballrect) # 将图片画到窗口上
  25. pygame.display.flip() # 更新全部显示
  26. pygame.quit() # 退出pygame

开发Flappy Bird游戏

Flappy Bird是一款鸟类飞行游戏,一根手指操控按下小鸟上飞。

分析
在Flappy Bird游戏中,主要有两个对象:小鸟、管道。可以创建Brid类和Pineline类来分别表示这两个对象。小鸟可以通过上下移动来躲避管道,所以在Brid类中创建一个bridUpdate()方法,实现小鸟的上下移动,为了体现小鸟向前飞行的特征,可以让管道一直向左侧移动,这样在窗口中就好像小鸟在向前飞行。所以在Pineline类中也创建一个updatePipeline()方法,实现管道的向左侧移动。此外还创建了3个函数:createMap()函数用于绘制地图;checkDead()函数用于判断小鸟的生命状态;getResult()函数用于获取最终分数。最后在主逻辑中实例化并调用相关方法,实现相应的功能。

搭建主框架

  1. # -*- coding:utf-8 -*-
  2. import sys # 导入sys模块
  3. import pygame # 导入pygame模块
  4. import random
  5. class Bird(object):
  6. """定义一个鸟类"""
  7. def __init__(self):
  8. """定义初始化方法"""
  9. pass
  10. def birdUpdate(self):
  11. pass
  12. class Pipeline(object):
  13. """定义一个管道类"""
  14. def __init__(self):
  15. """定义初始化方法"""
  16. def updatePipeline(self):
  17. """水平移动"""
  18. def createMap():
  19. """定义创建地图的方法"""
  20. screen.fill((255, 255, 255)) # 填充颜色(screen还没定义不要着急)
  21. screen.blit(background, (0, 0)) # 填入到背景
  22. pygame.display.update() # 更新显示
  23. if __name__ == '__main__':
  24. pygame.init() # 初始化pygame
  25. size = width, height = 400, 650 # 设置窗口大小
  26. screen = pygame.display.set_mode(size) # 显示窗口
  27. clock = pygame.time.Clock() # 设置时钟
  28. Pipeline = Pipeline() # 实例化管道类
  29. while True:
  30. clock.tick(60) # 每秒执行60次
  31. # 轮询事件
  32. for event in pygame.event.get():
  33. if event.type == pygame.QUIT: # 如果检测到事件是关闭窗口
  34. sys.exit()
  35. background = pygame.image.load("assets/background.png") # 加载背景图片
  36. createMap()
  37. pygame.quit() # 退出

执行结果:

开发过程中使用的图片

创建小鸟类、创建管道类、计算得分、碰撞检测

  1. import pygame
  2. import sys
  3. import random
  4. class Bird(object):
  5. """定义一个鸟类"""
  6. def __init__(self):
  7. """定义初始化方法"""
  8. self.birdRect = pygame.Rect(65, 50, 50, 50) # 鸟的矩形
  9. # 定义鸟的3种状态列表
  10. self.birdStatus = [pygame.image.load("assets/1.png"),
  11. pygame.image.load("assets/2.png"),
  12. pygame.image.load("assets/dead.png")]
  13. self.status = 0 # 默认飞行状态
  14. self.birdX = 120 # 鸟所在X轴坐标,即是向右飞行的速度
  15. self.birdY = 350 # 鸟所在Y轴坐标,即上下飞行高度
  16. self.jump = False # 默认情况小鸟自动降落
  17. self.jumpSpeed = 10 # 跳跃高度
  18. self.gravity = 5 # 重力
  19. self.dead = False # 默认小鸟生命状态为活着
  20. def birdUpdate(self):
  21. if self.jump:
  22. # 小鸟跳跃
  23. self.jumpSpeed -= 1 # 速度递减,上升越来越慢
  24. self.birdY -= self.jumpSpeed # 鸟Y轴坐标减小,小鸟上升
  25. else:
  26. # 小鸟坠落
  27. self.gravity += 0.2 # 重力递增,下降越来越快
  28. self.birdY += self.gravity # 鸟Y轴坐标增加,小鸟下降
  29. self.birdRect[1] = self.birdY # 更改Y轴位置
  30. class Pipeline(object):
  31. """定义一个管道类"""
  32. def __init__(self):
  33. """定义初始化方法"""
  34. self.wallx = 400 # 管道所在X轴坐标
  35. self.pineUp = pygame.image.load("assets/top.png")
  36. self.pineDown = pygame.image.load("assets/bottom.png")
  37. def updatePipeline(self):
  38. """"管道移动方法"""
  39. self.wallx -= 5 # 管道X轴坐标递减,即管道向左移动
  40. # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
  41. if self.wallx < -80:
  42. global score
  43. score += 1
  44. self.wallx = 400
  45. def createMap():
  46. """定义创建地图的方法"""
  47. screen.fill((255, 255, 255)) # 填充颜色
  48. screen.blit(background, (0, 0)) # 填入到背景
  49. # 显示管道
  50. screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300)) # 上管道坐标位置
  51. screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500)) # 下管道坐标位置
  52. Pipeline.updatePipeline() # 管道移动
  53. # 显示小鸟
  54. if Bird.dead: # 撞管道状态
  55. Bird.status = 2
  56. elif Bird.jump: # 起飞状态
  57. Bird.status = 1
  58. screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 设置小鸟的坐标
  59. Bird.birdUpdate() # 鸟移动
  60. # 显示分数
  61. screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50)) # 设置颜色及坐标位置
  62. pygame.display.update() # 更新显示
  63. def checkDead():
  64. # 上方管子的矩形位置
  65. upRect = pygame.Rect(Pipeline.wallx, -300,
  66. Pipeline.pineUp.get_width() - 10,
  67. Pipeline.pineUp.get_height())
  68. # 下方管子的矩形位置
  69. downRect = pygame.Rect(Pipeline.wallx, 500,
  70. Pipeline.pineDown.get_width() - 10,
  71. Pipeline.pineDown.get_height())
  72. # 检测小鸟与上下方管子是否碰撞
  73. if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
  74. Bird.dead = True
  75. # 检测小鸟是否飞出上下边界
  76. if not 0 < Bird.birdRect[1] < height:
  77. Bird.dead = True
  78. return True
  79. else:
  80. return False
  81. def getResutl():
  82. final_text1 = "Game Over"
  83. final_text2 = "Your final score is: " + str(score)
  84. ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体
  85. ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 设置第一行文字颜色
  86. ft2_font = pygame.font.SysFont("Arial", 50) # 设置第二行文字字体
  87. ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置第二行文字颜色
  88. screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置
  89. screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 设置第二行文字显示位置
  90. pygame.display.flip() # 更新整个待显示的Surface对象到屏幕上
  91. if __name__ == '__main__':
  92. """主程序"""
  93. pygame.init() # 初始化pygame
  94. pygame.font.init() # 初始化字体
  95. font = pygame.font.SysFont("Arial", 50) # 设置字体和大小
  96. size = width, height = 400, 650 # 设置窗口
  97. screen = pygame.display.set_mode(size) # 显示窗口
  98. clock = pygame.time.Clock() # 设置时钟
  99. Pipeline = Pipeline() # 实例化管道类
  100. Bird = Bird() # 实例化鸟类
  101. score = 0
  102. while True:
  103. clock.tick(60) # 每秒执行60次
  104. # 轮询事件
  105. for event in pygame.event.get():
  106. if event.type == pygame.QUIT:
  107. sys.exit()
  108. if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
  109. Bird.jump = True # 跳跃
  110. Bird.gravity = 5 # 重力
  111. Bird.jumpSpeed = 10 # 跳跃速度
  112. background = pygame.image.load("assets/background.png") # 加载背景图片
  113. if checkDead(): # 检测小鸟生命状态
  114. getResutl() # 如果小鸟死亡,显示游戏总分数
  115. else:
  116. createMap() # 创建地图
  117. pygame.quit()

执行结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/168161
推荐阅读
相关标签
  

闽ICP备14008679号