失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【Python游戏】Python实现一个小游戏——愤怒的小鸟 | 附带源码

【Python游戏】Python实现一个小游戏——愤怒的小鸟 | 附带源码

时间:2019-09-06 02:40:27

相关推荐

【Python游戏】Python实现一个小游戏——愤怒的小鸟 | 附带源码

相关文件

想学Python的小伙伴可以关注小编的公众号【Python日志】

有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!

需要源码的小伙伴可以在公众号回复愤怒的小鸟

Python源码、问题解答学习交流群:773162165

开发环境

Python版本:3.6.7

相关模块:

pygame

random

modules

random

sys

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

开始界面

游戏界面

闯关成功

闯关失败

代码实现

游戏主程序

def main(cfg):# 初始化pygame.init()pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1, 0.0)screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('愤怒的小鸟 公众号:Python日志 问题解答学习交流群:773162165 ')# 开始游戏def startgame():game_levels = GameLevels(cfg, screen)game_levels.start()# 退出游戏def quitgame():pygame.quit()sys.exit()# 开始界面components = pygame.sprite.Group()title_label = Label(screen, 700, 100, 400, 200)title_label.addtext('ANGRY BIRDS', 80, cfg.FONTPATH['arfmoochikncheez'], (236, 240, 241))components.add(title_label)start_btn = Button(screen, 500, 400, 300, 100, startgame, (244, 208, 63), (247, 220, 111))start_btn.addtext('START GAME', 60, cfg.FONTPATH['arfmoochikncheez'], cfg.BACKGROUND_COLOR)components.add(start_btn)quit_btn = Button(screen, 1000, 400, 300, 100, quitgame, (241, 148, 138), (245, 183, 177))quit_btn.addtext('QUIT', 60, cfg.FONTPATH['arfmoochikncheez'], cfg.BACKGROUND_COLOR)components.add(quit_btn)charles_label = Label(screen, cfg.SCREENSIZE[0] - 300, cfg.SCREENSIZE[1] - 80, 300, 100)charles_label.addtext('CHARLES', 60, cfg.FONTPATH['arfmoochikncheez'], (41, 41, 41))components.add(charles_label)clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:quitgame()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_q:quitgame()elif event.type == pygame.MOUSEBUTTONDOWN:if start_btn.selected():start_btn.action()elif quit_btn.selected():quit_btn.action()screen.fill(cfg.BACKGROUND_COLOR)for component in components: component.draw()pygame.display.update()clock.tick(cfg.FPS)

猪类

class Pig(pygame.sprite.Sprite):def __init__(self, screen, imagepaths, loc_info, velocity=None, **kwargs):pygame.sprite.Sprite.__init__(self)assert len(loc_info) == 3assert len(imagepaths) == 3# 设置必要的属性常量self.screen = screenself.loc_info = list(loc_info)self.imagepaths = imagepathsself.velocity = VelocityVector() if velocity is None else velocityself.type = 'pig'self.is_dead = Falseself.elasticity = 0.8self.switch_freq = 20self.animate_count = 0self.inverse_friction = 0.99self.gravity = VelocityVector(0.2, math.pi)# 屏幕大小self.screen_size = screen.get_rect().sizeself.screen_size = (self.screen_size[0], self.screen_size[1] - 50)# 导入图像self.pig_images = []for imagepath in imagepaths: self.pig_images.append(pygame.image.load(imagepath))# 设置当前图像self.image = random.choice(self.pig_images[:2])'''画到屏幕上'''def draw(self):self.animate_count += 1if (self.animate_count % self.switch_freq == 0) and (not self.is_dead):self.animate_count = 0self.image = random.choice(self.pig_images[:2])position = self.loc_info[0] - self.loc_info[2], self.loc_info[1] - self.loc_info[2]self.screen.blit(self.image, position)'''移动猪'''def move(self):# 根据重力改变猪的速度向量self.velocity = VectorAddition(self.velocity, self.gravity)self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle)self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle)self.velocity.magnitude *= self.inverse_friction# 宽度超出屏幕if self.loc_info[0] > self.screen_size[0] - self.loc_info[2]:self.loc_info[0] = 2 * (self.screen_size[0] - self.loc_info[2]) - self.loc_info[0]self.velocity.angle *= -1self.velocity.magnitude *= self.elasticityelif self.loc_info[0] < self.loc_info[2]:self.loc_info[0] = 2 * self.loc_info[2] - self.loc_info[0]self.velocity.angle *= -1self.velocity.magnitude *= self.elasticity# 高度超出屏幕if self.loc_info[1] > self.screen_size[1] - self.loc_info[2]:self.loc_info[1] = 2 * (self.screen_size[1] - self.loc_info[2]) - self.loc_info[1]self.velocity.angle = math.pi - self.velocity.angleself.velocity.magnitude *= self.elasticityelif self.loc_info[1] < self.loc_info[2]:self.loc_info[1] = 2 * self.loc_info[2] - self.loc_info[1]self.velocity.angle = math.pi - self.velocity.angleself.velocity.magnitude *= self.elasticity'''猪死掉了'''def setdead(self):self.is_dead = Trueself.image = self.pig_images[-1]

小鸟类

class Bird(pygame.sprite.Sprite):def __init__(self, screen, imagepaths, loc_info, velocity=None, color=(255, 255, 255), **kwargs):pygame.sprite.Sprite.__init__(self)assert len(loc_info) == 3assert len(imagepaths) == 1# 设置必要的属性常量self.color = colorself.screen = screenself.loc_info = list(loc_info)self.imagepaths = imagepathsself.velocity = VelocityVector() if velocity is None else velocityself.type = 'bird'self.fly_path = []self.is_dead = Falseself.elasticity = 0.8self.is_loaded = Falseself.is_selected = Falseself.inverse_friction = 0.99self.gravity = VelocityVector(0.2, math.pi)# 屏幕大小self.screen_size = screen.get_rect().sizeself.screen_size = (self.screen_size[0], self.screen_size[1] - 50)# 导入图像self.image = pygame.image.load(imagepaths[0])'''画到屏幕上'''def draw(self):if not self.is_loaded:for point in self.fly_path:pygame.draw.ellipse(self.screen, self.color, (point[0], point[1], 3, 3), 1)position = self.loc_info[0] - self.loc_info[2], self.loc_info[1] - self.loc_info[2]self.screen.blit(self.image, position)'''判断有没有被鼠标选中'''def selected(self):pos = pygame.mouse.get_pos()dx, dy = pos[0] - self.loc_info[0], pos[1] - self.loc_info[1]dist = math.hypot(dy, dx)if dist < self.loc_info[2]:return Truereturn False'''加载到弹弓上'''def load(self, slingshot):self.loc_info[0], self.loc_info[1] = slingshot.x, slingshot.yself.is_loaded = True'''重新设置位置'''def reposition(self, slingshot):pos = pygame.mouse.get_pos()if self.selected:self.loc_info[0], self.loc_info[1] = pos[0], pos[1]dx, dy = slingshot.x - self.loc_info[0], slingshot.y - self.loc_info[1]self.velocity.magnitude = min(int(math.hypot(dx, dy) / 2), 80)self.velocity.angle = math.pi / 2 + math.atan2(dy, dx)'''显示发射小鸟的路径'''def projectpath(self):if self.is_loaded:path = []bird = Bird(self.screen, self.imagepaths, self.loc_info, velocity=self.velocity)for i in range(30):bird.move()if i % 5 == 0: path.append((bird.loc_info[0], bird.loc_info[1]))for point in path:pygame.draw.ellipse(self.screen, self.color, (point[0], point[1], 2, 2))'''移动小鸟'''def move(self):# 根据重力改变小鸟的速度向量self.velocity = VectorAddition(self.velocity, self.gravity)self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle)self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle)self.velocity.magnitude *= self.inverse_friction# 宽度超出屏幕if self.loc_info[0] > self.screen_size[0] - self.loc_info[2]:self.loc_info[0] = 2 * (self.screen_size[0] - self.loc_info[2]) - self.loc_info[0]self.velocity.angle *= -1self.velocity.magnitude *= self.elasticityelif self.loc_info[0] < self.loc_info[2]:self.loc_info[0] = 2 * self.loc_info[2] - self.loc_info[0]self.velocity.angle *= -1self.velocity.magnitude *= self.elasticity# 高度超出屏幕if self.loc_info[1] > self.screen_size[1] - self.loc_info[2]:self.loc_info[1] = 2 * (self.screen_size[1] - self.loc_info[2]) - self.loc_info[1]self.velocity.angle = math.pi - self.velocity.angleself.velocity.magnitude *= self.elasticityelif self.loc_info[1] < self.loc_info[2]:self.loc_info[1] = 2 * self.loc_info[2] - self.loc_info[1]self.velocity.angle = math.pi - self.velocity.angleself.velocity.magnitude *= self.elasticity

木块类

class Block(pygame.sprite.Sprite):def __init__(self, screen, imagepaths, loc_info, velocity=None, **kwargs):pygame.sprite.Sprite.__init__(self)assert len(loc_info) == 3assert len(imagepaths) == 2# 设置必要的属性常量self.type = 'block'self.screen = screenself.loc_info = list(loc_info)self.imagepaths = imagepathsself.velocity = VelocityVector() if velocity is None else velocityself.elasticity = 0.7self.is_destroyed = Falseself.inverse_friction = 0.99self.gravity = VelocityVector(0.2, math.pi)# 导入图像self.block_images = []for imagepath in imagepaths: self.block_images.append(pygame.transform.scale(pygame.image.load(imagepath), (100, 100)))# 屏幕大小self.screen_size = screen.get_rect().sizeself.screen_size = (self.screen_size[0], self.screen_size[1] - 50)# 设置当前图像self.image = self.block_images[0]self.rect = self.image.get_rect()self.rotate_angle = math.radians(0)'''画到屏幕上'''def draw(self):pygame.transform.rotate(self.image, self.rotate_angle)self.screen.blit(self.image, (self.loc_info[0] - self.rect.width // 2, self.loc_info[1]))'''设置为损坏状态'''def setdestroy(self):self.is_destroyed = Trueself.image = self.block_images[1]'''移动木块'''def move(self):# 根据重力改变木块的速度向量self.velocity = VectorAddition(self.velocity, self.gravity)self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle)self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle)self.velocity.magnitude *= self.inverse_friction# 宽度超出屏幕if self.loc_info[0] > self.screen_size[0] - self.rect.width:self.loc_info[0] = 2 * (self.screen_size[0] - self.rect.width) - self.loc_info[0]self.velocity.angle *= -1self.rotate_angle = -self.velocity.angleself.velocity.magnitude *= self.elasticityelif self.loc_info[0] < self.rect.width:self.loc_info[0] = 2 * self.rect.width - self.loc_info[0]self.velocity.angle *= -1self.rotate_angle = -self.velocity.angleself.velocity.magnitude *= self.elasticity# 高度超出屏幕if self.loc_info[1] > self.screen_size[1] - self.rect.height:self.loc_info[1] = 2 * (self.screen_size[1] - self.rect.height) - self.loc_info[1]self.velocity.angle = math.pi - self.velocity.angleself.rotate_angle = math.pi - self.velocity.angleself.velocity.magnitude *= self.elasticityelif self.loc_info[1] < self.rect.height:self.loc_info[1] = 2 * self.rect.height - self.loc_info[1]self.velocity.angle = math.pi - self.velocity.angleself.rotate_angle = math.pi - self.velocity.angleself.velocity.magnitude *= self.elasticity

弹弓类

class Slingshot(pygame.sprite.Sprite):def __init__(self, screen, x, y, width, height, color=(66, 73, 73), line_color=(100, 30, 22), **kwargs):pygame.sprite.Sprite.__init__(self)self.x = xself.y = yself.color = colorself.width = widthself.height = heightself.screen = screenself.line_color = line_colorself.type = 'slingshot''''画到屏幕上'''def draw(self, bird=None):pygame.draw.rect(self.screen, self.color, (self.x, self.y + self.height * 1 / 3, self.width, self.height * 2 / 3))if bird is not None and bird.is_loaded:pygame.draw.line(self.screen, self.line_color, (self.x, self.y + self.height / 6), (bird.loc_info[0], bird.loc_info[1] + bird.loc_info[2] / 2), 10)pygame.draw.line(self.screen, self.line_color, (self.x + self.width, self.y + self.height / 6), (bird.loc_info[0] + bird.loc_info[2], bird.loc_info[1] + bird.loc_info[2] / 2), 10)pygame.draw.rect(self.screen, self.color, (self.x - self.width / 4, self.y, self.width / 2, self.height / 3), 5)pygame.draw.rect(self.screen, self.color, (self.x + self.width * 3 / 4, self.y, self.width / 2, self.height / 3), 5)

源码获取

公众号【Python日志】

需要源码的小伙伴可以在公众号回复愤怒的小鸟

Python源码、问题解答学习交流群:773162165

如果觉得《【Python游戏】Python实现一个小游戏——愤怒的小鸟 | 附带源码》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。