Minesweeper game instance code based on Python implementation
- 2020-04-02 13:56:03
- OfStack
The example in this paper refers to the MVC pattern, the core data is the model, and 1 matrix is maintained. 0 table has no thunder, 1 table has no thunder, and -1 table has been detected.
This example USES python's tkinter to do GUI, because did not consider the usability problem, so the UI is ugly, pygame is more interesting, more powerful and better to see, do these small games more appropriate, interested readers can try!
The specific functional code is as follows:
# -*- coding: utf-8 -*-
import random
import sys
from Tkinter import *
class Model:
"""
Core data class, maintaining a matrix
"""
def __init__(self,row,col):
self.width=col
self.height=row
self.items=[[0 for c in range(col)] for r in range(row)]
def setItemValue(self,r,c,value):
"""
Set the value of a location to value
"""
self.items[r][c]=value;
def checkValue(self,r,c,value):
"""
Detects if a value at a location is value
"""
if self.items[r][c]!=-1 and self.items[r][c]==value:
self.items[r][c]=-1 # It has been tested
return True
else:
return False
def countValue(self,r,c,value):
"""
I'm going to count around a certain location 8 Where, the value is value The number of
"""
count=0
if r-1>=0 and c-1>=0:
if self.items[r-1][c-1]==1:count+=1
if r-1>=0 and c>=0:
if self.items[r-1][c]==1:count+=1
if r-1>=0 and c+1<=self.width-1:
if self.items[r-1][c+1]==1:count+=1
if c-1>=0:
if self.items[r][c-1]==1:count+=1
if c+1<=self.width-1 :
if self.items[r][c+1]==1:count+=1
if r+1<=self.height-1 and c-1>=0:
if self.items[r+1][c-1]==1:count+=1
if r+1<=self.height-1 :
if self.items[r+1][c]==1:count+=1
if r+1<=self.height-1 and c+1<=self.width-1:
if self.items[r+1][c+1]==1:count+=1
return count
class Mines(Frame):
def __init__(self,m,master=None):
Frame.__init__(self,master)
self.model=m
self.initmine()
self.grid()
self.createWidgets()
def createWidgets(self):
#top=self.winfo_toplevel()
#top.rowconfigure(self.model.height*2,weight=1)
#top.columnconfigure(self.model.width*2,weight=1)
self.rowconfigure(self.model.height,weight=1)
self.columnconfigure(self.model.width,weight=1)
self.buttongroups=[[Button(self,height=1,width=2) for i in range(self.model.width)]
for j in range(self.model.height)]
for r in range(self.model.width):
for c in range(self.model.height):
self.buttongroups[r][c].grid(row=r,column=c)
self.buttongroups[r][c].bind('<Button-1>',self.clickevent)
self.buttongroups[r][c]['padx']=r
self.buttongroups[r][c]['pady']=c
def showall(self):
for r in range(model.height):
for c in range(model.width):
self.showone(r,c)
def showone(self,r,c):
if model.checkValue(r,c,0):
self.buttongroups[r][c]['text']=model.countValue(r,c,1)
else:
self.buttongroups[r][c]['text']='Mines'
def recureshow(self,r,c):
if 0<=r<=self.model.height-1 and 0<=c<=self.model.width-1:
if model.checkValue(r,c,0) and model.countValue(r,c,1)==0:
self.buttongroups[r][c]['text']=''
self.recureshow(r-1,c-1)
self.recureshow(r-1,c)
self.recureshow(r-1,c+1)
self.recureshow(r,c-1)
self.recureshow(r,c+1)
self.recureshow(r+1,c-1)
self.recureshow(r+1,c)
self.recureshow(r+1,c+1)
elif model.countValue(r,c,1)!=0:
self.buttongroups[r][c]['text']=model.countValue(r,c,1)
else:
pass
def clickevent(self,event):
"""
Click on the event
case 1: It's thunder. It's all on display. Game over
case 2: Is the number of surrounding thunder 0 Recursively fires around 8 a button Click event of
case 3: The number of surrounding thunder is not 0 Shows the number of surrounding thunder
"""
r=int(str(event.widget['padx']))
c=int(str(event.widget['pady']))
if model.checkValue(r,c,1):# Is the thunder
self.showall()
else:# Not the thunder
self.recureshow(r,c)
def initmine(self):
"""
mine , Each row of buried height/width+2 A tentative
"""
r=random.randint(1,model.height/model.width+2)
for r in range(model.height):
for i in range(2):
rancol=random.randint(0,model.width-1)
model.setItemValue(r,rancol,1)
def printf(self):
"""
print
"""
for r in range(model.height):
for c in range(model.width):
print model.items[r][c],
print '/n'
def new(self):
"""
Start the game again
"""
pass
if __name__=='__main__':
model=Model(10,10)
root=Tk()
#menu
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New",command=new)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
#Mines
m=Mines(model,root)
#m.printf()
root.mainloop()