-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcell.py
128 lines (110 loc) · 3.9 KB
/
cell.py
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
from tkinter import *
import settings
import random
from tkinter import messagebox #as messagebox
import sys
class Cell:
all = []
cell_count_label_object = None
cell_count = settings.CELL_COUNT
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.is_opened = False
self.is_mine_candidate = False
# append the object to the cell.all list
Cell.all.append(self)
def create_btn_object(self, location):
btn = Button(
location,
width=12,
height=4,
)
btn.bind('<Button-1>', self.left_click_actions)
btn.bind('<Button-3>', self.right_click_actions)
self.cell_btn_object = btn
@staticmethod
def create_cell_count_label(location):
lbl = Label(
location,
bg="black",
fg="white",
text=f"Cells Left:{Cell.cell_count}",
width=12,
height=4,
font=("", 24)
)
Cell.cell_count_label_object = lbl
def left_click_actions(self, event):
if self.is_mine:
self.show_mine()
else:
self.show_cell()
if self.surrounded_cells_mines_length == 0:
for cell_object in self.surrounded_cells:
cell_object.show_cell()
if Cell.cell_count == settings.MINES_COUNT:
messagebox.showinfo("Game Over!", "Congratulations, You have won the game!")
sys.exit()
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 and 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):
counter = 0
for cell in self.surrounded_cells:
if cell.is_mine:
counter += 1
return counter
def show_cell(self):
if not self.is_opened:
Cell.cell_count -= 1
self.cell_btn_object.configure(
text=self.surrounded_cells_mines_length)
if Cell.cell_count_label_object:
Cell.cell_count_label_object.configure(
text=f"Cells Left:{Cell.cell_count}")
self.is_opened = True
self.cell_btn_object.configure(bg='#d9d9d9')
def show_mine(self):
self.cell_btn_object.configure(bg='red')
#ctypes.windll.user32.MessageBoxW(0, 'You clicked on a mine!', 'Game Over!', 0)
messagebox.showinfo("Game Over!", "You have clicked on a mine!")
sys.exit()
def right_click_actions(self, event):
if not self.is_mine_candidate:
self.cell_btn_object.configure(bg='orange')
self.is_mine_candidate = True
else:
self.cell_btn_object.configure(bg='#d9d9d9')
self.is_mine_candidate=False
@staticmethod
def randomize_mines():
picked_cells = random.sample(
Cell.all, settings.MINES_COUNT
)
print(picked_cells)
for picked_cell in picked_cells:
picked_cell.is_mine = True
def __repr__(self):
return f"Cell({self.x}, {self.y})"