吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2098|回复: 45
收起左侧

[Python 原创] 用python制作扫雷

  [复制链接]
Xudaxian001 发表于 2023-12-16 22:28
本帖最后由 苏紫方璇 于 2023-12-17 13:40 编辑

image.png image.png
这是一个扫雷模板,j.mp3, xxj.mp3, yhhmgn.mp3为音频素材

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()

免费评分

参与人数 13吾爱币 +19 热心值 +13 收起 理由
Richardliuy + 1 + 1 用心讨论,共获提升!
qdfxy + 1 + 1 谢谢@Thanks!
bevace + 1 + 1 我很赞同!
w220913 + 1 + 1 我很赞同!
random1 + 1 + 1 谢谢@Thanks!
yjn866y + 1 + 1 热心回复!
la2000 + 1 + 1 哈哈哈哈不错不错
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
blindcat + 1 + 1 谢谢@Thanks!
qiaoyong + 1 + 1 热心回复!
为之奈何? + 1 + 1 我很赞同!
chinawolf2000 + 1 + 1 热心回复!
lspghs9.10plus + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

devilpanama 发表于 2023-12-16 23:18
开庭带上程序源码
三滑稽甲苯 发表于 2023-12-16 22:35
代码的格式有点小问题)另外,我对 lz 的音效很感兴趣
FruitBaby 发表于 2023-12-16 23:01
bananas12138 发表于 2023-12-16 23:09
正在学习Python,感觉不错
alovvvv 发表于 2023-12-16 23:22
谢谢分享
wudijianyu 发表于 2023-12-16 23:27
厉害了,学习一下
yyzzy 发表于 2023-12-16 23:27
开始学习
godlead 发表于 2023-12-16 23:33
这个有意思
zybird 发表于 2023-12-17 00:04
学习一下!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表