44from Tkinter import *
55import tkMessageBox
66import random
7+ from collections import deque
78
89class Minesweeper :
910
@@ -45,7 +46,7 @@ def __init__(self, master):
4546 if random .uniform (0.0 , 1.0 ) < 0.1 :
4647 mine = 1
4748 self .mines += 1
48- # 0 = Button
49+ # 0 = Button widget
4950 # 1 = if a mine y/n (1/0)
5051 # 2 = state (0 = unclicked, 1 = clicked, 2 = flagged)
5152 # 3 = button id
@@ -73,56 +74,27 @@ def __init__(self, master):
7374 # find nearby mines and display number on tile
7475 for key in self .buttons :
7576 nearby_mines = 0
76- try :
77- if self .buttons [key - 9 ][1 ] == 1 : #top right
78- nearby_mines += 1
79- except KeyError :
80- pass
81-
82- try :
83- if self .buttons [key - 10 ][1 ] == 1 : #top middle
84- nearby_mines += 1
85- except KeyError :
86- pass
87-
88- try :
89- if self .buttons [key - 11 ][1 ] == 1 : #top left
90- nearby_mines += 1
91- except KeyError :
92- pass
93-
94- try :
95- if self .buttons [key - 1 ][1 ] == 1 : #left
96- nearby_mines += 1
97- except KeyError :
98- pass
99-
100- try :
101- if self .buttons [key + 1 ][1 ] == 1 : #right
102- nearby_mines += 1
103- except KeyError :
104- pass
105-
106- try :
107- if self .buttons [key + 9 ][1 ] == 1 : #bottom left
108- nearby_mines += 1
109- except KeyError :
110- pass
111-
112- try :
113- if self .buttons [key + 10 ][1 ] == 1 : #bottom middle
114- nearby_mines += 1
115- except KeyError :
116- pass
117-
118- try :
119- if self .buttons [key + 11 ][1 ] == 1 : #bottom right
120- nearby_mines += 1
121- except KeyError :
122- pass
123-
77+ if self .check_for_mines (key - 9 ):
78+ nearby_mines += 1
79+ if self .check_for_mines (key - 10 ):
80+ nearby_mines += 1
81+ if self .check_for_mines (key - 11 ):
82+ nearby_mines += 1
83+ if self .check_for_mines (key - 1 ):
84+ nearby_mines += 1
85+ if self .check_for_mines (key + 1 ):
86+ nearby_mines += 1
87+ if self .check_for_mines (key + 9 ):
88+ nearby_mines += 1
89+ if self .check_for_mines (key + 10 ):
90+ nearby_mines += 1
91+ if self .check_for_mines (key + 11 ):
92+ nearby_mines += 1
12493 # store mine count in button data list
12594 self .buttons [key ][5 ] = nearby_mines
95+ #if self.buttons[key][1] != 1:
96+ # if nearby_mines != 0:
97+ # self.buttons[key][0].config(image = self.tile_no[nearby_mines-1])
12698
12799 #add mine and count at the end
128100 self .label2 = Label (frame , text = "Mines: " + str (self .mines ))
@@ -131,6 +103,15 @@ def __init__(self, master):
131103 self .label3 = Label (frame , text = "Flags: " + str (self .flags ))
132104 self .label3 .grid (row = 11 , column = 4 , columnspan = 5 )
133105
106+ ## End of __init__
107+
108+ def check_for_mines (self , key ):
109+ try :
110+ if self .buttons [key ][1 ] == 1 :
111+ return True
112+ except KeyError :
113+ pass
114+
134115 def lclicked_wrapper (self , x ):
135116 return lambda Button : self .lclicked (self .buttons [x ])
136117
@@ -151,12 +132,14 @@ def lclicked(self, button_data):
151132 #change image
152133 if button_data [5 ] == 0 :
153134 button_data [0 ].config (image = self .tile_clicked )
135+ self .clear_empty_tiles (button_data [3 ])
154136 else :
155137 button_data [0 ].config (image = self .tile_no [button_data [5 ]- 1 ])
156138 # if not already set as clicked, change state and count
157139 if button_data [2 ] != 1 :
158140 button_data [2 ] = 1
159141 self .clicked += 1
142+ print self .clicked
160143 if self .clicked == 100 - self .mines :
161144 self .victory ()
162145
@@ -182,6 +165,33 @@ def rclicked(self, button_data):
182165 self .flags -= 1
183166 self .update_flags ()
184167
168+ def check_tile (self , key , queue ):
169+ try :
170+ if self .buttons [key ][2 ] == 0 :
171+ if self .buttons [key ][5 ] == 0 :
172+ self .buttons [key ][0 ].config (image = self .tile_clicked )
173+ queue .append (key )
174+ else :
175+ self .buttons [key ][0 ].config (image = self .tile_no [self .buttons [key ][5 ]- 1 ])
176+ self .buttons [key ][2 ] = 1
177+ self .clicked += 1
178+ except KeyError :
179+ pass
180+
181+ def clear_empty_tiles (self , main_key ):
182+ queue = deque ([main_key ])
183+
184+ while len (queue ) != 0 :
185+ key = queue .popleft ()
186+ self .check_tile (key - 9 , queue ) #top right
187+ self .check_tile (key - 10 , queue ) #top middle
188+ self .check_tile (key - 11 , queue ) #top left
189+ self .check_tile (key - 1 , queue ) #left
190+ self .check_tile (key + 1 , queue ) #right
191+ self .check_tile (key + 9 , queue ) #bottom right
192+ self .check_tile (key + 10 , queue ) #bottom middle
193+ self .check_tile (key + 11 , queue ) #bottom left
194+
185195 def gameover (self ):
186196 tkMessageBox .showinfo ("Game Over" , "You Lose!" )
187197 global root
0 commit comments