Python扫雷小游戏代码开源分享
2024-09-08 19:57:02
发布于:浙江
下面是一个使用Python的tkinter库编写的简单扫雷游戏的完整代码。这个版本的扫雷游戏包括基本的游戏逻辑和图形界面。
import tkinter as tk
import random
class Minesweeper:
def __init__(self, root, rows=10, cols=10, mines=10):
self.root = root
self.rows = rows
self.cols = cols
self.mines = mines
self.grid = []
self.revealed = []
self.flags = []
self.init_grid()
self.init_ui()
def init_grid(self):
self.grid = [[0 for _ in range(self.cols)] for _ in range(self.rows)]
self.revealed = [[False for _ in range(self.cols)] for _ in range(self.rows)]
self.flags = [[False for _ in range(self.cols)] for _ in range(self.rows)]
self.place_mines()
self.fill_values()
def place_mines(self):
mines_placed = 0
while mines_placed < self.mines:
r = random.randint(0, self.rows - 1)
c = random.randint(0, self.cols - 1)
if self.grid[r][c] != 'M':
self.grid[r][c] = 'M'
mines_placed += 1
def fill_values(self):
directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
for r in range(self.rows):
for c in range(self.cols):
if self.grid[r][c] == 'M':
continue
mines_count = 0
for dr, dc in directions:
nr, nc = r + dr, c + dc
if 0 <= nr < self.rows and 0 <= nc < self.cols and self.grid[nr][nc] == 'M':
mines_count += 1
self.grid[r][c] = mines_count
def init_ui(self):
self.root.title("Minesweeper")
self.frames = []
for r in range(self.rows):
frame_row = []
for c in range(self.cols):
btn = tk.Button(self.root, text="", width=3, height=1,
command=lambda btn=(r, c): self.reveal(btn))
btn.grid(row=r, column=c)
frame_row.append(btn)
self.frames.append(frame_row)
def reveal(self, cell):
r, c = cell
if self.revealed[r][c]:
return
self.revealed[r][c] = True
if self.grid[r][c] == 'M':
self.frames[r][c].config(text='*', bg='red')
self.reveal_all_mines()
return
self.frames[r][c].config(text=self.grid[r][c])
if self.grid[r][c] == 0:
self.reveal_neighbors(r, c)
def reveal_neighbors(self, r, c):
directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
for dr, dc in directions:
nr, nc = r + dr, c + dc
if 0 <= nr < self.rows and 0 <= nc < self.cols and not self.revealed[nr][nc]:
self.reveal((nr, nc))
def reveal_all_mines(self):
for r in range(self.rows):
for c in range(self.cols):
if self.grid[r][c] == 'M':
self.frames[r][c].config(text='*', bg='red')
def main():
root = tk.Tk()
game = Minesweeper(root, rows=10, cols=10, mines=10)
root.mainloop()
if __name__ == "__main__":
main()
这段代码创建了一个10x10的扫雷游戏,其中包含10个雷。游戏界面使用tkinter构建,玩家可以点击格子来揭示它们,如果点击到雷,则游戏结束并显示所有雷的位置。如果玩家成功揭示所有非雷格子,则获胜。(这个代码并不完善,请大佬们指点)
全部评论 4
我帮你改进了一下:
https://url30.ctfile.com/f/58049230-1354871648-940888?p=(访问密码:354962)
1周前 来自 浙江
0谢谢大佬!
1周前 来自 浙江
0又更新了!新增右键插旗!
获取链接(访问密码:3014159)
19小时前 来自 浙江
0amazing!
14小时前 来自 浙江
0
编译错误: /code/judger/test/1832759779292241920/Main3.py:85:5: local variable 'game' is assigned to but never used
1周前 来自 浙江
0!!!
1周前 来自 浙江
0为什么我运行的了
1周前 来自 浙江
0
我没有Python
1周前 来自 江苏
0请大佬们指点【抱拳】
1周前 来自 浙江
0
有帮助,赞一个