Python中怎么用Pygame实现打砖块小游戏(pygame,python,开发技术)

时间:2024-05-02 07:40:59 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    一、准备中

    1)游戏规则:

    把所有砖块都清除后,还能继续进入下一轮挑战

    初始化每个玩家2次机会,打完所有砖块儿即可胜利,否则失败游戏不过关!

    (关卡素材、背景音乐等比较少也不展示了需要的主页源码基地见哈)

    2)环境安装

    本文用到的环境:Python3、Pycharm、Pygame模块以及部分自带。

    环境安装:pip install -i https://pypi.douban.com/simple/ +模块名

    二、开始敲代码

    1)配置文件

    importos'''游戏界面一些数值'''SCREENWIDTH=640SCREENHEIGHT=480BRICKWIDTH=10BRICKHEIGHT=10PADDLEWIDTH=60PADDLEHEIGHT=12BALLRADIUS=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))foriinrange(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)定义一些类

    importrandomimportpygame'''板子'''classPaddle(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=10self.SCREENWIDTH=SCREENWIDTHself.SCREENHEIGHT=SCREENHEIGHT'''移动板子'''defmove(self,direction):ifdirection=='left':self.rect.left=max(0,self.rect.left-self.base_speed)elifdirection=='right':self.rect.right=min(self.SCREENWIDTH,self.rect.right+self.base_speed)else:raiseValueError('Paddle.move.directionunsupport%s...'%direction)returnTrue'''绑定到屏幕上'''defdraw(self,screen,color):pygame.draw.rect(screen,color,self.rect)returnTrue'''重置'''defreset(self):self.rect=pygame.Rect(self.init_state[0],self.init_state[1],self.init_state[2],self.init_state[3])returnTrue'''球'''classBall(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=radiusself.SCREENWIDTH=SCREENWIDTHself.SCREENHEIGHT=SCREENHEIGHT'''移动球'''defmove(self):self.rect.left+=self.direction[0]*self.base_speed[0]self.rect.top+=self.direction[1]*self.base_speed[1]ifself.rect.left<=0:self.rect.left=0self.direction[0]=-self.direction[0]elifself.rect.right>=self.SCREENWIDTH:self.rect.right=self.SCREENWIDTHself.direction[0]=-self.direction[0]ifself.rect.top<=0:self.rect.top=0self.direction[1]=-self.direction[1]elifself.rect.bottom>=self.SCREENHEIGHT:returnFalsereturnTrue'''改变运动速度和方向(与拍相撞时)'''defchange(self):self.base_speed=[random.choice([4,5,6]),random.choice([4,5,6])]self.direction=[random.choice([1,-1]),-1]returnTrue'''绑定到屏幕上'''defdraw(self,screen,color):pygame.draw.circle(screen,color,(self.rect.left+self.radius,self.rect.top+self.radius),self.radius)returnTrue'''重置'''defreset(self):self.rect=pygame.Rect(self.init_state[0],self.init_state[1],self.init_state[2],self.init_state[3])returnTrue'''砖块'''classBrick(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)'''绑定到屏幕上'''defdraw(self,screen,color):pygame.draw.rect(screen,color,self.rect)returnTrue'''重置'''defreset(self):self.rect=pygame.Rect(self.init_state[0],self.init_state[1],self.init_state[2],self.init_state[3])returnTrue

    3)定义开始、结束界面

    '''开始界面'''def__startInterface(self):clock=pygame.time.Clock()whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUITor(event.type==pygame.KEYDOWNandevent.key==pygame.K_ESCAPE):pygame.quit()sys.exit(-1)ifevent.type==pygame.KEYDOWNandevent.key==pygame.K_RETURN:returnself.screen.fill(self.cfg.AQUA)text1='Press<Enter>tostartthegame'text2='Press<Esc>toquitthegame'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):ifis_win:text1='Congratulations!Youwin!'else:text1='GameOver!Youfail!'text2='Press<R>torestartthegame'text3='Press<Esc>toquitthegame.'clock=pygame.time.Clock()whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUITor(event.type==pygame.KEYDOWNandevent.key==pygame.K_ESCAPE):pygame.quit()sys.exit(-1)ifevent.type==pygame.KEYDOWNandevent.key==pygame.K_r:returnself.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)定义游戏

    '''打砖块游戏'''classbreakoutClone():def__init__(self,cfg,**kwargs):pygame.init()pygame.display.set_caption('Breakoutclone')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'''运行游戏'''defrun(self):whileTrue:self.__startInterface()foridx,levelpathinenumerate(self.cfg.LEVELPATHS):state=self.__runLevel(levelpath)ifidx==len(self.cfg.LEVELPATHS)-1:breakifstate=='win':self.__nextLevel()else:breakifstate=='fail':self.__endInterface(False)else:self.__endInterface(True)'''运行某关卡'''def__runLevel(self,levelpath):score=0num_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)forbpinbrick_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()whileTrue:ifstate!='running':returnstateforeventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(-1)keys_pressed=pygame.key.get_pressed()ifkeys_pressed[pygame.K_LEFT]:paddle.move('left')elifkeys_pressed[pygame.K_RIGHT]:paddle.move('right')self.screen.fill(self.cfg.AQUA)is_alive=ball.move()#判断有没有接住球ifnotis_alive:ball.reset()paddle.reset()num_lives-=1ifnum_lives==0:state='fail'#球和砖块碰撞检测num_bricks=pygame.sprite.spritecollide(ball,brick_sprites,True)score+=len(num_bricks)#球和拍碰撞检测ifpygame.sprite.collide_rect(ball,paddle):ball.change()#判断砖块是否已经打完iflen(brick_sprites)==0:state='win'#将游戏精灵绑定到屏幕paddle.draw(self.screen,self.cfg.PURPLE)ball.draw(self.screen,self.cfg.WHITE)forbrickinbrick_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()whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(-1)ifevent.type==pygame.KEYDOWNandevent.key==pygame.K_RETURN:returnself.screen.fill(self.cfg.AQUA)text='Press<Enter>toenterthenextlevel'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)主函数与运行界面

    importcfgfrommodulesimportbreakoutClone'''主函数'''defmain():game=breakoutClone(cfg)game.run()'''run'''if__name__=='__main__':main()

    三、效果展示

    1)视频效果展示&mdash;&mdash;

    视频链接

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

    2)截图效果展示&mdash;&mdash;

    游戏开始界面&mdash;&mdash;

    Python中怎么用Pygame实现打砖块小游戏

    运行界面&mdash;&mdash;

    Python中怎么用Pygame实现打砖块小游戏

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:Python中怎么用Pygame实现打砖块小游戏的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:想知道你weixin隐藏了多少妹子?python带你分析分析下一篇:

    13 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18