以下是一个清新简约的Python数独游戏视觉优化方案,使用Pygame实现:

import pygame
import sys
import random

# 初始化
pygame.init()
WIDTH, HEIGHT = 540, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简约数独")

# 调色板
BACKGROUND = (249, 251, 253)  # 浅蓝背景
GRID_LINES = (200, 212, 225)   # 灰蓝网格线
CELL_BG = (255, 255, 255)      # 白色单元格
ACCENT = (79, 174, 255)        # 蓝色强调色
TEXT = (50, 50, 80)            # 深蓝文字
SELECTED = (230, 243, 255)     # 选中高亮

# 字体
font = pygame.font.SysFont("microsoftyahei", 40)
small_font = pygame.font.SysFont("microsoftyahei", 24)

class SudokuGenerator:
    def __init__(self):
        self.board = [[0]*9 for _ in range(9)]
        self.generate_puzzle()
    
    def generate_puzzle(self):
        # 生成逻辑(简化版)
        base = 3
        side = base*base
        nums = random.sample(range(1, side+1), side)
        self.board = [[nums[(base*(r%base)+r//base+c)%side] 
                      for c in range(side)] for r in range(side)]
        
        # 随机挖空
        empties = random.randint(40, 50)
        for _ in range(empties):
            r, c = random.randint(0,8), random.randint(0,8)
            self.board[r][c] = 0

class Game:
    def __init__(self):
        self.generator = SudokuGenerator()
        self.board = self.generator.board
        self.selected = None
        self.cell_size = 60
        self.grid_pos = (20, 20)
    
    def draw(self):
        # 绘制背景
        screen.fill(BACKGROUND)
        
        # 绘制网格
        for i in range(10):
            # 粗线分隔3x3宫格
            line_width = 3 if i % 3 == 0 else 1
            pygame.draw.line(screen, GRID_LINES, 
                           (self.grid_pos[0], self.grid_pos[1] + i*self.cell_size),
                           (self.grid_pos[0] + 9*self.cell_size, self.grid_pos[1] + i*self.cell_size),
                           line_width)
            pygame.draw.line(screen, GRID_LINES, 
                           (self.grid_pos[0] + i*self.cell_size, self.grid_pos[1]),
                           (self.grid_pos[0] + i*self.cell_size, self.grid_pos[1] + 9*self.cell_size),
                           line_width)
        
        # 绘制数字
        for r in range(9):
            for c in range(9):
                if self.board[r][c] != 0:
                    # 选中单元格高亮
                    if self.selected and self.selected == (r, c):
                        pygame.draw.rect(screen, SELECTED, 
                                      (self.grid_pos[0] + c*self.cell_size,
                                       self.grid_pos[1] + r*self.cell_size,
                                       self.cell_size, self.cell_size))
                    
                    # 绘制数字
                    text = font.render(str(self.board[r][c]), True, TEXT)
                    text_rect = text.get_rect(center=(
                        self.grid_pos[0] + c*self.cell_size + self.cell_size//2,
                        self.grid_pos[1] + r*self.cell_size + self.cell_size//2
                    ))
                    screen.blit(text, text_rect)
        
        # 绘制标题
        title = font.render("简约数独", True, ACCENT)
        screen.blit(title, (WIDTH//2 - title.get_width()//2, HEIGHT - 60))
    
    def select_cell(self, pos):
        x, y = pos[0] - self.grid_pos[0], pos[1] - self.grid_pos[1]
        if 0 <= x < 9*self.cell_size and 0 <= y < 9*self.cell_size:
            self.selected = (y // self.cell_size, x // self.cell_size)
    
    def place_number(self, num):
        if self.selected:
            r, c = self.selected
            self.board[r][c] = num

# 主游戏循环
def main():
    game = Game()
    clock = pygame.time.Clock()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            
            if event.type == pygame.MOUSEBUTTONDOWN:
                game.select_cell(event.pos)
            
            if event.type == pygame.KEYDOWN:
                if event.key in range(pygame.K_1, pygame.K_9+1):
                    game.place_number(event.key - pygame.K_0)
                elif event.key == pygame.K_r:  # 重置
                    game = Game()
        
        game.draw()
        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()

设计特点:

  1. 色彩方案

    • 浅蓝背景 ($\text{RGB}(249,251,253)$) 提供柔和视觉体验
    • 灰蓝网格线 ($\text{RGB}(200,212,225)$) 确保清晰不刺眼
    • 蓝色强调色 ($\text{RGB}(79,174,255)$) 用于标题和交互元素
  2. 视觉层次

    graph TD
    A[背景层] --> B[网格层]
    B --> C[单元格层]
    C --> D[数字层]
    D --> E[交互层]
    

  3. 交互优化

    • 选中单元格浅蓝高亮 ($\text{RGB}(230,243,255)$)
    • 3x3宫格边界加粗
    • 响应式数字输入
  4. 字体选择

    • 主数字:微软雅黑40pt
    • 标题:微软雅黑40pt蓝色
  5. 空间布局

    • 单元格尺寸:60x60像素
    • 整体居中布局
    • 底部留白放置标题

使用说明:

  1. 点击选择单元格
  2. 按数字键1-9填入数字
  3. 按R键重置游戏
  4. 关闭窗口退出游戏

此设计遵循简约原则,移除所有冗余元素,通过色彩对比和空间留白创造清晰视觉层次,同时保持功能完整性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐