Advertisement
eigenbom

Minesweeper made quick

Feb 6th, 2017
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.87 KB | None | 0 0
  1. # MINESWEEPER MADE QUICK
  2. # made in an hour
  3. # Python 3 required
  4.  
  5. import tkinter as tk
  6. from functools import partial
  7. import random
  8.  
  9. root = tk.Tk()
  10. root.wm_title("MINESWEEPER MADE QUICK")
  11. root.resizable(width=False, height=False)
  12.  
  13. class GameState:
  14.     Play = 0
  15.     Dead = 1
  16.  
  17. class Application(tk.Frame):
  18.     def __init__(self, master=None):
  19.         super().__init__(master, height=512, width=512)
  20.         self.pack_propagate(0)
  21.         self.pack(fill=tk.BOTH, expand=1)
  22.         self.width = 8
  23.         self.height = 8
  24.         self.bombs = [[False]*self.width for i in range(self.height)]      
  25.         self.explored = [[False]*self.width for i in range(self.height)]
  26.         self.flagged = [[False]*self.width for i in range(self.height)]
  27.         self.widgets = [[None]*self.width for i in range(self.height)]
  28.         self.create_widgets()
  29.         self.state = None
  30.         self.start_new_game()
  31.  
  32.     def start_new_game(self):
  33.         self.state = GameState.Play
  34.         self.bombs = [[False]*self.width for i in range(self.height)]      
  35.         self.explored = [[False]*self.width for i in range(self.height)]
  36.         self.flagged = [[False]*self.width for i in range(self.height)]
  37.         for j in range(self.height):
  38.             for i in range(self.width):
  39.                 self.bombs[j][i] = random.random()>0.9
  40.         self.update_board()
  41.        
  42.     def create_widgets(self):
  43.         for j in range(self.height):
  44.             for i in range(self.width):
  45.                 b = tk.Button(self, text=" ", command=partial(self.click, i,j), padx=2, pady=2, width = 2)                
  46.                 b.grid_propagate(0)
  47.                 b.bind("<Button-3>", partial(self.rclick,i,j))
  48.                 b.grid(row=j,column=i, sticky=tk.W+tk.E+tk.S + tk.N)                
  49.                 self.widgets[j][i] = b
  50.    
  51.     def rclick(self, i, j, event):
  52.         if self.state == GameState.Play:
  53.             self.flagged[j][i] = not self.flagged[j][i]
  54.             self.update_board()
  55.  
  56.     def click(self, i, j):
  57.         if self.state == GameState.Play:
  58.             button = self.widgets[j][i]
  59.             bomb = self.bombs[j][i]
  60.             self.explored[j][i] = True
  61.             if bomb:
  62.                 self.state = GameState.Dead            
  63.                 self.you_lose()    
  64.             else:
  65.                 # floodto empty cells
  66.                 cells = [(i,j)]
  67.                 flooded = [(i,j)]
  68.                 while len(cells):
  69.                     ci, cj = cells.pop()
  70.                     flooded.append((ci,cj))
  71.                     self.explored[cj][ci] = True
  72.                     for di in [-1,0,1]:
  73.                         for dj in [-1,0,1]:
  74.                             if abs(di)+abs(dj)!=1: continue
  75.                             ni, nj = ci + di, cj + dj
  76.                             if 0<=ni<self.width and 0<=nj<self.height:
  77.                                 if (ni,nj) not in flooded and not self.bombs[nj][ni]:
  78.                                     count = self.neighbour_bombs(ni,nj)
  79.                                     if count==0:
  80.                                         cells.append((ni,nj))
  81.                                     else:
  82.                                         self.explored[nj][ni] = True            
  83.            
  84.             self.update_board()
  85.             if self.check_win():
  86.                 self.state = GameState.Dead
  87.                 self.you_win()
  88.         else:
  89.             self.start_new_game()
  90.  
  91.     def neighbour_bombs(self, i, j):
  92.         nb = 0
  93.         for di in [-1,0,1]:
  94.             for dj in [-1,0,1]:
  95.                 ni, nj = i + di, j + dj
  96.                 nb += self.bombs[nj][ni] if (0<=ni<self.width and 0<=nj<self.height) else 0
  97.         return nb
  98.  
  99.     def update_board(self):
  100.         for j in range(self.height):
  101.             for i in range(self.width):
  102.                 button = self.widgets[j][i]
  103.                 bomb = self.bombs[j][i]
  104.                 if self.state == GameState.Dead:
  105.                     if bomb:
  106.                         button.config(text = "@")
  107.                     else:
  108.                         if self.explored[j][i]:
  109.                             count = self.neighbour_bombs(i, j)
  110.                             button.config(text = count or " ")
  111.                 else:
  112.                     if self.explored[j][i]:
  113.                         if bomb:
  114.                             button.config(text = "@")
  115.                         else:
  116.                             count = self.neighbour_bombs(i, j)                            
  117.                             button.config(text = count or " ")
  118.                         button.config(relief=tk.SUNKEN)
  119.                     elif self.flagged[j][i]:
  120.                         button.config(text = "F")
  121.                     else:
  122.                         button.config(text = " ")
  123.                         button.config(relief=tk.RAISED)
  124.        
  125.     def check_win(self):
  126.         # only bombs are unexplored
  127.         for j in range(self.height):
  128.             for i in range(self.width):
  129.                 explored = self.explored[j][i]
  130.                 bomb = self.bombs[j][i]
  131.                 if (explored and not bomb) or (bomb and not explored):
  132.                     pass
  133.                 else:
  134.                     return False
  135.         return True
  136.                
  137.     def you_win(self):
  138.         toplevel = tk.Toplevel()
  139.         label1 = tk.Label(toplevel, text="YOU WIN!", height=3, width=8)
  140.         label1.pack()
  141.         toplevel.focus_set()
  142.         toplevel.transient(root)
  143.         toplevel.grab_set()
  144.         root.wait_window(toplevel)
  145.        
  146.     def you_lose(self):
  147.         toplevel = tk.Toplevel()
  148.         label1 = tk.Label(toplevel, text="YOU LOSE!", height=3, width=8)
  149.         label1.pack()
  150.         toplevel.focus_set()
  151.         toplevel.transient(root)
  152.         toplevel.grab_set()
  153.         root.wait_window(toplevel)
  154.  
  155. app = Application(master=root)
  156. app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement