当前位置: 首页 > 后端技术 > Python

Python使用tkinter开发一个简单的扫雷游戏

时间:2023-03-26 16:36:29 Python

扫雷游戏效果代码#importrequiredlibraryfromtkinterimport*importrandomclassmain:#定义一个继承tkinter的Button的类#用于保存按钮的状态及其在网格布局类中的位置minebtn(Button):def__init__(self,master,xy,**kw):Button.__init__(self,master,**kw)self.xy=xyself._state=0#state#0:未点击#1:点击#2:标记#3:问号def__init__(self):#定义size和minenumself.width=9self.height=9self.minenum=10#Windows7默认三种规格和minenum#9*9,10#16*16,40#16*32,99self.rest=self.minenum#剩余未标记的地雷#minenums的颜色self.colorlist=['green',#green'DodgerBlue',#lightblue'DarkOrange1',#orange'blue',#blue'red',#red'Chocolate4',#brown'grey',#grey'black']#黑色self.setgui()defsetgui(self):#GUI界面self.root=Tk()self.root.title('Minesweeper')self.restlabel=Label(self.root,text=f'剩余:{self.minenum}')self.restlabel.grid(row=0,column=0,columnspan=3)self.mineplace=random.sample(range(self.width*self.height),self.minenum)#随机抽取地雷self.mineplace=[(x%self.width,x//self.height)forxinself.mineplace]#将地雷序号转换为坐标self.mines={}foryinrange(self.height):forxinrange(self.width):self.mines[(x,y)]=self.minebtn(self.root,xy=(x,y),font=('黑体',8,'bold'),width=2,bd=1,relief='ridge')self.mines[(x,y)].bind('',lambdaevent:self._open(事件.widget))#左键点击打开self.mines[(x,y)].bind('',lambdaevent:self.make(event.widget))#右击事件self.地雷[(x,y)].grid(row=y+1,column=x,sticky='nswe')self.root.mainloop()#点击打开def_open(self,widget):xy=widget.xyx=xy[0]y=xy[1]#获取当前buttonCoordinates#如果是地雷,则显示所有地雷的位置ifwidget.xyinself.mineplace:self.showmine()return#如果已经点击,则什么都不做ifwidget._state==1:returnwidget.configure(relief='flat',bg='white')#改变当前按钮的样式widget._state=1#按钮状态设置为点击#获取周围八个地雷的坐标=[(x-1,y-1),(x,y-1),(x+1,y-1),(x-1,y),(x+1,y),(x-1,y+1),(x,y+1),(x+1,y+1)]_sum=0around_=[]foro,pinaround:#排除雷区外的地雷if0<=o<=self.width-1and0<=p<=self.height-1:around_.append((o,p))#计算周围的地雷数量ifself.mines[(o,p)].xyinself.mineplace:_sum+=1#如果周围没有地雷,打开周围没有标记的地雷,直到有地雷if_sum==0:widget['text']=''fori,jinaround:ifself.mines[(i,j)]._state==0:self._open(self.mines[(i,j)])else:widget['text']=_sum#显示矿编号#对应编号设置对应颜色widget['fg']=self.colorlist[_sum-1]#右键设置标记/问号defmake(self,widget):string={0:'',2:'',3:'?'}如果widget._state==0:widget._state=2widget['text']=string[2]self.rest-=1self.restlabel['text']=f'rest:{self.rest}'elifwidget._state==2:widget._state=3widget['text']=string[3]self.rest+=1self.restlabel['text']=f'rest:{self.rest}'elifwidget._state==3:widget._state=0widget['text']=string[0]#如果踩到地雷,显示所有地雷defshowmine(self):fori,jinself.mineplace:self.mines[(i,j)].configure(text='?',fg='red')main()因为这个h5游戏比较简单,也有游戏可以参考,所以相对没有那么难,代码也没有那么多。希望你能理解!