Skip to content

Commit c172329

Browse files
committed
v0.5 Functional version of the game, now with extra bugs for your entertainment
1 parent c94aad2 commit c172329

File tree

2 files changed

+67
-51
lines changed

2 files changed

+67
-51
lines changed

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
Python Tkinter Minesweeper v0.2.4
1+
Python Tkinter Minesweeper v0.5
22
===========================
33

44
Minesweeper game written in Python using Tkinter GUI library.
55

6+
Known bugs:
7+
----------
8+
- Tiles cleared from nearby "clean" areas if there is only one mine in between
9+
- Occasionally mine numbers are displayed incorrectly (1 above actual) at the edges
10+
611
Contents:
712
----------
813

@@ -12,7 +17,8 @@ Contents:
1217

1318
To Do:
1419
----------
15-
- Clear all nearby tiles with 0 mine counter when a non-mine tile is clicked
20+
- Fix bugs
21+
- Clean up duplicate code
1622
- Have specific number of mines, rather than random
1723
- Time counter
1824
- Highscore table

minesweeper.py

Lines changed: 59 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from Tkinter import *
55
import tkMessageBox
66
import random
7+
from collections import deque
78

89
class 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

Comments
 (0)