导语

哈喽!大家好!今天给大家更新一款经典小游戏吖!

十几年过去了,这款游戏渐渐被人遗忘。这是多少人的童年呢?

过气游戏?小鸟不angry,你还真以为我是“hello bird”?

现在的冷天气,除了穿多点儿衣服,可能就要靠这只火爆的小鸟给大家升温了!


正文

首先环境安装部分:

准备—Python3.6、Pycharm2021、最主要的游戏模块Pygame、以及一些自带的模块直接可用的。

游戏源码可版本不一致也能运行,相应的模块安装好就可,自行安排!

pip install -i https://pypi.douban.com/simple/  pygame

准备—相应的素材图片、音乐背景等:

定义精灵类这里定义的是对手的猪猪。

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

游戏主程序:

​
import sys
import cfg
import pygame
from modules import *'''游戏主程序'''
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(' 愤怒的小鸟')# 开始游戏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)'''run'''
if __name__ == '__main__':main(cfg)​

由于这款愤怒的小鸟代码量太对,所以全部代码没放进来!文末有代码!

效果图:

总结

赶紧先跟着小编涨姿势啊!这款游戏你也想拥嘛?

完整的项目源码免费领:关注小编公众号:Python顾木子吖

好啦!本次文章就到这里了~如有想跟着小编一起学习交流的,欢迎大家!

学无止境哦!你们的支持是我最大的动力!

【Pygame小游戏】超好玩的——Python版“愤怒的小鸟”,我能玩上一整天(附源码)相关推荐

  1. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)

    Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...

  2. Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码)

    Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码) 程序之美 泡泡 一直被孩子认为是神奇的东西.记得儿时,经常 趁大人不注意,偷偷抓一把洗衣粉撞到口袋里,然后自己悄悄的找来一个小瓶子, ...

  3. python撩人的代码,老师教已毕业的学生,用Python代码每天不定时撩女友,附源码文件...

    原本就是学生会主席,在学校如此优秀的他,毕业参加工作,依然展现出好强的一面. 每天认真的工作,即使在工作之余也要用来给自己充电,所以难免会忽略女友,不够关心,免不了发脾气,甚至是争吵. 有一天,曾经大 ...

  4. python程序员专用壁纸_程序员炫技必备:用Python生成马赛克画!(文末附源码)...

    原标题:程序员炫技必备:用Python生成马赛克画!(文末附源码) 源 | Python与数据分析文 | 强哥 大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~ 马赛克画是一张由小图拼成的大图,本 ...

  5. Python毕设-【课堂人脸签到系统】附源码课件/Python练手项目/Python毕业设计

    Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 文章目录 Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 系统简介 一.本课题拟解决的问题 二.系统技术栈 三.开发工具 四.数 ...

  6. Python开发实战案例之网络爬虫(附源码)-张子良-专题视频课程

    Python开发实战案例之网络爬虫(附源码)-35人已学习 课程介绍         课程特色: 特色1:案例驱动-围绕两大完整的Python网络爬虫实战开发案例:IT电子书下载网络爬虫和股票交易数据 ...

  7. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

  8. 大家都在发圣诞树,我偏偏要发一个圣诞小游戏给大家玩【内附源码】

    ​大家好,我是辣条. 前言 圣诞节快来了,热榜都被一堆圣诞树攻占了,这样的流量密码我怎么会错过,大家都发圣诞树,我就不发啦,直接分享一个圣诞小游戏给大家玩,代码太长一定要先赞和收藏. 领取福利 300 ...

  9. 用python+pygame模块实现一波刮刮卡效果,图像处理之路(附源码)

    前言 利用python模拟了刮开刮刮卡效果,让我们愉快地开始吧~ 效果展示 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些python自带的模块. 环境搭建 安装P ...

  10. 微信小程序版博客——开发汇总总结(附源码)

    花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...

最新文章

  1. 计算机病毒实践汇总五:搭建虚拟网络环境
  2. ITRON系统使用方法
  3. 使用wxSqlite3来解决sqlite加密问题zz
  4. mysql中一个表怎么查询多以上的信息,MySQL怎么样实现多个表的或查询?
  5. springboot与thymeleaf 整合
  6. POJ2586(贪心)
  7. 【python】整理的 Python 库
  8. redis 中一个字段 修改map_Redis 几种数据类型及应用场景
  9. 【SQL】去除表中的重复行
  10. vscode markdown_使用vscode开始Markdown写作之旅
  11. OpenGL ES之GLSurfaceView学习一:介绍
  12. C++实现图片格式转换
  13. iphone双重认证关闭不了怎么办_iPhone双重认证怎么关闭?苹果手机关闭双重认证的两种方法[多图]...
  14. php上传504,nginx+php设置大文件请求上传(502及504问题处理)
  15. Right-BICEP要求设计四则运算2
  16. 一个程序员如何给LPL发弹幕加油
  17. ubuntun16 上rtl 8723be 安装
  18. 读史鉴今:女人的12种结局
  19. 视频如何加水印文字?一分钟学会
  20. 【MATLAB】基本绘图 ( plot 函数绘制多个图形 | legend 函数标注图形 | 图形修饰 )

热门文章

  1. 编程,初来乍到,多多关照。
  2. 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)
  3. 我讨厌单元测试:滕振宇谈如何进行单元测试
  4. Halcon匹配助手
  5. 阅读器android工程,一种简单的纯粹——全球首款 EINK屏 安卓手机 BOOX E43 工程机测试体验...
  6. 虚拟机:TTL 传输中过期
  7. 开发谷歌浏览器翻译插件
  8. 硬件蓝牙测试软件,【原创】聊聊蓝牙测试专用硬件工具-Ubertooth
  9. python数据分析简历_帮粉丝推荐简历|Python数据分析师
  10. Codeforces 1153C