您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > python实现推箱子游戏
#encoding:utf-8importtkMessageBoxfromTkinterimportTk,Canvas,FramefromPILimportImageTk,Imageimg=[]defload_picture():globalimgforiinrange(0,10):file=F:/source/+str(i)+.bmpim=Image.open(file)im=ImageTk.PhotoImage(im)img.append(im)classGrid:def__init__(self,master=None,window_width=450,window_height=500,width=30):self.master=masterself.width=widthself.map=[]self.load_map(1)self.canvas=Canvas(master,width=window_width,height=window_height,bg='cyan')self.canvas.pack()self.display_map()defload_map(self,i):file=F:/source/+str(i)+.txtf=open(file,r)lines=f.readlines()forkinrange(0,len(self.map)):self.map.pop()forkinrange(0,len(lines)):mp=[]line=lines[k]forjinrange(0,len(lines)):p=int(line[j])mp.append(p)ifp==6:self.x=kself.y=jself.map.append(mp)defdisplay_map(self):self.canvas.delete('all')#清空画布canvasm=len(self.map)n=len(self.map[0])foriinrange(0,m):forjinrange(0,n):self.create_image(i,j)self.display_text()defdisplay_text(self):self.canvas.create_text(210,460,text=pageUp,pageDown切换关卡,font='BOLD',fill='black')self.canvas.create_text(210,480,text=BackSpace后退,font='BOLD',fill='black')defcreate_image(self,i,j):globalimgx=(2*i+1)*self.width/2y=(2*j+1)*self.width/2pic=self.map[i][j]self.canvas.create_image(y,x,image=img[pic])classGame(Frame):def__init__(self,master=None):Frame.__init__(self,master)self.grid=Grid(self.master)self.direction='Down'self.map=[]self.get_map()#获取地图,用于标志地图中最初箱子放在目标位置self.stack=[1]self.level=1self.dir_x=[-1,1,0,0]self.dir_y=[0,0,-1,1]self.dir={'Up':0,'Down':1,'Left':2,'Right':3}self.bind_all(KeyPress,self.KeyPress_event)defget_map(self):forkinrange(0,len(self.map)):self.map.pop()foriinself.grid.map:mp=[]forjini:mp.append(j)self.map.append(mp)defKeyPress_event(self,event):key=event.keysymifself.dir.has_key(key):self.direction=keyself.move()elifkey=='Prior':self.prior_level()elifkey=='Next':self.next_level()elifkey=='BackSpace':iflen(self.stack)==1:returncur_dir=self.stack.pop()#当前坐标的方向#当前坐标mx=self.stack.pop()my=self.stack.pop()cur_picture=self.stack.pop()#当前坐标cur_dir方向的图片next_picture=self.stack.pop()#前一个坐标以前图片pre_dir=self.stack[len(self.stack)-1]dx=self.dir_x[cur_dir]dy=self.dir_y[cur_dir]self.grid.map[mx][my]=cur_pictureself.grid.map[mx+dx][my+dy]=next_pictureself.grid.map[mx-dx][my-dy]=pre_dir+5self.grid.x=mx-dxself.grid.y=my-dyself.grid.display_map()defmove(self):index=self.dir[self.direction]x=self.grid.x#原来的位置y=self.grid.ydx=self.dir_x[index]#位移dy=self.dir_y[index]mp=self.grid.mapself.grid.x+=dxself.grid.y+=dymanX=self.grid.xmanY=self.grid.yorigin_picture=mp[manX][manY]next_picture=mp[manX+dx][manY+dy]#dir方向是箱子,箱子dir方向是墙或箱子if(mp[manX][manY]==4ormp[manX][manY]==3)and(mp[manX+dx][manY+dy]==2ormp[manX+dx][manY+dy]==3ormp[manX+dx][manY+dy]==4):self.grid.x-=dxself.grid.y-=dyreturn#dir方向是墙ifmp[manX][manY]==2:self.grid.x-=dxself.grid.y-=dyreturn#dir方向是草地或者目的地ifmp[manX][manY]==1ormp[manX][manY]==9:mp[manX][manY]=index+5#self.grid.create_image(manX,manY)ifself.map[x][y]==9:#原来位置是目的地mp[x][y]=9else:mp[x][y]=1#原来位置是草地#self.grid.create_image(x,y)#dir方向是箱子,箱子dir方向是草地if(mp[manX][manY]==4ormp[manX][manY]==3)andmp[manX+dx][manY+dy]==1:mp[manX][manY]=index+5#self.grid.create_image(manX,manY)ifself.map[x][y]==9:#原来位置是目的地mp[x][y]=9else:#原来位置是草地mp[x][y]=1#self.grid.create_image(x,y)mp[manX+dx][manY+dy]=4#草地位置变箱子#self.grid.create_image(manX+dx,manY+dy)#dir方向是箱子,箱子dir方向是目的地if(mp[manX][manY]==4ormp[manX][manY]==3)andmp[manX+dx][manY+dy]==9:mp[manX][manY]=index+5#self.grid.create_image(manX,manY)ifself.map[x][y]==9:#原来位置是目的地mp[x][y]=9else:#原来位置是草地mp[x][y]=1#self.grid.create_image(x,y)mp[manX+dx][manY+dy]=3#目的地位置变箱子#self.grid.create_image(manX+dx,manY+dy)self.grid.display_map()#重绘画布ifself.is_pass():message=tkMessageBox.showinfo(提示,恭喜过关!)ifmessage=='ok':self.next_level()#每走一步保存当前位置的坐标、以前的图片self.stack.append(next_picture)self.stack.append(origin_picture)self.stack.append(manY)self.stack.append(manX)self.stack.append(index)defdestroy_stack(self):foriinrange(0,len(self.stack)-1):self.stack.pop()defprior_level(self):ifself.level==1:returnself.level-=1self.grid.load_map(self.level)self.grid.display_map()self.destroy()self.get_map()defnext_level(self):ifself.level==13:returnself.level+=1self.grid.load_map(self.level)self.grid.display_map()self.destroy()self.get_map()defis_pass(self):p=0foriinrange(0,15):forjinrange(0,15):ifself.grid.map[i][j]==4:p+=1ifp==0:returnTruereturnFalseif__name__==__main__:root=Tk(sokoban)load_picture()game=Game(root)root.mainloop()
本文标题:python实现推箱子游戏
链接地址:https://www.777doc.com/doc-4355078 .html