用python扫个雷

9 阅读2分钟

import random import tkinter as tk from tkinter import messagebox import pygame import os

class Minesweeper: def init(self, master, rows, cols, mines): self.master = master self.rows = rows self.cols = cols self.mines = mines self.remaining_mines = mines self.board = [[0 for _ in range(cols)] for _ in range(rows)] self.revealed = [[False for _ in range(cols)] for _ in range(rows)] self.create_widgets() self.load_sounds() def load_sounds(self): # 初始化音效 pygame.mixer.init() self.click_sound = pygame.mixer.Sound("j.mp3") self.win_sound = pygame.mixer.Sound("xxj.mp3") self.lose_sound = pygame.mixer.Sound("yhhmgn.mp3")

def create_widgets(self):
    # 创建按钮
    self.buttons = [[tk.Button(self.master, width=2, height=1, command=lambda r=row, c=col: self.click(r, c))
                     for col in range(self.cols)] for row in range(self.rows)]

    for row in range(self.rows):
        for col in range(self.cols):
            self.buttons[row][col].grid(row=row, column=col, sticky="nsew")
            self.buttons[row][col].bind("<Button-3>", lambda event, r=row, c=col: self.mark_mine(event, r, c))

    # 放置地雷
    self.place_mines()

def place_mines(self):
    mine_count = 0
    while mine_count < self.mines:
        row, col = random.randint(0, self.rows - 1), random.randint(0, self.cols - 1)
        if self.board[row][col] != -1:
            self.board[row][col] = -1
            mine_count += 1
            self.update_adjacent_cells(row, col)

def update_adjacent_cells(self, row, col):
    # 更新相邻的单元格
    for r in range(row - 1, row + 2):
        for c in range(col - 1, col + 2):
            if 0 <= r < self.rows and 0 <= c < self.cols and self.board[r][c] != -1:
                self.board[r][c] += 1

def click(self, row, col):
    # 处理点击事件
    self.click_sound.play()
    if self.board[row][col] == -1:
        self.game_over()
    else:
        self.reveal_cell(row, col)
        if self.check_win():
            self.game_win()

def reveal_cell(self, row, col):
    # 揭示单元格
    if not self.revealed[row][col]:
        self.revealed[row][col] = True
        if self.board[row][col] == 0:
            for r in range(row - 1, row + 2):
                for c in range(col - 1, col + 2):
                    if 0 <= r < self.rows and 0 <= c < self.cols:
                        self.reveal_cell(r, c)

            # 将显示无雷的“0”替换成“鸡”
            self.buttons[row][col].config(text="鸡", state=tk.DISABLED)
        else:
            self.buttons[row][col].config(text=str(self.board[row][col]), state=tk.DISABLED)

def mark_mine(self, event, row, col):
    # 标记地雷
    if not self.revealed[row][col]:
        if self.buttons[row][col]["text"] == "M":
            self.buttons[row][col].config(text="", fg="black")
            self.remaining_mines += 1
        else:
            self.buttons[row][col].config(text="M", fg="red")
            self.remaining_mines -= 1
        if self.check_win():
            self.game_win()

def check_win(self):
    # 检查是否获胜
    for row in range(self.rows):
        for col in range(self.cols):
            if self.board[row][col] == -1 and self.buttons[row][col]["text"] != "M":
                return False
            elif self.board[row][col] != -1 and not self.revealed[row][col]:
                return False
    return True

def game_over(self):
    # 游戏结束处理
    for row in range(self.rows):
        for col in range(self.cols):
            if self.board[row][col] == -1:
                self.buttons[row][col].config(text='X', state=tk.DISABLED)
            else:
                self.buttons[row][col].config(state=tk.DISABLED)
    self.lose_sound.play()
    messagebox.showinfo("Game Over", "你被坤坤鸡败了!")
    self.reset_game()

def game_win(self):
    # 游戏获胜处理
    for row in range(self.rows):
        for col in range(self.cols):
            self.buttons[row][col].config(state=tk.DISABLED)
    self.win_sound.play()
    messagebox.showinfo("Congratulations!", "你打败坤坤了!")
    self.reset_game()

def reset_game(self):
    # 重置游戏
    self.master.destroy()
    new_game = tk.Tk()
    new_game.title("Minesweeper")
    minesweeper_game = Minesweeper(new_game, rows=self.rows, cols=self.cols, mines=self.mines)
    new_game.mainloop()

if name == "main": root = tk.Tk() root.title("Minesweeper") minesweeper_game = Minesweeper(root, rows=8, cols=8, mines=10) root.mainloop()