用python写一个有gui界面的扫雷游戏
时间: 2023-12-15 17:03:14 浏览: 28
好的,以下是一个简单的用Python和Tkinter模块编写的扫雷游戏的源代码:
```python
import tkinter as tk
import random
class Minesweeper:
def __init__(self, master):
self.master = master
self.master.title('Minesweeper')
self.width = 10
self.height = 10
self.mines = 10
self.game_over = False
self.create_widgets()
self.create_board()
self.place_mines()
def create_widgets(self):
self.flag_img = tk.PhotoImage(file="flag.gif")
self.bomb_img = tk.PhotoImage(file="bomb.gif")
self.cells = [[None for y in range(self.height)] for x in range(self.width)]
self.buttons = [[None for y in range(self.height)] for x in range(self.width)]
self.status_var = tk.StringVar()
self.status_var.set("Mines: {}".format(self.mines))
self.status_label = tk.Label(self.master, textvariable=self.status_var)
self.status_label.pack(side=tk.TOP)
self.frame = tk.Frame(self.master)
self.frame.pack(side=tk.TOP)
for x in range(self.width):
for y in range(self.height):
button = tk.Button(self.frame, width=2, height=1, command=lambda x=x, y=y:self.cell_clicked(x, y))
button.grid(row=y, column=x)
self.buttons[x][y] = button
def create_board(self):
self.board = [[0 for y in range(self.height)] for x in range(self.width)]
def place_mines(self):
for i in range(self.mines):
while True:
x = random.randint(0, self.width-1)
y = random.randint(0, self.height-1)
if self.board[x][y] == 0:
self.board[x][y] = -1
break
for x in range(self.width):
for y in range(self.height):
if self.board[x][y] != -1:
count = 0
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
if x+dx >= 0 and x+dx < self.width and y+dy >= 0 and y+dy < self.height and self.board[x+dx][y+dy] == -1:
count += 1
self.board[x][y] = count
def cell_clicked(self, x, y):
if self.game_over:
return
if self.board[x][y] == -1:
self.game_over = True
for x in range(self.width):
for y in range(self.height):
if self.board[x][y] == -1:
self.buttons[x][y].config(image=self.bomb_img)
self.status_var.set("Game Over")
return
self.reveal(x, y)
if self.check_win():
self.status_var.set("You Win!")
def reveal(self, x, y):
if self.cells[x][y] != None:
return
if self.board[x][y] == -1:
return
count = self.board[x][y]
text = ""
if count > 0:
text = str(count)
self.cells[x][y] = tk.Label(self.frame, text=text, width=2, height=1)
self.cells[x][y].grid(row=y, column=x)
self.buttons[x][y].config(state=tk.DISABLED)
if count == 0:
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
if x+dx >= 0 and x+dx < self.width and y+dy >= 0 and y+dy < self.height:
self.reveal(x+dx, y+dy)
def check_win(self):
for x in range(self.width):
for y in range(self.height):
if self.board[x][y] != -1 and self.cells[x][y] == None:
return False
return True
root = tk.Tk()
minesweeper = Minesweeper(root)
root.mainloop()
```
这个游戏是一个10x10的扫雷游戏,有10个地雷。你可以通过修改`self.width`、`self.height`和`self.mines`来调整游戏板的大小和地雷的数量。