第十三章实验报告——篮球自动弹跳
代码如下:
1 #----------实例01:制作一个跳跃的小球游戏----------#
2 import sys
3 import pygame
4 pygame.init() #初始化pygame
5 size = width,height = 640,480 #设置窗口
6 screen = pygame.display.set_mode(size) #显示窗口
7 color = (255,255,255) #设置颜色
8
9 ball = pygame.image.load("ball.png") #加载图片
10 ballrect = ball.get_rect() #获取矩形区域
11
12 speed = [5,5]
13 clock = pygame.time.Clock() #设置时钟
14 #执行死循环,确保窗口一直显示
15 while True:
16 clock.tick(60) #每秒执行60次
17 #检查事件
18 for event in pygame.event.get():
19 if event.type ==pygame.QUIT: #如果单击关闭窗口,则退出
20 pygame.quit()
21 sys.exit()
22
23 ballrect = ballrect.move(speed) #移动小球
24 #碰到左右边缘
25 if ballrect.left < 0 or ballrect.right > width:
26 speed[0] = -speed[0]
27 # 碰到上下边缘
28 if ballrect.top < 0 or ballrect.bottom > height:
29 speed[1] = -speed[1]
30 screen.fill(color) #填充颜色
31 screen.blit(ball, ballrect) #将图片画到窗口
32 pygame.display.flip() #更新全部显示
代码运行结果如下:
开发Flappy Bird游戏
代码如下:
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 #定义鸟的三种状态列表
10 self.birdStatus = [pygame.image.load("assert/1.png"),pygame.image.load("assert/2.png"),pygame.image.load("assert/dead.png")]
11 self.status = 0 #默认飞行状态
12 self.birdX = 120 #鸟所在的X轴坐标
13 self.birdY = 350 #鸟所在的Y轴坐标,即上下飞行的高度
14 self.jump = False #默认情况小鸟自动下落
15 self.jumpSpeed = 10 #跳跃高度
16 self.gravity = 5 #重力
17 self.dead = False #默认小鸟生命状态为活着
18 def birdUpgrate(self):
19 """定义移动方法"""
20 if self.jump:
21 #小鸟跳跃
22 self.jumpSpeed -= 1 #速度递减,上升越来越慢
23 self.birdY -= self.jumpSpeed #鸟的Y轴坐标减小,小鸟上升
24 else:
25 #小鸟坠落
26 self.gravity += 0.2 #重力递增,下降越来越快
27 self.birdY += self.gravity #鸟的Y轴坐标增加,小鸟下降
28 self.birdRect[1] =self.birdY #更改Y轴的位置
29 class Pipeline(object):
30 """定义一个管道类"""
31 def __init__(self):
32 """定义初始化方法"""
33 self.wallx = 400 #管道在x轴坐标
34 self.pineUp = pygame.image.load("assert/top.png")
35 self.pineDown = pygame.image.load("assert/bottom.png")
36 def updatePipeline(self):
37 """管道移动方法"""
38 self.wallx -= 5 #管道X轴坐标递减,即管道向左移动
39 #当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
40 if self.wallx <-80:
41 global score
42 score += 1
43 self.wallx = 400
44
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.birdUpgrate() #鸟移动
60 screen.blit(font.render('Score:'+ str(score),-1,(255,255,255)),(100,50)) #设置颜色及坐标位置
61 pygame.display.update() #更新显示
62 def checkDead():
63 "检测小鸟是否死亡"
64 upRect = pygame.Rect(Pipeline.wallx,-300,Pipeline.pineUp.get_width(),Pipeline.pineUp.get_height())
65 downRect = pygame.Rect(Pipeline.wallx,500, Pipeline.pineDown.get_width()-10, Pipeline.pineDown.get_height())
66 #检测小鸟与上下方管子是否碰撞
67 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
68 Bird.dead = True
69 #检测小鸟是否飞出上下边界
70 if not 0 < Bird.birdRect[1] < height:
71 Bird.dead = True
72 return True
73 else:
74 return False
75 def getResult():
76 """获取总分"""
77 final_text1 = "Game Over"
78 final_text2 = "Your final score is :"+str(score)
79 ft1_font = pygame.font.SysFont("Arial",70) #设置第一行文字字体
80 ft1_surf = font.render(final_text1,1,(242,3,36)) #设置第一行文字字体颜色
81 ft2_font = pygame.font.SysFont("Arial",50) #设置第二行文字字体
82 ft2_surf = font.render(final_text2,1,(253,177,6)) #设置第二行文字字体颜色
83 screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
84 screen.blit(ft2_surf, [screen.get_width()/2-ft2_surf.get_width()/2,200])
85 pygame.display.update()
86
87 if __name__ =='__main__':
88 """主程序"""
89 pygame.init() #初始化pygame
90 pygame.font.init() #初始化字体类
91 font = pygame.font.SysFont(None,50)
92 size = width,height = 400,650 #设置窗口
93 screen = pygame.display.set_mode(size) #显示窗口
94 clock = pygame.time.Clock() #设置时钟
95 Pipeline = Pipeline() #实例化管道类
96 Bird = Bird() #实例化鸟类
97 score = 0 #得分
98 while True:
99 clock.tick(60) #每秒执行60次
100 #轮询事件
101 for event in pygame.event.get():
102 if event.type == pygame.QUIT:#如果单击关闭窗口,则退出
103 pygame.quit()
104 sys.exit()
105 if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
106 Bird.jump = True
107 Bird.gravity = 5
108 Bird.jumpSpeed = 10
109 background = pygame.image.load("assert/background.png") #加载背景图片
110 if checkDead():
111 getResult()
112 else:
113 createMap() #创建地图
代码运行结果如下: