Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # MINESWEEPER MADE QUICK
- # made in an hour
- # Python 3 required
- import tkinter as tk
- from functools import partial
- import random
- root = tk.Tk()
- root.wm_title("MINESWEEPER MADE QUICK")
- root.resizable(width=False, height=False)
- class GameState:
- Play = 0
- Dead = 1
- class Application(tk.Frame):
- def __init__(self, master=None):
- super().__init__(master, height=512, width=512)
- self.pack_propagate(0)
- self.pack(fill=tk.BOTH, expand=1)
- self.width = 8
- self.height = 8
- self.bombs = [[False]*self.width for i in range(self.height)]
- self.explored = [[False]*self.width for i in range(self.height)]
- self.flagged = [[False]*self.width for i in range(self.height)]
- self.widgets = [[None]*self.width for i in range(self.height)]
- self.create_widgets()
- self.state = None
- self.start_new_game()
- def start_new_game(self):
- self.state = GameState.Play
- self.bombs = [[False]*self.width for i in range(self.height)]
- self.explored = [[False]*self.width for i in range(self.height)]
- self.flagged = [[False]*self.width for i in range(self.height)]
- for j in range(self.height):
- for i in range(self.width):
- self.bombs[j][i] = random.random()>0.9
- self.update_board()
- def create_widgets(self):
- for j in range(self.height):
- for i in range(self.width):
- b = tk.Button(self, text=" ", command=partial(self.click, i,j), padx=2, pady=2, width = 2)
- b.grid_propagate(0)
- b.bind("<Button-3>", partial(self.rclick,i,j))
- b.grid(row=j,column=i, sticky=tk.W+tk.E+tk.S + tk.N)
- self.widgets[j][i] = b
- def rclick(self, i, j, event):
- if self.state == GameState.Play:
- self.flagged[j][i] = not self.flagged[j][i]
- self.update_board()
- def click(self, i, j):
- if self.state == GameState.Play:
- button = self.widgets[j][i]
- bomb = self.bombs[j][i]
- self.explored[j][i] = True
- if bomb:
- self.state = GameState.Dead
- self.you_lose()
- else:
- # floodto empty cells
- cells = [(i,j)]
- flooded = [(i,j)]
- while len(cells):
- ci, cj = cells.pop()
- flooded.append((ci,cj))
- self.explored[cj][ci] = True
- for di in [-1,0,1]:
- for dj in [-1,0,1]:
- if abs(di)+abs(dj)!=1: continue
- ni, nj = ci + di, cj + dj
- if 0<=ni<self.width and 0<=nj<self.height:
- if (ni,nj) not in flooded and not self.bombs[nj][ni]:
- count = self.neighbour_bombs(ni,nj)
- if count==0:
- cells.append((ni,nj))
- else:
- self.explored[nj][ni] = True
- self.update_board()
- if self.check_win():
- self.state = GameState.Dead
- self.you_win()
- else:
- self.start_new_game()
- def neighbour_bombs(self, i, j):
- nb = 0
- for di in [-1,0,1]:
- for dj in [-1,0,1]:
- ni, nj = i + di, j + dj
- nb += self.bombs[nj][ni] if (0<=ni<self.width and 0<=nj<self.height) else 0
- return nb
- def update_board(self):
- for j in range(self.height):
- for i in range(self.width):
- button = self.widgets[j][i]
- bomb = self.bombs[j][i]
- if self.state == GameState.Dead:
- if bomb:
- button.config(text = "@")
- else:
- if self.explored[j][i]:
- count = self.neighbour_bombs(i, j)
- button.config(text = count or " ")
- else:
- if self.explored[j][i]:
- if bomb:
- button.config(text = "@")
- else:
- count = self.neighbour_bombs(i, j)
- button.config(text = count or " ")
- button.config(relief=tk.SUNKEN)
- elif self.flagged[j][i]:
- button.config(text = "F")
- else:
- button.config(text = " ")
- button.config(relief=tk.RAISED)
- def check_win(self):
- # only bombs are unexplored
- for j in range(self.height):
- for i in range(self.width):
- explored = self.explored[j][i]
- bomb = self.bombs[j][i]
- if (explored and not bomb) or (bomb and not explored):
- pass
- else:
- return False
- return True
- def you_win(self):
- toplevel = tk.Toplevel()
- label1 = tk.Label(toplevel, text="YOU WIN!", height=3, width=8)
- label1.pack()
- toplevel.focus_set()
- toplevel.transient(root)
- toplevel.grab_set()
- root.wait_window(toplevel)
- def you_lose(self):
- toplevel = tk.Toplevel()
- label1 = tk.Label(toplevel, text="YOU LOSE!", height=3, width=8)
- label1.pack()
- toplevel.focus_set()
- toplevel.transient(root)
- toplevel.grab_set()
- root.wait_window(toplevel)
- app = Application(master=root)
- app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement