-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcell.py
More file actions
149 lines (122 loc) · 4.58 KB
/
Copy pathcell.py
File metadata and controls
149 lines (122 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
from tkinter import Button, Label
import random
import settings
import ctypes
import sys
class Cell:
all = []
cell_count = settings.CELL_COUNT
cell_count_label_object = None
def __init__(self, x, y, is_mine=False):
self.is_mine = is_mine
self.cell_btn_object = None
self.x = x
self.y = y
self.isShown = False
self.is_mine_check = False
# Append the object to the Cell.all list
Cell.all.append(self)
def create_btn_object(self, location):
btn = Button(
location,
width=settings.CELL_WIDTH,
height=settings.CELL_HEIGHT#,
#text=f'{self.x},{self.y}'
)
btn.bind('<Button-1>', self.left_click_actions) #left click
btn.bind('<Button-3>', self.right_click_actions) # right click
self.cell_btn_object = btn
@staticmethod
def create_cell_count_label(location):
lbl = Label(
location,
bg=settings.BLACK,
fg = settings.WHITE,
width=12,
height=4,
text=f'Cell Left:{Cell.cell_count}',
font=("", 30)
)
Cell.cell_count_label_object = lbl
def left_click_actions(self, event):
def show_near_cells(cl):
for cell_obj in cl.surrounded_cells:
if cell_obj.surrounded_cells_mines_length == 0 and not cell_obj.isShown:
cell_obj.isShown = True
show_near_cells(cell_obj)
cell_obj.show_cell()
# if Mines count is equal to the cells left count, player won
if Cell.cell_count == settings.MINES_COUNT:
ctypes.windll.user32.MessageBoxW(0, 'Congratulations! You have won the game.', 'Game Over', 0)
if self.is_mine:
self.show_mine()
else:
self.show_cell()
if self.surrounded_cells_mines_length == 0:
show_near_cells(self)
# Cancel Left and Right click events if cell is already opened
self.cell_btn_object.unbind('<Button-1>')
self.cell_btn_object.unbind('<Button-3>')
def get_cell_by_axis(self, x, y):
# Return a cell object based on the value of x,y
for cell in Cell.all:
if cell.x == x and cell.y == y:
return cell
@property
def surrounded_cells(self):
cells = [
self.get_cell_by_axis(self.x - 1, self.y - 1),
self.get_cell_by_axis(self.x - 1, self.y),
self.get_cell_by_axis(self.x - 1, self.y + 1),
self.get_cell_by_axis(self.x, self.y - 1),
self.get_cell_by_axis(self.x + 1, self.y - 1),
self.get_cell_by_axis(self.x + 1, self.y),
self.get_cell_by_axis(self.x + 1, self.y + 1),
self.get_cell_by_axis(self.x, self.y + 1),
]
cells = [cell for cell in cells if cell is not None]
return cells
@property
def surrounded_cells_mines_length(self):
return sum(bool(cell.is_mine) for cell in self.surrounded_cells)
def show_cell(self):
if not self.isShown:
Cell.cell_count-=1
self.isShown = True
self.cell_btn_object.configure(text=self.surrounded_cells_mines_length)
# Replace the text of cell count label with the newer count
if Cell.cell_count_label_object:
Cell.cell_count_label_object.configure(
text=f'Cell Left:{Cell.cell_count}'
)
# If this was a mine candidate, then for safety, we should
# configure the background color to SystemButtonFace
self.cell_btn_object.configure(
bg='SystemButtonFace'
)
def show_mine(self):
# A logic do interrupt the game and display a message that player lost!
self.cell_btn_object.configure(bg=settings.RED)
ctypes.windll.user32.MessageBoxW(0, 'You clicked on a mine', 'Game Over', 0)
sys.exit()
def right_click_actions(self, event):
if not self.is_mine_check:
self.cell_btn_object.configure(
bg=settings.ORANGE
)
self.is_mine_check = True
else:
self.cell_btn_object.configure(
bg='SystemButtonFace'
)
self.is_mine_check = False
@staticmethod
def randomize_mines():
picked_cells = random.sample(
Cell.all,
settings.MINES_COUNT
)
for picked_cell in picked_cells:
picked_cell.is_mine = True
def __repr__(self):
return f"Cell({self.x}, {self.y})"