实验13:Pygame游戏编程
一、实验目的和要求
学会Pygame的基本应用
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、制作一个跳跃的小游戏
(1)代码如下:
1 # -*- coding:utf-8 -*-
2 import sys # 导入sys模块
3 import pygame # 导入pygame模块
4
5 pygame.init() # 初始化pygame
6 size = width, height = 640,480 # 设置窗口
7 screen = pygame.display.set_mode(size) # 显示窗口
8 color = (0, 0, 0) # 设置颜色
9
10 ball = pygame.image.load("ball.png") # 加载图片
11 ballrect = ball.get_rect() # 获取矩形区域
12
13 speed = [5, 5] # 设置移动的X轴、Y轴距离
14 clock = pygame.time.Clock() # 设置时钟
15 # 执行死循环,确保窗口一直显示
16 while True:
17 clock.tick(60) # 每秒执行60次
18 # 检查事件
19 for event in pygame.event.get():
20 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
21 pygame.quit() # 退出pygame
22 sys.exit()
23
24 ballrect = ballrect.move(speed) # 移动小球
25 # 碰到左右边缘
26 if ballrect.left < 0 or ballrect.right > width:
27 speed[0] = -speed[0]
28 # 碰到上下边缘
29 if ballrect.top < 0 or ballrect.bottom > height:
30 speed[1] = -speed[1]
31
32 screen.fill(color) # 填充颜色
33 screen.blit(ball, ballrect) # 将图片画到窗口上
34 pygame.display.flip() # 更新全部显示
(2)运行结果如图所示:
2、开发Flappy Bird游戏
(1)代码如下:
1 import pygame
2 import sys
3 import random
4
5 class Bird(object):
6 """定义一个鸟类"""
7 def __init__(self):
8 """定义初始化方法"""
9 self.birdRect = pygame.Rect(65,50,50,50) #鸟的矩形
10 #定义鸟的3种状态列表
11 self.birdStatus = [pygame.image.load("1.png"),
12 pygame.image.load("2.png"),
13 pygame.image.load("3.png")]
14 self.status = 0 #默认飞行状态
15 self.birdX = 120 #鸟所在X轴坐标
16 self.birdY = 350 #鸟所在Y轴坐标,即上下飞行高度
17 self.jump = False #默认情况小鸟自动降落
18 self.jumpSpeed = 10 #跳跃高度
19 self.gravity = 5 #重力
20 self.dead = False #默认小鸟生命状态为活着
21
22 def birdUpdate(self):
23 if self.jump:
24 #小鸟跳跃
25 self.jumpSpeed -= 1
26 self.birdY -= self.jumpSpeed
27 else:
28 #小鸟坠落
29 self.gravity += 0.2
30 self.birdY += self.gravity
31 self.birdRect[1] = self.birdY
32
33 class Pipeline(object):
34 """定义一个管道类"""
35 def __init__(self):
36 """定义初始化方法"""
37 self.wallx = 400;
38 self.pineUp = pygame.image.load("top.png")
39 self.pineDown = pygame.image.load("bottom.png")
40 def updatePipeline(self):
41 """水平移动"""
42 self.wallx -= 5
43 #当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
44 if self.wallx < -80:
45 global score
46 score += 1
47 self.wallx = 400
48
49 def createMap():
50 """定义地图创建方法"""
51 screen.fill((255,255,255))
52 screen.blit(background,(0,0))
53
54 #显示管道
55 screen.blit(Pipeline.pineUp,(Pipeline.wallx,-300)) #上管道坐标位置
56 screen.blit(Pipeline.pineDown,(Pipeline.wallx,500)) #下管道坐标位置
57 Pipeline.updatePipeline() #管道移动
58
59 #显示小鸟
60 if Bird.dead:
61 Bird.status = 2
62 elif Bird.jump:
63 Bird.status = 0
64 screen.blit(Bird.birdStatus[Bird.status],(Bird.birdX,Bird.birdY)) #设置小鸟坐标
65 Bird.birdUpdate()
66 pygame.display.update()
67
68 #显示分数
69 screen.blit(font.render(" Score:" + str(score),-1,(255,255,255)),(100,50)) #设置颜色及坐标位置
70 pygame.display.update()
71
72 def checkDead():
73 #上方管子的矩形位置
74 upRect = pygame.Rect(Pipeline.wallx,-300,
75 Pipeline.pineUp.get_width() - 10,
76 Pipeline.pineUp.get_height())
77 #下方管子的矩形位置
78 downRect = pygame.Rect(Pipeline.wallx,500,
79 Pipeline.pineDown.get_width() - 10,
80 Pipeline.pineDown.get_height())
81 #检测小鸟与上下方管子是否碰撞
82 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
83 Bird.dead = True
84 return True
85 #检测小鸟是否飞出上下边界
86 if not 0<Bird.birdRect[1]<height:
87 Bird.dead = True
88 return True
89 else:
90 return False
91
92 def getResutl():
93 final_text1 = "Game over"
94 final_text2="Your final score is: "+str(score)
95 ft1_font=pygame.font.SysFont("Arial",70) #设置第一行文字字体
96 ft1_surf=font.render(final_text1,1,(242,3,36)) #设置第一行文字颜色
97 ft2_font=pygame.font.SysFont("Arial",50) #设置第一行文字字体
98 ft2_surf=font.render(final_text2,1,(253,177,6)) #设置第一行文字颜色
99 #设置第一行文字显示位置
100 screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
101 #设置第一行文字显示位置
102 screen.blit(ft2_surf,[screen.get_width()/2-ft2_surf.get_width()/2,200])
103 pygame.display.flip() #更新整个待显示的Surface对象到屏幕上
104
105 if __name__=='__main__':
106 """主程序"""
107 pygame.init()
108 pygame.font.init()
109 font = pygame.font.SysFont(None,50)
110 size = width,height = 400,680
111 screen = pygame.display.set_mode(size)
112 clock = pygame.time.Clock()
113 Pipeline = Pipeline()
114 Bird = Bird()
115 score = 0
116 while True:
117 clock.tick(60)
118 #轮询事件
119 for event in pygame.event.get():
120 if event.type == pygame.QUIT:
121 pygame.quit()
122 sys.exit()
123 if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
124 Bird.jump = True
125 Bird.gravity = 5
126 Bird.jumpSpeed = 10
127 background = pygame.image.load("background.png") #加载背景图片
128 if checkDead(): #检测小鸟生命状态
129 getResutl() #如果小鸟死亡,显示游戏总分
130 else:
131 createMap() #创建地图
(2)运行结果如图所示:
一、实验目的和要求
学会Pygame的基本应用
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、制作一个跳跃的小游戏
(1)代码如下:
1 # -*- coding:utf-8 -*-
2 import sys # 导入sys模块
3 import pygame # 导入pygame模块
4
5 pygame.init() # 初始化pygame
6 size = width, height = 640,480 # 设置窗口
7 screen = pygame.display.set_mode(size) # 显示窗口
8 color = (0, 0, 0) # 设置颜色
9
10 ball = pygame.image.load("ball.png") # 加载图片
11 ballrect = ball.get_rect() # 获取矩形区域
12
13 speed = [5, 5] # 设置移动的X轴、Y轴距离
14 clock = pygame.time.Clock() # 设置时钟
15 # 执行死循环,确保窗口一直显示
16 while True:
17 clock.tick(60) # 每秒执行60次
18 # 检查事件
19 for event in pygame.event.get():
20 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
21 pygame.quit() # 退出pygame
22 sys.exit()
23
24 ballrect = ballrect.move(speed) # 移动小球
25 # 碰到左右边缘
26 if ballrect.left < 0 or ballrect.right > width:
27 speed[0] = -speed[0]
28 # 碰到上下边缘
29 if ballrect.top < 0 or ballrect.bottom > height:
30 speed[1] = -speed[1]
31
32 screen.fill(color) # 填充颜色
33 screen.blit(ball, ballrect) # 将图片画到窗口上
34 pygame.display.flip() # 更新全部显示
(2)运行结果如图所示:
2、开发Flappy Bird游戏
(1)代码如下:
1 import pygame
2 import sys
3 import random
4
5 class Bird(object):
6 """定义一个鸟类"""
7 def __init__(self):
8 """定义初始化方法"""
9 self.birdRect = pygame.Rect(65,50,50,50) #鸟的矩形
10 #定义鸟的3种状态列表
11 self.birdStatus = [pygame.image.load("1.png"),
12 pygame.image.load("2.png"),
13 pygame.image.load("3.png")]
14 self.status = 0 #默认飞行状态
15 self.birdX = 120 #鸟所在X轴坐标
16 self.birdY = 350 #鸟所在Y轴坐标,即上下飞行高度
17 self.jump = False #默认情况小鸟自动降落
18 self.jumpSpeed = 10 #跳跃高度
19 self.gravity = 5 #重力
20 self.dead = False #默认小鸟生命状态为活着
21
22 def birdUpdate(self):
23 if self.jump:
24 #小鸟跳跃
25 self.jumpSpeed -= 1
26 self.birdY -= self.jumpSpeed
27 else:
28 #小鸟坠落
29 self.gravity += 0.2
30 self.birdY += self.gravity
31 self.birdRect[1] = self.birdY
32
33 class Pipeline(object):
34 """定义一个管道类"""
35 def __init__(self):
36 """定义初始化方法"""
37 self.wallx = 400;
38 self.pineUp = pygame.image.load("top.png")
39 self.pineDown = pygame.image.load("bottom.png")
40 def updatePipeline(self):
41 """水平移动"""
42 self.wallx -= 5
43 #当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
44 if self.wallx < -80:
45 global score
46 score += 1
47 self.wallx = 400
48
49 def createMap():
50 """定义地图创建方法"""
51 screen.fill((255,255,255))
52 screen.blit(background,(0,0))
53
54 #显示管道
55 screen.blit(Pipeline.pineUp,(Pipeline.wallx,-300)) #上管道坐标位置
56 screen.blit(Pipeline.pineDown,(Pipeline.wallx,500)) #下管道坐标位置
57 Pipeline.updatePipeline() #管道移动
58
59 #显示小鸟
60 if Bird.dead:
61 Bird.status = 2
62 elif Bird.jump:
63 Bird.status = 0
64 screen.blit(Bird.birdStatus[Bird.status],(Bird.birdX,Bird.birdY)) #设置小鸟坐标
65 Bird.birdUpdate()
66 pygame.display.update()
67
68 #显示分数
69 screen.blit(font.render(" Score:" + str(score),-1,(255,255,255)),(100,50)) #设置颜色及坐标位置
70 pygame.display.update()
71
72 def checkDead():
73 #上方管子的矩形位置
74 upRect = pygame.Rect(Pipeline.wallx,-300,
75 Pipeline.pineUp.get_width() - 10,
76 Pipeline.pineUp.get_height())
77 #下方管子的矩形位置
78 downRect = pygame.Rect(Pipeline.wallx,500,
79 Pipeline.pineDown.get_width() - 10,
80 Pipeline.pineDown.get_height())
81 #检测小鸟与上下方管子是否碰撞
82 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
83 Bird.dead = True
84 return True
85 #检测小鸟是否飞出上下边界
86 if not 0<Bird.birdRect[1]<height:
87 Bird.dead = True
88 return True
89 else:
90 return False
91
92 def getResutl():
93 final_text1 = "Game over"
94 final_text2="Your final score is: "+str(score)
95 ft1_font=pygame.font.SysFont("Arial",70) #设置第一行文字字体
96 ft1_surf=font.render(final_text1,1,(242,3,36)) #设置第一行文字颜色
97 ft2_font=pygame.font.SysFont("Arial",50) #设置第一行文字字体
98 ft2_surf=font.render(final_text2,1,(253,177,6)) #设置第一行文字颜色
99 #设置第一行文字显示位置
100 screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
101 #设置第一行文字显示位置
102 screen.blit(ft2_surf,[screen.get_width()/2-ft2_surf.get_width()/2,200])
103 pygame.display.flip() #更新整个待显示的Surface对象到屏幕上
104
105 if __name__=='__main__':
106 """主程序"""
107 pygame.init()
108 pygame.font.init()
109 font = pygame.font.SysFont(None,50)
110 size = width,height = 400,680
111 screen = pygame.display.set_mode(size)
112 clock = pygame.time.Clock()
113 Pipeline = Pipeline()
114 Bird = Bird()
115 score = 0
116 while True:
117 clock.tick(60)
118 #轮询事件
119 for event in pygame.event.get():
120 if event.type == pygame.QUIT:
121 pygame.quit()
122 sys.exit()
123 if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
124 Bird.jump = True
125 Bird.gravity = 5
126 Bird.jumpSpeed = 10
127 background = pygame.image.load("background.png") #加载背景图片
128 if checkDead(): #检测小鸟生命状态
129 getResutl() #如果小鸟死亡,显示游戏总分
130 else:
131 createMap() #创建地图
(2)运行结果如图所示: