Python 小游戏实战:打造视觉精美的数独小游戏

数独游戏的基本逻辑

数独游戏的核心在于生成有效的数独谜题并验证玩家输入。数独棋盘是一个9x9的网格,分为9个3x3的小宫格。每个格子需要填入1-9的数字,且每行、每列和每个小宫格内的数字不能重复。

生成数独谜题通常采用回溯算法,先填充完整棋盘再随机挖空部分格子作为谜题。验证玩家输入时需要检查行、列和宫格的数字唯一性。

使用Pygame创建图形界面

Pygame是Python中常用的2D游戏开发库,适合创建数独的图形界面。初始化Pygame后,需要设置窗口尺寸、颜色和字体等基本参数。

python 复制代码
import pygame
pygame.init()

# 设置窗口
WIDTH, HEIGHT = 540, 600
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("数独游戏")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
BLUE = (0, 0, 255)

# 字体
font = pygame.font.SysFont("comicsans", 40)

绘制数独棋盘

在Pygame中绘制数独棋盘需要处理网格线和小宫格的加粗显示。使用循环绘制横竖线,并每3条线加粗一次以区分宫格。

python 复制代码
def draw_grid():
    # 绘制细线
    for i in range(10):
        if i % 3 == 0:
            thickness = 4
        else:
            thickness = 1
            
        # 横线
        pygame.draw.line(win, BLACK, (0, i*60), (540, i*60), thickness)
        # 竖线
        pygame.draw.line(win, BLACK, (i*60, 0), (i*60, 540), thickness)

处理用户输入

需要跟踪玩家选中的格子并处理键盘输入。使用二维数组存储棋盘状态,0表示空格。检测鼠标点击位置来确定选中的格子。

python 复制代码
def get_clicked_pos(pos):
    x, y = pos
    row = y // 60
    col = x // 60
    return row, col

selected = None
board = [[0 for _ in range(9)] for _ in range(9)]

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            selected = get_clicked_pos(pos)
            
        if event.type == pygame.KEYDOWN:
            if selected and 1 <= event.key - 48 <= 9:
                row, col = selected
                board[row][col] = event.key - 48

验证数独规则

每次玩家输入数字后,需要验证是否符合数独规则。检查当前数字在行、列和宫格中是否唯一。

python 复制代码
def is_valid(board, num, pos):
    # 检查行
    if num in board[pos[0]]:
        return False
        
    # 检查列
    for i in range(9):
        if board[i][pos[1]] == num:
            return False
            
    # 检查宫格
    box_x = pos[1] // 3
    box_y = pos[0] // 3
    
    for i in range(box_y*3, box_y*3 + 3):
        for j in range(box_x*3, box_x*3 + 3):
            if board[i][j] == num and (i,j) != pos:
                return False
                
    return True

添加游戏状态和按钮

可以添加重新开始和检查答案的按钮,以及显示游戏状态(如胜利或错误提示)。

python 复制代码
def draw_buttons():
    pygame.draw.rect(win, GRAY, (0, 540, 270, 60))
    pygame.draw.rect(win, GRAY, (270, 540, 270, 60))
    
    text = font.render("检查", True, BLACK)
    win.blit(text, (100, 550))
    
    text = font.render("重置", True, BLACK)
    win.blit(text, (370, 550))

主游戏循环

将上述功能整合到主游戏循环中,处理绘图、输入和游戏逻辑。

python 复制代码
while running:
    win.fill(WHITE)
    draw_grid()
    draw_buttons()
    
    # 绘制数字
    for i in range(9):
        for j in range(9):
            if board[i][j] != 0:
                text = font.render(str(board[i][j]), True, BLACK)
                win.blit(text, (j*60 + 20, i*60 + 10))
    
    # 绘制选中框
    if selected:
        pygame.draw.rect(win, BLUE, (selected[1]*60, selected[0]*60, 60, 60), 3)
    
    pygame.display.update()
    
pygame.quit()

进阶优化

可以添加更多功能提升游戏体验:

  • 实现自动生成不同难度的数独谜题
  • 添加计时器和计分系统
  • 实现提示功能
  • 添加音效和更多视觉效果
  • 保存和加载游戏进度

通过以上步骤,可以构建一个功能完整的数独游戏,再根据需求逐步完善和优化各个功能模块。

相关推荐
zh路西法7 分钟前
【双目相机 深度估计】PixelXYZ 3D 双目相机标定与实时深度估计全流程
python·opencv·相机标定·深度估计·双目相机·sgbm
雨落在了我的手上18 分钟前
Java数据结构(九):栈和队列
java·开发语言·数据结构
卷无止境19 分钟前
Python 相对导入与绝对导入的坑:从原理到工程实践
后端·python
FriendshipT22 分钟前
Ultralytics:简要解读YOLOv8 → YOLO11 → YOLO26网络架构
人工智能·pytorch·python·深度学习·yolo·目标检测
BaoshengTT23 分钟前
成都理想贴膜能否分期及汽车贴膜分期行业规则 保圣威固 7V 不凡门店
python·汽车
卷无止境25 分钟前
Python调试那点事儿:从pdb到日志系统的实战指南
后端·python
j7~25 分钟前
【C语言】《C语言自定义类型(结构体+联合体+枚举类型)》--详解
c语言·开发语言·深度学习·结构体·位段·联合体·枚举类型
Escalating_xu36 分钟前
C++11 彻底吃透 emplace_back 与 push_back(最全闭环:左右值|深浅拷贝|移动构造|万能引用|完美转发)
开发语言·c++
正和视觉教育40 分钟前
深圳CCD视觉培训:快速掌握机器视觉检测核心技术
人工智能·python·计算机视觉·视觉检测
axinawang41 分钟前
第16课:编码、解码、转义字符、转义序列、输出格式化
python