from random import randrange
from graphics import *
from unit import Unit
from button import Button
class Mine:
def __init__(self,win,xmin,ymin,xmax,ymax):
self.direc = [[0,1],[1,0],[0,-1],[-1,0],
[1,1],[1,-1],[-1,1],[-1,-1]]
rec = Rectangle(Point(xmin,ymin),Point(xmax,ymax))
rec.setWidth(2)
rec.draw(win)
dx,dy = (xmax-xmin)/30.0,(ymax-ymin)/16.0
self.list = []
for i in range(18):
self.list.append([])
for j in range(32):
self.list[i].append(Unit())
if (i in range(1,17))and(j in range(1,31)):
self.list[i][j].locate(win,i,j,xmin,ymin,dx)
else:
self.list[i][j].opened = 1
self.win = win
self.xmin,self.ymin,self.xmax,self.ymax = xmin,ymin,xmax,ymax
self.dx,self.dy = dx,dy
self.sele = [0,0]
def createDisplay(self,xmin,ymin,xmax,ymax):
self.Display = Button(self.win,xmin,ymin,xmax,ymax,99)
self.Display.activate()
def createButtonQuit(self,xmin,ymin,xmax,ymax):
self.Quit = Button(self.win,xmin,ymin,xmax,ymax,'Quit')
self.Quit.activate()
def createButtonReset(self,xmin,ymin,xmax,ymax):
self.Reset = Button(self.win,xmin,ymin,xmax,ymax,'Reset')
self.Reset.activate()
def reset(self):
self.Open.deactivate()
self.Sweep.deactivate()
self.Mark.deactivate()
self.Unmark.deactivate()
for i in range(1,17):
for j in range(1,31):
self.list[i][j].reset()
self.Display.setLabel(99)
for n in range(1,100):
i,j = randrange(1,17),randrange(1,31)
while self.list[i][j].whetherBomb:
i,j = randrange(1,17),randrange(1,31)
self.list[i][j].whetherBomb = 1
for i in range(1,17):
for j in range(1,31):
if self.list[i][j].whetherBomb==0:
for d in self.direc:
self.list[i][j].aroundBombnum+=self.list[i+d[0]][j+d[1]].whetherBomb
## for i in range(1,17):
## for j in range(1,31):
## self.list[i][j].unfold()
## self.list[i][j].drawBomb()
def createButtonOpen(self,xmin,ymin,xmax,ymax):
self.Open = Button(self.win,xmin,ymin,xmax,ymax,'Open')
def unfold(self,i,j):
self.list[i][j].unfold()
if self.list[i][j].whetherBomb:
self.openerror()
elif self.list[i][j].aroundBombnum==0:
self.openaround()
def createButtonSweep(self,xmin,ymin,xmax,ymax):
self.Sweep = Button(self.win,xmin,ymin,xmax,ymax,'Sweep')
def sweep(self):
i,j = self.sele[0],self.sele[1]
b = True
for d in self.direc:
s,t = i+d[0],j+d[1]
if self.list[s][t].marked:
b = b and self.list[s][t].whetherBomb
if b:
for d in self.direc:
s,t = i+d[0],j+d[1]
if self.list[s][t].marked==0:
self.unfold(s,t)
else:
self.sweeperror()
def createButtonMark(self,xmin,ymin,xmax,ymax):
self.Mark = Button(self.win,xmin,ymin,xmax,ymax,'Mark')
def mark(self):
self.list[self.sele[0]][self.sele[1]].drawFlag()
self.Display.setLabel(self.Display.getLabel()-1)
if self.Display.getLabel()==0:
b = True
for i in range(1,17):
for j in range(1,31):
b = b and (self.list[i][j].opened or self.list[i][j].marked)
if b:
self.win()
self.Mark.deactivate()
self.Unmark.activate()
def createButtonUnmark(self,xmin,ymin,xmax,ymax):
self.Unmark = Button(self.win,xmin,ymin,xmax,ymax,'Unmark')
def unmark(self):
self.list[self.sele[0]][self.sele[1]].undrawFlag()
self.Display.setLabel(self.Display.getLabel()+1)
self.Mark.activate()
self.Unmark.deactivate()
def win(self):
self.Open.deactivate()
self.Sweep.deactivate()
self.Mark.deactivate()
self.Unmark.deactivate()
self.Display.setLabel('Win!')
def openerror(self):
i,j = self.sele[0],self.sele[1]
self.list[i][j].drawBomb()
self.list[i][j].drawError()
self.Open.deactivate()
self.Sweep.deactivate()
self.Mark.deactivate()
self.Unmark.deactivate()
self.Display.setLabel('Over!')
for s in range(1,17):
for t in range(1,31):
if self.list[s][t].whetherBomb and not(self.list[s][t].marked):
self.list[s][t].unfold()
self.list[s][t].drawBomb()
def sweeperror(self):
i,j = self.sele[0],self.sele[1]
for d in self.direc:
s,t = i+d[0],j+d[1]
if not self.list[s][t].opened:
if not(self.list[s][t].whetherBomb or self.list[s][t].marked):
self.unfold(s,t)
if self.list[s][t].whetherBomb and not(self.list[s][t].marked):
self.list[s][t].unfold()
self.list[s][t].drawBomb()
self.list[s][t].drawError()
if not(self.list[s][t].whetherBomb)and self.list[s][t].marked:
self.list[s][t].drawError()
self.Open.deactivate()
self.Sweep.deactivate()
self.Mark.deactivate()
self.Unmark.deactivate()
self.Display.setLabel('Over!')
for s in range(1,17):
for t in range(1,31):
if self.list[s][t].whetherBomb and not(self.list[s][t].marked):
self.list[s][t].unfold()
self.list[s][t].drawBomb()
def clicked(self,p):
return self.xmin<=p.getX()<=self.xmax and self.ymin<=p.getY()<=self.ymax \
and type(self.Display.getLabel())==int
def locate(self,p):
j = int((p.x-self.xmin)/self.dx)+1
i = int((p.y-self.ymin)/self.dy)+1
if self.sele!=[0,0]:
self.list[self.sele[0]][self.sele[1]].unselect()
self.list[i][j].select()
self.sele[0],self.sele[1] = i,j
if self.list[i][j].opened:
self.Open.deactivate()
self.Mark.deactivate()
self.Unmark.deactivate()
if self.list[i][j].aroundBombnum==0:
self.Sweep.deactivate()
else:
unopenednum,markednum = 0,0
for d in self.direc:
if not self.list[i+d[0]][j+d[1]].opened:
unopenednum+=1
if self.list[i+d[0]][j+d[1]].marked:
markednum+=1
if markednum==self.list[i][j].aroundBombnum and markednum<unopenednum:
self.Sweep.activate()
else:
self.Open.activate()
self.Sweep.deactivate()
if not self.list[i][j].marked:
self.Unmark.deactivate()
if self.Display.getLabel()>0:
self.Mark.activate()
else:
self.Mark.deactivate()
if self.list[i][j].marked:
self.Mark.deactivate()
self.Unmark.activate()
def process(self,p):
if self.clicked(p):
self.locate(p)
if self.Reset.clicked(p):
self.reset()
if self.Mark.clicked(p):
self.mark()