You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

282 lines
8.9 KiB

import tkinter
import tkinter.messagebox
import random
return_value1 = tkinter.messagebox.askyesnocancel('进入游戏', '请合理安排游戏时间')
if return_value1 == True:
print("good luck祝您玩的开心")
else:
return_value2 = tkinter.messagebox.askyesno('进入游戏', '您真的退出游戏吗?')
if return_value2==True:
print("您取消了进入游戏")
exit()
else:
print("good luck祝您玩的开心")
# 通过路径获取图片
def get_image(filename, w=None, h=None):
try:
im = tkinter.PhotoImage(file=filename)
if w != None and h != None:
im = im.subsample(im.width() // w, im.height() // h)
return im
except:
return None
class Sweep(tkinter.Button):
map = [] # 地图
w = 7 # 地图宽度
h = 8 # 地图高度
mine = 5 # 地雷个数
x0 = 30 # 地图相对于主窗口的起点
y0 = 50
count = 0 # 扫除计数
state = 0 # 0play 1vectroy 2over 游戏状态
mine_size = 40 # 地图方块大小
# 数字0~9的字体颜色rgb
fgs = [(255, 255, 255), (9, 147, 62), (0, 187, 187), (240, 78, 0), (166, 19, 188)
, (185, 122, 87), (136, 0, 21), (163, 73, 164), (0, 0, 0), (0, 0, 0)]
# 方块状态颜色与背景图片
bgs = [(128, 128, 128), (255, 255, 255), (0, 255, 0), (255, 0, 0), (255, 200, 0), (0, 255, 0), (163, 73, 164)]
images = ['area.png', 'opened.png', 'flag.png', 'doubt.png', 'boom.png', 'sweeped.png', 'mistake.png']
pic = []
# 创建地图
def create_map(w=w, h=h, mine=mine, x0=x0, y0=x0,
mine_size=mine_size, fgs=fgs, bgs=bgs, images=images):
Sweep.w = w
Sweep.h = h
Sweep.mine = mine
Sweep.x0 = x0
Sweep.y0 = y0
Sweep.mine_size = mine_size
Sweep.fgs = fgs
Sweep.bgs = bgs
Sweep.images = images
Sweep.state = 0
Sweep.count = 0
# 加载背景图片
if not Sweep.pic:
for filename in Sweep.images:
image = get_image(filename, Sweep.mine_size, Sweep.mine_size)
Sweep.pic.append(image)
def init_map(root):
size_str = '{}x{}+400+80'.format(Sweep.w * Sweep.mine_size + 80, Sweep.h * Sweep.mine_size + 100)
root.geometry(size_str)
Sweep.state = 0
Sweep.count = 0
for button in Sweep.map:
button.destroy()
Sweep.map.clear()
root.update()
random_numbers = random.sample(range(0, Sweep.w * Sweep.h), Sweep.mine)
for i in range(Sweep.w * Sweep.h):
r = i // Sweep.w
c = i % Sweep.w
n = 9 if i in random_numbers else 0
button = Sweep(root)
button.place(x=c * Sweep.mine_size + Sweep.x0, y=r * Sweep.mine_size + Sweep.y0
, width=Sweep.mine_size, height=Sweep.mine_size)
button.setPos(r=r, c=c, n=n)
for mine in Sweep.map:
mine.map_mine()
root.update()
Sweep.reset_map()
def reset_map():
Sweep.state = 0
for mine in Sweep.map:
mine.state = 0
mine.update_style()
def __init__(self, master=None, cnf={}, **kw):
super().__init__(master, cnf, **kw)
self.text = self['text']
self.command = self['command']
self.bind('<Button-1>', self.clicked)
self.bind('<Button-3>', self.right_clicked)
self.r = 0
self.c = 0
self.n = 0
self.state = 0 # 0没有被打开 1已经被打开 2被标志 3被质疑 4打开是雷被爆炸 5被扫除 6标志错误
self.update_style()
self.__class__.map.append(self)
def clicked(self, event):
if self.__class__.state != 0:
# tkinter.messagebox.showinfo(title="游戏结束!",message = "游戏已经结束,请重新开始")
return
if self.state == 1: return
if self.n == 9:
self.gameover()
return
if self.n == 0:
self.auto_sweep()
self.vectory()
return
self.__class__.count += 1
self.state = 1
self.update_style()
self.vectory()
def right_clicked(self, event):
if self.state == 1: return
if self.state == 0:
self.state = 2
elif self.state == 2:
self.state = 3
elif self.state == 3:
self.state = 0
self.update_style()
def setPos(self, r, c, n):
self.r = r
self.c = c
self.n = n
def map_mine(self):
if self.n != 9:
return
neighbors = [(self.r + i, self.c + j) for i in range(-1, 2) for j in range(-1, 2) if i != 0 or j != 0]
for r, c in neighbors:
for mine in self.__class__.map:
if mine.r == r and mine.c == c and mine.n != 9:
mine.n += 1
def update_style(self):
text = str("")
if self.n != 0 and self.n != 9 and self.state == 1: text = str(self.n)
hex_fg = '#{:02x}{:02x}{:02x}'.format(self.__class__.fgs[self.n][0]
, self.__class__.fgs[self.n][1],
self.__class__.fgs[self.n][2])
hex_bg = '#{:02x}{:02x}{:02x}'.format(self.__class__.bgs[self.state][0]
, self.__class__.bgs[self.state][1],
self.__class__.bgs[self.state][2])
image = self.__class__.pic[self.state]
self.image = image
if self.state == 2:
text = str("!")
hex_fg = "red"
elif self.state == 3:
text = str("?")
hex_fg = str("yellow")
elif self.state == 6:
text = str("×")
hex_fg = str("red")
if image != None:
hex_bg = None
self.configure(bg=hex_bg, fg=hex_fg, image=image, text=text, compound=tkinter.CENTER)
def auto_sweep(self):
if self.state == 1: return
self.state = 1
self.update_style()
self.__class__.count += 1
if self.n != 0:
return
neighbors = [(self.r + i, self.c + j) for i in range(-1, 2) for j in range(-1, 2) if i != 0 or j != 0]
for r, c in neighbors:
for mine in self.__class__.map:
if mine.r == r and mine.c == c and mine.n != 9:
mine.clicked(None)
def gameover(self):
self.state = 4
self.__class__.state = 2
for mine in self.__class__.map:
if mine.n == 9 and mine.state != 2:
mine.state = 4
mine.update_style()
elif mine.n != 9 and mine.state == 2:
mine.state = 6
mine.update_style()
img_gif = tkinter.PhotoImage(file='monkeyble.gif')
label_img = tkinter.Label(root, image=img_gif)
label_img.pack()
tkinter.messagebox.showinfo(parent=self, title="游戏结束!", message="失败!")
def vectory(self):
if self.__class__.count == (self.__class__.h * self.__class__.w - self.__class__.mine):
if self.__class__.state != 1:
img_gif = tkinter.PhotoImage(file='monkeyle.gif')
label_img = tkinter.Label(root, image=img_gif)
label_img.pack()
tkinter.messagebox.showinfo("游戏结束!", "恭喜过关!!!")
self.__class__.state = 1
root = tkinter.Tk()
def del_menu(args):
if args == "入门":
Sweep.create_map(w=6, h=5, mine=1)
elif args == "简单":
Sweep.create_map(w=10, h=10, mine=15)
elif args == "一般":
Sweep.create_map(w=16, h=16, mine=40)
elif args == "困难":
Sweep.create_map(w=20, h=16, mine=60)
elif args == "重新开始":
pass
Sweep.init_map(root)
if __name__ == '__main__':
root.title('扫雷')
root.iconbitmap('monkey.ico')
Sweep.create_map(w=6, h=5, mine=3)
Sweep.init_map(root)
menu_bar = tkinter.Menu(root)
root.config(menu=menu_bar)
game_menu = tkinter.Menu(menu_bar, tearoff=False)
menu_bar.add_cascade(label="游戏设置", menu=game_menu)
game_menu.add_command(label="入门", command=lambda: del_menu("入门"))
game_menu.add_command(label="简单", command=lambda: del_menu("简单"))
game_menu.add_command(label="一般", command=lambda: del_menu("一般"))
game_menu.add_command(label="困难", command=lambda: del_menu("困难"))
game_menu.add_command(label="重新开始", command=lambda: del_menu("重新开始"))
# root.iconbitmap('mine.ico')
root.mainloop()