范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

程序O带你回忆经典原生Python开发一款打砖块儿小游戏

  导语
  嘿!前不久刚刚给大家 过一款反弹球的小游戏嘛!
  不知道大家还记得不?不记得可以看下往期的内容呢,在上一期的基础上升级了这款大转款的小游
  戏,界面的话也挺简单的,经典配色原汁原味哈哈哈。
  大家好,我是木木子,一个上的编程下的厅堂的女码农!今天带大家编写一款经典的打砖块儿小游戏!
  小科普:
  打砖块最早是由雅达利公司开发的一款独立游戏,也是无数人的童年记忆。
  在谷歌图片中搜索"atari breakout"(雅利达打砖块游戏),搜索结果就会变成这款游戏。把所有砖
  块都清除后,还能继续进入下一轮挑战。
  大家也可以试试 哈哈哈~希望给大家介绍更多编程方各种知识!
  正文
  一、准备中
  1)游戏规则:
  把所有砖块都清除后,还能继续进入下一轮挑战
  初始化每个玩家2次机会,打完所有砖块儿即可胜利,否则失败游戏不过关!
  (关卡素材、背景音乐等比较少也不展示了需要的主页源码基地见哈)
  2)环境安装
  本文用到的环境:Python3、Pycharm、Pygame模块以及部分自带。
  环境安装:pip install -i https://pypi.douban.com/simple/ +模块名
  二、开始敲代码
  1)配置文件
  import os  """游戏界面一些数值""" SCREENWIDTH = 640 SCREENHEIGHT = 480 BRICKWIDTH = 10 BRICKHEIGHT = 10 PADDLEWIDTH = 60 PADDLEHEIGHT = 12 BALLRADIUS = 8 """游戏素材路径""" FONTPATH = os.path.join(os.getcwd(), "resources/font/font.TTF") HITSOUNDPATH = os.path.join(os.getcwd(), "resources/audios/hit.wav") BGMPATH = os.path.join(os.getcwd(), "resources/audios/bgm.mp3") LEVELROOTPATH = os.path.join(os.getcwd(), "resources/levels") LEVELPATHS = [os.path.join(LEVELROOTPATH, "%s.level" % str(i+1)) for i in range(len(os.listdir(LEVELROOTPATH)))] """一些颜色""" BLACK = (0, 0, 0) WHITE = (255, 255, 255) PINK = (212, 149, 174)  PURPLE = (168, 152, 191) YELLOW = (245, 237, 162) BLUE  = (51, 170, 230) AQUA = (182, 225, 225)
  2) 定义一些类
  import random import pygame   """板子""" class Paddle(pygame.sprite.Sprite):     def __init__(self, x, y, width, height, SCREENWIDTH, SCREENHEIGHT, **kwargs):         pygame.sprite.Sprite.__init__(self)         self.init_state = [x, y, width, height]         self.rect = pygame.Rect(x, y, width, height)         self.base_speed = 10         self.SCREENWIDTH = SCREENWIDTH         self.SCREENHEIGHT = SCREENHEIGHT     """移动板子"""     def move(self, direction):         if direction == "left":             self.rect.left = max(0, self.rect.left-self.base_speed)         elif direction == "right":             self.rect.right = min(self.SCREENWIDTH, self.rect.right+self.base_speed)         else:             raise ValueError("Paddle.move.direction unsupport %s..." % direction)         return True     """绑定到屏幕上"""     def draw(self, screen, color):         pygame.draw.rect(screen, color, self.rect)         return True     """重置"""     def reset(self):         self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])         return True   """球""" class Ball(pygame.sprite.Sprite):     def __init__(self, x, y, radius, SCREENWIDTH, SCREENHEIGHT, **kwargs):         pygame.sprite.Sprite.__init__(self)         self.init_state = [x, y, radius*2, radius*2]         self.rect = pygame.Rect(x, y, radius*2, radius*2)         self.base_speed = [5, 5]         self.direction = [random.choice([1, -1]), -1]         self.radius = radius         self.SCREENWIDTH = SCREENWIDTH         self.SCREENHEIGHT = SCREENHEIGHT     """移动球"""     def move(self):         self.rect.left += self.direction[0] * self.base_speed[0]         self.rect.top += self.direction[1] * self.base_speed[1]         if self.rect.left <= 0:             self.rect.left = 0             self.direction[0] = -self.direction[0]         elif self.rect.right >= self.SCREENWIDTH:             self.rect.right = self.SCREENWIDTH             self.direction[0] = -self.direction[0]         if self.rect.top <= 0:             self.rect.top = 0             self.direction[1] = -self.direction[1]         elif self.rect.bottom >= self.SCREENHEIGHT:             return False         return True     """改变运动速度和方向(与拍相撞时)"""     def change(self):         self.base_speed = [random.choice([4, 5, 6]), random.choice([4, 5, 6])]         self.direction = [random.choice([1, -1]), -1]         return True     """绑定到屏幕上"""     def draw(self, screen, color):         pygame.draw.circle(screen, color, (self.rect.left+self.radius, self.rect.top+self.radius), self.radius)         return True     """重置"""     def reset(self):         self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])         return True   """砖块""" class Brick(pygame.sprite.Sprite):     def __init__(self, x, y, width, height, **kwargs):         pygame.sprite.Sprite.__init__(self)         self.init_state = [x, y, width, height]         self.rect = pygame.Rect(x, y, width, height)     """绑定到屏幕上"""     def draw(self, screen, color):         pygame.draw.rect(screen, color, self.rect)         return True     """重置"""     def reset(self):         self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])         return True
  3)定义开始、结束界面
  """开始界面"""     def __startInterface(self):         clock = pygame.time.Clock()         while True:             for event in pygame.event.get():                 if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):                     pygame.quit()                     sys.exit(-1)                 if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:                     return             self.screen.fill(self.cfg.AQUA)             text1 = "Press  to start the game"             text2 = "Press  to quit the game"             text_render1 = self.font_big.render(text1, False, self.cfg.BLUE)             text_render2 = self.font_big.render(text2, False, self.cfg.BLUE)             self.screen.blit(text_render1, ((self.cfg.SCREENWIDTH-text_render1.get_rect().width)//2, (self.cfg.SCREENHEIGHT-text_render1.get_rect().height)//4))             self.screen.blit(text_render2, ((self.cfg.SCREENWIDTH-text_render2.get_rect().width)//2, (self.cfg.SCREENHEIGHT-text_render2.get_rect().height)//2))             pygame.display.flip()             clock.tick(30)     """结束界面"""     def __endInterface(self, is_win):         if is_win:             text1 = "Congratulations! You win!"         else:             text1 = "Game Over! You fail!"         text2 = "Press  to restart the game"         text3 = "Press  to quit the game."         clock = pygame.time.Clock()         while True:             for event in pygame.event.get():                 if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):                     pygame.quit()                     sys.exit(-1)                 if event.type == pygame.KEYDOWN and event.key == pygame.K_r:                     return             self.screen.fill(self.cfg.AQUA)             text_render1 = self.font_big.render(text1, False, self.cfg.BLUE)             text_render2 = self.font_big.render(text2, False, self.cfg.BLUE)             text_render3 = self.font_big.render(text3, False, self.cfg.BLUE)             self.screen.blit(text_render1, ((self.cfg.SCREENWIDTH-text_render1.get_rect().width)//2, (self.cfg.SCREENHEIGHT-text_render1.get_rect().height)//4))             self.screen.blit(text_render2, ((self.cfg.SCREENWIDTH-text_render2.get_rect().width)//2, (self.cfg.SCREENHEIGHT-text_render2.get_rect().height)//2))             self.screen.blit(text_render3, ((self.cfg.SCREENWIDTH-text_render3.get_rect().width)//2, (self.cfg.SCREENHEIGHT-text_render2.get_rect().height)//1.5))             pygame.display.flip()             clock.tick(30)
  4) 定义游戏
  """打砖块游戏""" class breakoutClone():     def __init__(self, cfg, **kwargs):         pygame.init()         pygame.display.set_caption("Breakout clone ")         pygame.mixer.init()         self.screen = pygame.display.set_mode((cfg.SCREENWIDTH, cfg.SCREENHEIGHT))         self.font_small = pygame.font.Font(cfg.FONTPATH, 20)         self.font_big = pygame.font.Font(cfg.FONTPATH, 30)         self.hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)         pygame.mixer.music.load(cfg.BGMPATH)         pygame.mixer.music.play(-1, 0.0)         self.cfg = cfg     """运行游戏"""     def run(self):         while True:             self.__startInterface()             for idx, levelpath in enumerate(self.cfg.LEVELPATHS):                 state = self.__runLevel(levelpath)                 if idx == len(self.cfg.LEVELPATHS)-1:                     break                 if state == "win":                     self.__nextLevel()                 else:                     break             if state == "fail":                 self.__endInterface(False)             else:                 self.__endInterface(True)     """运行某关卡"""     def __runLevel(self, levelpath):         score = 0         num_lives = 2         # running: 游戏正在进行, fail: 游戏失败, win: 游戏成功.         state = "running"         paddle = Paddle((self.cfg.SCREENWIDTH-self.cfg.PADDLEWIDTH)/2, self.cfg.SCREENHEIGHT-self.cfg.PADDLEHEIGHT-10, self.cfg.PADDLEWIDTH, self.cfg.PADDLEHEIGHT, self.cfg.SCREENWIDTH, self.cfg.SCREENHEIGHT)         ball = Ball(paddle.rect.centerx-self.cfg.BALLRADIUS, paddle.rect.top-self.cfg.BALLRADIUS*2, self.cfg.BALLRADIUS, self.cfg.SCREENWIDTH, self.cfg.SCREENHEIGHT)         brick_sprites = pygame.sprite.Group()         brick_positions = loadLevel(levelpath)         for bp in brick_positions:             brick_sprites.add(Brick(bp[0]*self.cfg.BRICKWIDTH, bp[1]*self.cfg.BRICKHEIGHT, self.cfg.BRICKWIDTH, self.cfg.BRICKHEIGHT))         clock = pygame.time.Clock()         while True:             if state != "running":                 return state             for event in pygame.event.get():                 if event.type == pygame.QUIT:                     pygame.quit()                     sys.exit(-1)             keys_pressed = pygame.key.get_pressed()             if keys_pressed[pygame.K_LEFT]:                 paddle.move("left")             elif keys_pressed[pygame.K_RIGHT]:                 paddle.move("right")             self.screen.fill(self.cfg.AQUA)             is_alive = ball.move()             # 判断有没有接住球             if not is_alive:                 ball.reset()                 paddle.reset()                 num_lives -= 1                 if num_lives == 0:                     state = "fail"             # 球和砖块碰撞检测             num_bricks = pygame.sprite.spritecollide(ball, brick_sprites, True)             score += len(num_bricks)             # 球和拍碰撞检测             if pygame.sprite.collide_rect(ball, paddle):                 ball.change()             # 判断砖块是否已经打完             if len(brick_sprites) == 0:                 state = "win"             # 将游戏精灵绑定到屏幕             paddle.draw(self.screen, self.cfg.PURPLE)             ball.draw(self.screen, self.cfg.WHITE)             for brick in brick_sprites:                 brick.draw(self.screen, self.cfg.YELLOW)             text_render = self.font_small.render("SCORE: %s, LIVES: %s" % (score, num_lives), False, self.cfg.BLUE)             self.screen.blit(text_render, (10, 10))             pygame.display.flip()             clock.tick(50)     """关卡切换"""     def __nextLevel(self):         clock = pygame.time.Clock()         while True:             for event in pygame.event.get():                 if event.type == pygame.QUIT:                     pygame.quit()                     sys.exit(-1)                 if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:                     return             self.screen.fill(self.cfg.AQUA)             text = "Press  to enter the next level"             text_render = self.font_big.render(text, False, self.cfg.BLUE)             self.screen.blit(text_render, ((self.cfg.SCREENWIDTH-text_render.get_rect().width)//2, (self.cfg.SCREENHEIGHT-text_render.get_rect().height)//3))             pygame.display.flip()             clock.tick(30)
  5)主函数与运行界面
  import cfg from modules import breakoutClone   """主函数""" def main():     game = breakoutClone(cfg)     game.run()   """run""" if __name__ == "__main__":     main()
  三、效果展示
  1)视频效果展示——
  程序 带你回忆经典:原生Python开发一款打砖块儿小游戏~
  2)截图效果展示——
  游戏开始界面——
  运行界面——
  总结
  于茫茫人海相遇——感谢你的阅读!相遇即是缘分,如有帮助到你,记得三连哦~
  我是木木子,一个不止能编程的女码农,还能教你玩游戏、制作节日惊喜、甚至撩小姐姐、小哥哥的表白小程序哦......
  写在最后——往期也有很多精彩内容,欢迎阅读!关注我,每日更新
  私信小编06即可获取文章源码啦~往期也有很多哦!

神狐超变单职业传奇版本综合介绍1。转生地图介绍110转在土城左上角1120转在三尾天堂界!2123在八尾地图(从三尾天堂界一直下到八尾神狐论剑)2426转在土城左上角进入(十尾之巅)妖狐九重天进到第九层S12赛季飞机出装思路!暴击,女神泪,耀光的选择,上大分推荐S12新赛季已经上线一个多月,大量的新装备和少量的符文重做,给许多英雄提供了更多的玩法,许多英雄因为新天赋的红利直接出场率胜率飙升,像打野男刀,中路上路维克托,这种直接一步到位加入S12赛季于1月7日正式开始S11总决赛登年度观众峰值榜首相信很多玩家已经适应了S12赛季季前赛版本,由于适逢假期的原因,所以版本更新节奏比较慢。距离11。24版本更新,已经过去了将近一个月左右的时间了,英雄联盟官方也终于宣布了新赛季正式盘点我的世界里那些经久不衰的梗,老玩家有被笑到作为一个开放自由的游戏,我的世界里经常会发生一些令玩家觉得非常无厘头或者说搞笑的事情,而这些事情呢,又逐渐变成了玩家圈里一些经久不衰的梗。今天方块菌就来跟大家分享一些01错的时间遇曾经堪称国产佳作的三国杀,没想到却成了steam的年度最差作品说到国产佳作,可能现在大部分人会想起黑神话悟空,或者类似艾希波西亚时光这样的游戏。但对于老一辈玩家而言,有一款游戏相信是刻在骨子里都没法忘记的,这款游戏就是三国杀。说起三国杀这个游外媒回顾2021亮眼角色生化8吸血夫人最具标志性外媒Eurogamer近日在盘点2021年游戏之时谈到这一年的亮眼游戏角色,在为数不多的大作角色中,Eurogamer认为生化危机8村庄中吸血鬼夫人蒂米特雷斯库堪称最具标志性的角色原神角色都在PVP,只有可莉被遗弃?曾经的流水之王现在落魄了随着原神的版本更新,2。4版本也即将和大家见面。在这段时间里面,原神很多的角色都开始PVP了起来。原神本身是一款大世界的开放型游戏,玩家与玩家之间是不可以打PVP玩法的。但是很多的原神2。4UP角色深渊表现,申鹤魈甘雨钟离强度分析有句话说的好。一代版本一代神还有一句话叫做铁打的辅助,流水的C。的确是如此,游戏中辅助的地位一般比较稳固,寿命悠久,而输出则是竞争和替换可能性比较激烈。那么问题来了。2。4当期UP决赛竟然一面倒?神鸡营惨遭暴打,吕德虎气急败坏而韩涵笑开花最近KPI决赛正式开始,AB两组的决胜者开启了最终的对决。这一场比赛吸引了很多人观看。要知道刘伟家族是韩涵的战队,之前在参加平台杯的时候就打出了不错的表现,而神鸡营是吕德华的战队,新冰雪传奇嗨嗨!我是阿伟!元旦福利盘点下期元旦快乐嗨嗨!我是阿伟!今天是元旦假期的第三天,大家这个假期过得开心吗?阿伟这两天除了出门玩耍之外,在家的时间都在玩这款新冰雪传奇,为什么呢?因为这个游戏元旦节的福利太丰厚啦!阿伟一期都讲热血传奇六大神戒中的逆天存在,也同时背负能力带来悲惨的命运各位看官大家好呀,相信各位都已经是纵横传奇多年的骨灰级玩家了,那么各位知道戒指这件装备在游戏中的重要程度吗?可以说戒指是装备中最为特殊的存在之一了,因为很多戒指不仅仅是加一些基础属
预见20212021年中国单晶硅产业全景图谱原标题预见20212021年中国单晶硅产业全景图谱(附市场供需竞争格局发展前景等)近年来,各种晶体材料,特别是以单晶硅为代表的高科技附加值材料及其相关高技术产业的发展,成为当代信息干货!2021年中国染料行业龙头企业分析浙江龙盛原标题干货!2021年染料行业龙头企业分析浙江龙盛调整业务格局加强自有品牌竞争力2020年受疫情影响,我国染料行业整体出现萎缩。浙江龙盛作为我国染料行业龙头,产品业务完善,有丰富的最全2021年中国飞机产业整机制造上市公司全方位对比分析原标题最全2021年中国飞机产业整机制造上市公司全方位对比(附业务布局业绩对比业务规划等)飞机是军工和民用运输领域的重要基础设施。飞机产业的上游包括飞机制造原材料零部件的供应中游是奈雪的茶盈利能力有待考究奈雪PRO门店或成未来盈利关键2021年6月18日,茶饮第一股奈雪的茶正式公开招股。2021年2月,奈雪的茶第一版招股书中数据显示2020年前三季度净亏损2750万元6月,奈雪的茶更新版招股书数据显示,2020最全2021年中国啤酒行业上市公司全方位对比分析啤酒在酒精饮料行业中占据着重要的组成地位,我国是全球啤酒生产和消费大国。啤酒产业的上游包括原材料,一般为麦芽啤酒花酵母等,主要代表上市公司有亚盛集团安琪酵母兰州黄河还有啤酒设备,一热点解读!芯慌事件新能源汽车发展或加剧汽车芯片短缺?原标题热点解读!芯慌致全球300万辆车停产新能源汽车发展或加剧汽车芯片短缺?2020年6月10日,央财经发布一则新闻称芯慌致全球300万辆车停产,道出了目前汽车芯片短缺的事实,汽车芯慌致全球300万辆车停产损失610亿美金汽车芯片短缺原因何在原标题热点解读!芯慌致全球300万辆车停产损失610亿美金汽车芯片短缺原因何在?2020年6月10日,央财经发布一则新闻称芯慌致全球300万辆车停产,道出了目前汽车芯片短缺的事实。预见20212021年中国工业机器人行业全景图谱原标题预见20212021年中国工业机器人行业全景图谱(附市场现状竞争格局和发展趋势等)近年来工业机器人发展逐渐得到重视,国家出台各种鼓励措施,地方也争相设立发展目标,核心内容是实深度分析!2021年中国核电阀门行业市场现状及发展前景分析原标题深度分析!2021年中国核电阀门行业市场现状及发展前景分析更新市场规模较为稳定核电阀门分为核岛NI阀门常规岛CI阀门和辅助BOP阀门。其中,核岛阀门常规岛阀门与电站辅助设施阀干货!2021年中国啤酒行业企业对比华润啤酒VS青岛啤酒谁是王?啤酒在酒精饮料行业中占据着重要的组成地位,我国是全球啤酒生产和消费大国。目前,国内啤酒主要市场被五大集团占据。其中,华润啤酒青岛啤酒是啤酒行业市占最高的两大龙头企业。相较而言,华润行业深度2021年中国扫描电子显微镜行业竞争格局及市场份额原标题行业深度洞察2021中国扫描电子显微镜行业竞争格局及市场份额(附市场集中度竞争力评价等)扫描电子显微镜是一种介于透射电子显微镜和光学显微镜之间的高精密仪器,一般用于高分辨率微