前文
相信大家肯定玩过或见过这个游戏,我之前也一直在手机上玩flappy bird游戏,闲暇时间就编写了一个
是采用python3+pygame模块制作而成的,运行效果非常流畅,会让你大吃一惊哦!^_^
一、运行效果展示
下载游戏之后,注意在自己的python环境中安装pygame模块,如果没有安装可以使用pip install pygame 进行安装
然后使用使用命令运行起这个.py文件,运行之后的第一个界面效果如下,是不是很酷炫
当点击上图中的“Play”按钮之后的效果如下:
运行之后是有音乐的,大家可以下载代码的时候一起将素材下载,这样就在运行时就能听到音乐
二、完整代码
下面代码用到了素材(背景图片,音乐等,下载地址:点击)
1 import math
2 import os
3 import time
4 from random import randint
5 from random import uniform
6 import pygame
7 from pygame.locals import * #导入一些常用的变量
8 from collections import deque#加入了队列
9
10 FPS = 60
11 BK_WIDTH = 900 #背景宽度
12 BK_HEIGHT = 650 #背景高度
13 PIPE_WIDTH = 80 #水管的宽度
14 PIPE_HEIGHT = 10 #水管素材的高度
15 PIPE_HEAD_HEIGHT = 32#管子头的高度
16
17 #初始化全局变量
18 BK_MOVE_SPEED = 0.22#主柱子每毫秒移动的速度
19 ADD_TIME = 2500##每隔多少毫秒就增加一个柱子 这种方法不会有漏洞吗 就是当毫秒数和帧数不匹配啥的 #还需要仔细的思考
20 TOTAL_PIPE_BODY = int(3/5 * BK_HEIGHT) # 像素值必须为整数 占窗口的3/5
21 PIPE_RATE =0.96
22 a_i="bird-wingup"
23 b_i="bird-wingmid"
24 c_i="bird-wingdown"
25
26 INITAL_SPEED = -0.37#鸟的Y轴初速度
27 BIRD_WIDTH = 50
28 BIRD_HEIGHT = 40
29 BIRD_INIT_SCORE = 7#鸟的初始通关分数
30
31 STONE_ADD_TIME = 1000 #每隔多少毫秒就增加一个石头
32 STONE_WIDTH = 40
33 STONE_HEIGHT = 30
34 STONE_LEVEL = 4#石头出现的等级
35
36 BUTTON_WIDTH = 140
37 BUTT0N_HEIGHT = 60
38
39 BULLET_SPEED = 0.32#子弹的速度
40 BULLET_WIETH = 50
41 BULLET_HEIGHT = 30
42 #设置全局变量 方便修改参数
43
44
45 pygame.init()
46 screen = pygame.display.set_mode((BK_WIDTH,BK_HEIGHT))
47 pygame.mixer.init()
48
49 music_lose = pygame.mixer.Sound("lose.wav")
50 music1 = pygame.mixer.Sound("touch.wav")
51 pygame.mixer.music.load("bkm.mp3")
52 font = pygame.font.SysFont('comicsansms', 25)
53
54
55 #用于设置鸟的种类
56 def little_bird(list):
57 global a_i
58 global b_i
59 global c_i
60 a_i=list[0]
61 b_i=list[1]
62 c_i=list[2]
63
64
65 #用于设置关卡难度
66 def seteasy(list):
67 global BK_MOVE_SPEED # 背景每毫秒移动的速度 就是柱子移动的速度
68 global ADD_TIME # 每隔多少毫秒就增加一个柱子
69 global TOTAL_PIPE_BODY # 像素值必须为整数 占窗口的3/5
70 global PIPE_RATE
71 global STONE_LEVEL # 鸟出现的等
72 global BIRD_INIT_SCORE
73
74 BK_MOVE_SPEED = list[0] # 背景每毫秒移动的速度
75 ADD_TIME = list[1] # 每隔多少毫秒就增加一个柱子
76 TOTAL_PIPE_BODY =list[2] # 像素值必须为整数 占窗口的3/5
77 PIPE_RATE = list[3]
78 Pipe.add_time = list[1]
79 BIRD_INIT_SCORE = list[4]
80 STONE_LEVEL = list[5]
81
82
83 #子弹类
84 class Bullet(pygame.sprite.Sprite):
85 speed = BULLET_SPEED
86 width = BULLET_WIETH
87 height = BULLET_HEIGHT
88
89 def __init__(self,bird,images):
90 super(Bullet,self).__init__() #d调用父类的初始函数 使用此方法 可以减少代码的更改量 并且解决了多重继承的问题
91 self.x,self.y = bird.x,bird.y
92 self.bullet = images #给鸟的图片进行赋值
93 self.mask_bullet = pygame.mask.from_surface(self.bullet)
94 def update(self):#计算鸟在下一点的新坐标并更新
95 self.x=self.x+self.speed*frames_to_msec(1)
96 @property
97 def image(self):
98 return self.bullet
99 @property
100 def mask(self):
101 return self.mask_bullet
102 @property
103 def rect(self):
104 return Rect(self.x,self.y,Bullet.width,Bullet.height)
105 def visible(self):
106 return 0<self.x<BK_WIDTH+Bullet.width
107
108
109 #小鸟做竖直上抛运动 当小鸟加速到一定状态时 就不再加速了
110 class Bird(pygame.sprite.Sprite):
111
112 width =BIRD_WIDTH #鸟宽
113 height = BIRD_HEIGHT #鸟长
11