Python 桌面版 数独游戏(一版)

部署运行你感兴趣的模型镜像

设计思路详解:Python 桌面版 数独游戏

1. 功能需求分析
  • 构建一个 9x9 的数独游戏界面。
  • 支持玩家手动输入数字。
  • 提供两个按钮:
    • “重新开始本局”:恢复当前棋盘到初始状态(保留原始数字)。
    • “生成新棋局”:生成一个新的随机数独题目。
  • 使用标准库实现,无需额外安装。

2. 技术选型
  • 使用 tkinter:Python 标准 GUI 库,适合小型桌面应用。
  • 使用 randomcopy:用于生成数独题目和深拷贝原始题目。
  • 采用回溯算法生成完整数独解,再随机移除部分数字生成题目。

3. 核心模块设计
  1. 数独生成器
    • 使用数学规律生成完整解。
    • 随机移除部分数字,生成玩家可玩的题目。
  2. GUI 界面
    • 使用 tkinter.Entry 构建 9x9 网格。
    • 原始数字不可编辑,玩家输入的数字可修改。
  3. 按钮功能
    • “重新开始本局”:恢复当前棋盘状态。
    • “生成新棋局”:调用数独生成器生成新题目并更新界面。

4. 完整代码实现
import tkinter as tk
from tkinter import messagebox
import random
import copy

class SudokuGame:
    def __init__(self, root):
        self.root = root
        self.root.title("数独游戏")
        self.board = []
        self.original = []
        self.entries = [[None for _ in range(9)] for _ in range(9)]
        self.create_widgets()
        self.generate_sudoku()

    def create_widgets(self):
        # 创建数独棋盘
        self.frame = tk.Frame(self.root)
        self.frame.grid(row=0, column=0, padx=10, pady=10)

        for row in range(9):
            for col in range(9):
                entry = tk.Entry(self.frame, width=3, font=('Arial', 18), justify='center')
                entry.grid(row=row, column=col, padx=(0 if col % 3 != 2 else 5),
                           pady=(0 if row % 3 != 2 else 5))
                self.entries[row][col] = entry

        # 按钮
        self.btn_frame = tk.Frame(self.root)
        self.btn_frame.grid(row=1, column=0, pady=10)

        self.reset_button = tk.Button(self.btn_frame, text="重新开始本局", command=self.reset_board)
        self.reset_button.pack(side="left", padx=10)

        self.new_button = tk.Button(self.btn_frame, text="生成新棋局", command=self.generate_sudoku)
        self.new_button.pack(side="left", padx=10)

    def generate_sudoku(self):
        # 生成完整数独解
        base = 3
        side = base * base

        def pattern(r, c): return (base * (r % base) + r // base + c) % side

        from random import sample

        def shuffle(s): return sample(s, len(s))

        rBase = range(base)
        rows = [g * base + r for g in shuffle(rBase) for r in shuffle(rBase)]
        cols = [g * base + c for g in shuffle(rBase) for c in shuffle(rBase)]
        nums = shuffle(range(1, base * base + 1))

        board = [[nums[pattern(r, c)] for c in cols] for r in rows]

        # 移除部分数字,生成题目
        squares = side * side
        for p in sample(range(squares), 40):  # 保留 41 个数字
            board[p // side][p % side] = 0

        self.board = board
        self.original = copy.deepcopy(board)
        self.update_gui()

    def update_gui(self):
        for row in range(9):
            for col in range(9):
                val = self.board[row][col]
                entry = self.entries[row][col]
                entry.delete(0, tk.END)
                if val != 0:
                    entry.insert(0, str(val))
                    entry.config(fg='black', readonlybackground='lightgray')
                    entry.bind("<Key>", lambda e: "break")  # 不可编辑原始数字
                else:
                    entry.config(fg='blue', bg='white')
                    entry.bind("<Key>", self.on_key)

    def on_key(self, event):
        widget = event.widget
        if event.char.isdigit() or event.keysym in ('BackSpace', 'Delete'):
            # 允许输入数字或删除
            pass
        else:
            return "break"

    def reset_board(self):
        self.board = copy.deepcopy(self.original)
        self.update_gui()

# 启动程序
if __name__ == "__main__":
    root = tk.Tk()
    game = SudokuGame(root)
    root.mainloop()

运行说明

  1. 运行环境

    • Python 3.6+
    • 无需额外安装库(使用标准库)
  2. 运行方式

    • 将代码保存为 sudoku_game.py
    • 执行命令:
      python sudoku_game.py
      

功能验证

功能描述
数独生成点击“生成新棋局”按钮,将生成一个新的数独题目
手动输入可以在空白格子中输入数字(蓝色)
重新开始点击“重新开始本局”按钮,将恢复当前题目状态
输入限制原始数字不可编辑(灰色),玩家输入仅限数字

后续扩展功能

功能描述
自动验证点击按钮验证当前解是否正确
提示功能高亮错误数字或给出提示
计时器添加游戏计时功能
难度选择提供简单、中等、困难选项(控制移除数字数量)
格数选择提供3X3,6X6,9X9模式

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉可乐荷包蛋

努力写有用的code

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值