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怎么实现推箱子游戏”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...