from random import randrange as rnd, choice, shuffle from tkinter import * import itertools, time, copy import time root = Tk() root.geometry('800x600') canv = Canvas(root, bg = 'white') canv.pack(fill = BOTH, expand = 1) nr = 10 nc = 12 m = 24 y0 = x0 = m class cell(): def __init__(self): self.n = 0 self.bomb = 0 self.mode = 'closed' def new_game(): global a a = [[cell() for c in range(nc)] for r in range(nr)] bomb_count = 18 while bomb_count > 0: r = rnd(nr) c = rnd(nc) if not a[r].bomb: a[r].bomb = 1 bomb_count -= 1 for r in range(nr): for c in range(nc): k = 0 for dr in [-1,0,1]: for dc in [-1,0,1]: rr = r + dr cc = c + dc if rr in range(nr) and cc in range(nc): if a[rr][cc].bomb: k += 1 a[r].n = k paint() def paint(): canv.delete(ALL) for r in range(nr): for c in range(nc): x = x0 + c*m y = y0 + r*m if a[r].mode == 'opened': if not a[r].bomb: canv.create_rectangle(x,y,x+m,y+m, fill = 'white') if a[r].n > 0: canv.create_text(x+m//2,y+m//2, text = a[r].n) else: canv.create_rectangle(x,y,x+m,y+m, fill = 'red') elif a[r].mode == 'closed': canv.create_rectangle(x,y,x+m,y+m, fill = 'gray') elif a[r].mode == 'flag': canv.create_rectangle(x,y,x+m,y+m, fill = 'orange') def cell_change(r,c,button): if a[r].mode == 'closed': if button == 1: time.sleep(0.001) a[r].mode = 'opened' if a[r].n == 0: for dr in [-1,0,1]: for dc in [-1,0,1]: rr = r + dr cc = c + dc if rr in range(nr) and cc in range(nc): paint() canv.update() cell_change(rr,cc,1) if a[r].bomb: print('boom!!!') elif button == 3: a[r].mode = 'flag' elif a[r].mode == 'flag' and button == 3: a[r].mode = 'closed' def click(event): r = (event.y - y0)//m c = (event.x - x0)//m if r in range(nr) and c in range(nc): cell_change(r,c,event.num) paint() new_game() canv.bind('<1>',click) canv.bind('<3>',click) mainloop()