用Python编写一个可以运行的带UI界面的扫雷游戏
时间: 2024-02-20 22:01:30 浏览: 64
好的,下面是一个简单的扫雷游戏的Python代码,带有基本的GUI界面,你可以在此基础上进行修改和优化:
```python
import tkinter as tk
import random
class MineSweeper:
def __init__(self, master):
self.master = master
self.master.title('扫雷')
# 游戏界面大小
self.width = 10
self.height = 10
# 雷的数量
self.mines = 10
# 初始化游戏
self.init_game()
# 创建游戏区域
self.area = tk.Frame(self.master)
self.area.pack()
# 创建按钮
self.buttons = []
for i in range(self.width):
row = []
for j in range(self.height):
button = tk.Button(self.area, width=2, height=1, command=lambda i=i, j=j: self.click(i, j))
button.grid(row=i, column=j)
row.append(button)
self.buttons.append(row)
# 创建状态栏
self.status_bar = tk.Label(self.master, text='剩余雷数:{}'.format(self.mines))
self.status_bar.pack()
def init_game(self):
# 初始化雷区
self.grid = [[0 for i in range(self.width)] for j in range(self.height)]
# 随机生成雷
count = 0
while count < self.mines:
x = random.randint(0, self.width - 1)
y = random.randint(0, self.height - 1)
if self.grid[x][y] == 0:
self.grid[x][y] = -1
count += 1
# 计算每个格子周围的雷数
for i in range(self.width):
for j in range(self.height):
if self.grid[i][j] == -1:
continue
count = 0
for m in range(max(0, i - 1), min(i + 2, self.width)):
for n in range(max(0, j - 1), min(j + 2, self.height)):
if self.grid[m][n] == -1:
count += 1
self.grid[i][j] = count
# 初始化游戏状态
self.game_over = False
self.remaining = self.width * self.height - self.mines
def click(self, x, y):
if self.game_over:
return
if self.grid[x][y] == -1:
self.buttons[x][y].config(text='*', bg='red')
self.game_over = True
self.status_bar.config(text='游戏结束')
else:
self.show(x, y)
if self.remaining == 0:
self.game_over = True
self.status_bar.config(text='你赢了')
def show(self, x, y):
if self.buttons[x][y]['state'] == tk.DISABLED:
return
self.buttons[x][y].config(state=tk.DISABLED)
if self.grid[x][y] > 0:
self.buttons[x][y].config(text=str(self.grid[x][y]))
self.remaining -= 1
return
for i in range(max(0, x - 1), min(x + 2, self.width)):
for j in range(max(0, y - 1), min(y + 2, self.height)):
if i == x and j == y:
continue
self.show(i, j)
def restart(self):
for i in range(self.width):
for j in range(self.height):
self.buttons[i][j].config(text='', bg='SystemButtonFace', state=tk.NORMAL)
self.init_game()
self.status_bar.config(text='剩余雷数:{}'.format(self.mines))
if __name__ == '__main__':
root = tk.Tk()
game = MineSweeper(root)
menu = tk.Menu(root)
root.config(menu=menu)
filemenu = tk.Menu(menu)
menu.add_cascade(label='文件', menu=filemenu)
filemenu.add_command(label='重新开始', command=game.restart)
filemenu.add_separator()
filemenu.add_command(label='退出', command=root.quit)
root.mainloop()
```
在这个代码中,我们使用了Tkinter模块创建了一个简单的GUI界面。游戏界面被分成了10x10个格子,其中10个格子被随机设置成雷。当玩家点击格子时,如果该格子是雷,游戏结束;如果该格子不是雷,则显示该格子周围的雷数。当所有的非雷格子都被点击时,玩家获胜。你可以根据自己的需要对代码进行修改和优化。
阅读全文