Python怎么实现推箱子游戏

Python怎么实现推箱子游戏

小编给大家分享一下Python怎么实现推箱子游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

1.游戏规则

推箱子游戏是一款可玩性极高的策略解谜手游,游戏中玩家将扮演一名可爱Q萌的角色,

我们需通过将场景内的箱子,推送到合适的位置上进行摆放,才可以轻松获得游戏胜利。

整个过程虽然极其简单,但极需玩家动脑思考,充分的利用有效地空间,合理得将箱子推送到指定位置,从而获得游戏胜利。

不仅如此,游戏整体画风十分简洁清爽,采用了简单和程式化的图形设计,给予了玩家前所未有的体验感哦。

2.材料准备

玩家、箱子、背景等图片素材:

3.环境安装

Python3.6、pycharm、pygame游戏模块不能少。

pipinstallpygame

**导入游戏的素材,**增加游戏元素

defaddElement(self,elem_type,col,row):ifelem_type=='wall':self.walls.append(elementSprite('wall.png',col,row,cfg))elifelem_type=='box':self.boxes.append(elementSprite('box.png',col,row,cfg))elifelem_type=='target':self.targets.append(elementSprite('target.png',col,row,cfg))

4.游戏开始、结束界面设置

defstartInterface(screen,cfg):screen.fill(cfg.BACKGROUNDCOLOR)clock=pygame.time.Clock()whileTrue:button_1=Button(screen,(95,150),'开始游戏',cfg)button_2=Button(screen,(95,305),'退出游戏',cfg)foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==pygame.MOUSEBUTTONDOWN:ifbutton_1.collidepoint(pygame.mouse.get_pos()):returnelifbutton_2.collidepoint(pygame.mouse.get_pos()):pygame.quit()sys.exit(0)clock.tick(60)pygame.display.update()defendInterface(screen,cfg):screen.fill(cfg.BACKGROUNDCOLOR)clock=pygame.time.Clock()font_path=os.path.join(cfg.FONTDIR,'simkai.ttf')text='机智如你~恭喜通关!'font=pygame.font.Font(font_path,30)text_render=font.render(text,1,(255,255,255))whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()screen.blit(text_render,(120,200))clock.tick(60)pygame.display.update()

如下:

******设置游戏的界面,**导入关卡地图

classgameInterface():def__init__(self,screen):self.screen=screenself.levels_path=cfg.LEVELDIRself.initGame()defloadLevel(self,game_level):withopen(os.path.join(self.levels_path,game_level),'r')asf:lines=f.readlines()#游戏地图self.game_map=gameMap(max([len(line)forlineinlines])-1,len(lines))#游戏surfaceheight=cfg.BLOCKSIZE*self.game_map.num_rowswidth=cfg.BLOCKSIZE*self.game_map.num_colsself.game_surface=pygame.Surface((width,height))self.game_surface.fill(cfg.BACKGROUNDCOLOR)self.game_surface_blank=self.game_surface.copy()forrow,elemsinenumerate(lines):forcol,eleminenumerate(elems):ifelem=='p':self.player=pusherSprite(col,row,cfg)elifelem=='*':self.game_map.addElement('wall',col,row)elifelem=='#':self.game_map.addElement('box',col,row)elifelem=='o':self.game_map.addElement('target',col,row)

因为游戏界面面积>游戏窗口界面, 所以需要根据人物位置滚动。

defscroll(self):x,y=self.player.rect.centerwidth=self.game_surface.get_rect().wheight=self.game_surface.get_rect().hif(x+cfg.SCREENSIZE[0]//2)>cfg.SCREENSIZE[0]:if-1*self.scroll_x+cfg.SCREENSIZE[0]<width:self.scroll_x-=2elif(x+cfg.SCREENSIZE[0]//2)>0:ifself.scroll_x<0:self.scroll_x+=2if(y+cfg.SCREENSIZE[1]//2)>cfg.SCREENSIZE[1]:if-1*self.scroll_y+cfg.SCREENSIZE[1]<height:self.scroll_y-=2elif(y+250)>0:ifself.scroll_y<0:self.scroll_y+=2

设置玩家的精灵类,可上下左右移动等

classpusherSprite(pygame.sprite.Sprite):def__init__(self,col,row,cfg):pygame.sprite.Sprite.__init__(self)self.image_path=os.path.join(cfg.IMAGESDIR,'player.png')self.image=pygame.image.load(self.image_path).convert()color=self.image.get_at((0,0))self.image.set_colorkey(color,pygame.RLEACCEL)self.rect=self.image.get_rect()self.col=colself.row=row'''移动'''defmove(self,direction,is_test=False):#测试模式代表模拟移动ifis_test:ifdirection=='up':returnself.col,self.row-1elifdirection=='down':returnself.col,self.row+1elifdirection=='left':returnself.col-1,self.rowelifdirection=='right':returnself.col+1,self.rowelse:ifdirection=='up':self.row-=1elifdirection=='down':self.row+=1elifdirection=='left':self.col-=1elifdirection=='right':self.col+=1'''将人物画到游戏界面上'''defdraw(self,screen):self.rect.x=self.rect.width*self.colself.rect.y=self.rect.height*self.rowscreen.blit(self.image,self.rect)'''游戏元素精灵类'''classelementSprite(pygame.sprite.Sprite):def__init__(self,sprite_name,col,row,cfg):pygame.sprite.Sprite.__init__(self)#导入box.png/target.png/wall.pngself.image_path=os.path.join(cfg.IMAGESDIR,sprite_name)self.image=pygame.image.load(self.image_path).convert()color=self.image.get_at((0,0))self.image.set_colorkey(color,pygame.RLEACCEL)self.rect=self.image.get_rect()#元素精灵类型self.sprite_type=sprite_name.split('.')[0]#元素精灵的位置self.col=colself.row=row'''将游戏元素画到游戏界面上'''defdraw(self,screen):self.rect.x=self.rect.width*self.colself.rect.y=self.rect.height*self.rowscreen.blit(self.image,self.rect)'''移动游戏元素'''defmove(self,direction,is_test=False):ifself.sprite_type=='box':#测试模式代表模拟移动ifis_test:ifdirection=='up':returnself.col,self.row-1elifdirection=='down':returnself.col,self.row+1elifdirection=='left':returnself.col-1,self.rowelifdirection=='right':returnself.col+1,self.rowelse:ifdirection=='up':self.row-=1elifdirection=='down':self.row+=1elifdirection=='left':self.col-=1elifdirection=='right':self.col+=1

游戏关卡循环,当某个关卡过不去的时候,想重新来按住R键即可返回本关卡

defrunGame(screen,game_level):clock=pygame.time.Clock()game_interface=gameInterface(screen)game_interface.loadLevel(game_level)font_path=os.path.join(cfg.FONTDIR,'simkai.ttf')text='按R键重新开始本关'font=pygame.font.Font(font_path,15)text_render=font.render(text,1,(255,255,255))whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(0)elifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFT:next_pos=game_interface.player.move('left',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('left')else:box=game_interface.game_map.getBox(*next_pos)ifbox:next_pos=box.move('left',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('left')box.move('left')breakifevent.key==pygame.K_RIGHT:next_pos=game_interface.player.move('right',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('right')else:box=game_interface.game_map.getBox(*next_pos)ifbox:next_pos=box.move('right',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('right')box.move('right')breakifevent.key==pygame.K_DOWN:next_pos=game_interface.player.move('down',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('down')else:box=game_interface.game_map.getBox(*next_pos)ifbox:next_pos=box.move('down',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('down')box.move('down')breakifevent.key==pygame.K_UP:next_pos=game_interface.player.move('up',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('up')else:box=game_interface.game_map.getBox(*next_pos)ifbox:next_pos=box.move('up',is_test=True)ifgame_interface.game_map.isValidPos(*next_pos):game_interface.player.move('up')box.move('up')breakifevent.key==pygame.K_r:game_interface.initGame()game_interface.loadLevel(game_level)game_interface.draw(game_interface.player,game_interface.game_map)ifgame_interface.game_map.levelCompleted():returnscreen.blit(text_render,(5,5))pygame.display.flip()clock.tick(100)

如下:

判断****该关卡中所有的箱子是否都在指定位置, 在的话就是通关了

deflevelCompleted(self):forboxinself.boxes:is_match=Falsefortargetinself.targets:ifbox.col==target.colandbox.row==target.row:is_match=Truebreakifnotis_match:returnFalsereturnTrue

效果图第二关卡如下:

以上是“Python怎么实现推箱子游戏”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-03 21:24:42
收藏
分享
海报
0 条评论
52
上一篇:Java如何利用沙箱支付实现电脑扫码支付 下一篇:Nginx热部署如何实现
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码