-
Notifications
You must be signed in to change notification settings - Fork 0
/
minesweeper
119 lines (106 loc) · 4.11 KB
/
minesweeper
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
import random
import re
class Board:
def __init__(self,dim_size,num_bombs):
self.dim_size=dim_size
self.num_bombs=num_bombs
self.board=self.make_new_board()
self.assign_values_to_board()
self.dug=set()
def make_new_board(self):
board=[[None for _ in range(self.dim_size)] for _ in range(self.dim_size)]
bombs_planted=0
while bombs_planted < self.num_bombs:
loc=random.randint(0,self.dim_size**2 - 1)
row=loc//self.dim_size
col=loc % self.dim_size
if board[row][col]=='*':
continue
board[row][col]='*'
bombs_planted+=1
return board
def assign_values_to_board(self):
for r in range(self.dim_size):
for c in range(self.dim_size):
if self.board[r][c]=='*':
continue
self.board[r][c]=self.get_num_neighboring_bombs(r,c)
def get_num_neighboring_bombs(self,row,col):
num_neighboring_bombs=0
for r in range(max(0,row-1),min(self.dim_size-1,row+1)+1):
for c in range(max(0,col-1),min(self.dim_size-1,col+1)+1):
if r==row and c==col:
#our orginal location , dont check
continue
if self.board[r][c]=='*':
num_neighboring_bombs+=1
return num_neighboring_bombs
def dig(self,row,col):
self.dug.add((row,col))
if self.board[row][col]=='*':
return False
elif self.board[row][col]>0:
return True
# self.board[row][col]==0
for r in range(max(0,row-1),min(self.dim_size-1,row+1)+1):
for c in range(max(0,col-1),min(self.dim_size-1,col+1)+1):
if (r,c) in self.dug:
continue
self.dig(r,c)
return True
def __str__(self):
visible_board=[[None for _ in range(self.dim_size)] for _ in range(self.dim_size)]
for row in range(self.dim_size):
for col in range(self.dim_size):
if (row,col) in self.dug:
visible_board[row][col]=str(self.board[row][col])
else:
visible_board[row][col]=' '
#put this together in a string
string_rep=''
widths=[]
for idx in range(self.dim_size):
columns=map(lambda x:x[idx], visible_board)
widths.append(len(max(columns,key=len)))
#print the csv strings
indices=[i for i in range(self.dim_size)]
indices_row=' '
cells=[]
for idx,col in enumerate(indices):
format = '%-' + str(widths[idx])+"s"
cells.append(format%(col))
indices_row+=' '.join(cells)
indices_row+=' \n'
for i in range(len(visible_board)):
row=visible_board[i]
string_rep+=f'{i} |'
cells=[]
for idx,col in enumerate(row):
format = '%-'+str(widths[idx])+"s"
cells.append(format%(col))
string_rep+=' |'.join(cells)
string_rep+=' |\n'
str_len= int(len(string_rep)/self.dim_size)
string_rep=indices_row + '-'*str_len+'\n'+string_rep+'-'*str_len
return string_rep
def play(dim_size=10,num_bombs=10):
board=Board(dim_size,num_bombs)
safe=True
while len(board.dug)<board.dim_size**2 -num_bombs:
print(board)
user_input=re.split(',(\\s)*',input("where would you like to dig?input as row,col: "))
row,col=int(user_input[0]),int(user_input[-1])
if row<0 or row>=board.dim_size or col<0 or col>=dim_size:
print("invalid location . try again.")
continue
safe=board.dig(row,col)
if not safe:
break
if safe:
print("congratulations!!!you are victorious!")
else:
print("sorry game over :(")
board.dug=[(r,c) for r in range(board.dim_size) for c in range(board.dim_size)]
print(board)
if __name__=='__main__':
play()