【教学类-43-28】20240812 数独3宫格的所有可能 题目docx和答案docx(12套样式,空1格-空8格,每套510+1张,共6120+32小图,实际1032张A4)

背景需求

之前用了很长时间生成3宫格所有样式

【教学类-43-26】20240311 数独3宫格的所有可能(图片版 12套样式,空1格-空8格,每套510张,共6120小图)_3宫格数独练习题目下载-CSDN博客文章浏览阅读1.4k次,点赞36次,收藏24次。【教学类-43-26】20240311 数独3宫格的所有可能(图片版 12套样式,空1格-空8格,每套510张,共6120小图)_3宫格数独练习题目下载https://blog.csdn.net/reasonsummer/article/details/146190184?spm=1011.2415.3001.5331

最近我想把3宫格所有样式和答案一起做出来。一切都要靠完成的AI编程

word模板:

既然要题目和答案,就要在模板上写上题目编号(所以图片格子缩小了8.4CM,单行格子里写图片的信息。整个表格在画布里居中。为了最大,上下左右页边距0.7磅

代码1:批量生成3宫格12种样式*510=6120(实际511图,但最后一张就是9个空格,没必选写)

"""
目的:数独3宫格所有可能样式(题目版+答案版)两套图片,12样式单独题目文件夹或单独答案文件夹里,不分类
作者:deep seek,豆包、阿夏
时间:20240812(优化版)
"""

import os
import itertools
from datetime import datetime
from PIL import Image, ImageDraw, ImageFont

# 开始时间
start_time = datetime.now()

# 参数设置
hs = 3  # 宫格大小
cell_size = 120  # 单元格大小
border_width = 10  # 边框宽度
font_size = 60  # 字体大小
underline_width = 2  # 下划线宽度

# 创建输出目录
base_path = r'C:Usersjg2yXRZOneDrive桌面20250811_3宫格所有可能'
question_dir = os.path.join(base_path, '00题目版')  # 题目版文件夹
answer_dir = os.path.join(base_path, '01答案版')   # 答案版文件夹
os.makedirs(question_dir, exist_ok=True)
os.makedirs(answer_dir, exist_ok=True)

def generate_valid_patterns():
    """生成所有有效的3x3数独基础样式"""
    numbers = [1, 2, 3]
    permutations_list = list(itertools.permutations(numbers))
    
    # 生成所有可能的3行组合
    row_combinations = list(itertools.product(permutations_list, repeat=3))
    
    valid_patterns = []
    for combo in row_combinations:
        grid = [num for row in combo for num in row]
        
        # 验证列
        valid = True
        for col in range(3):
            column = [grid[col+i*3] for i in range(3)]
            if len(set(column)) != 3 or sum(column) != 6:
                valid = False
                break
        
        if valid:
            valid_patterns.append(grid)
    
    # 去重
    unique_patterns = [list(x) for x in set(tuple(p) for p in valid_patterns)]
    return unique_patterns

def create_sudoku_image(grid, output_path, is_answer=False, blanks=None):
    """
    创建数独图片
    :param grid: 数独数据
    :param output_path: 输出路径
    :param is_answer: 是否为答案版
    :param blanks: 空缺位置索引列表
    """
    rows = cols = 3
    canvas_size = cols * cell_size + border_width * 2
    
    # 加载字体(尝试多种字体)
    try:
        font = ImageFont.truetype('arial.ttf', font_size)
    except:
        try:
            font = ImageFont.truetype('arialbd.ttf', font_size)
        except:
            font = ImageFont.load_default()
    
    image = Image.new('RGB', (canvas_size, canvas_size), (255, 255, 255))
    draw = ImageDraw.Draw(image)
    
    # 绘制边框
    draw.rectangle([(0, 0), (canvas_size, canvas_size)], outline=(0, 0, 0), width=border_width)
    
    # 绘制网格线
    for i in range(4):
        pos = border_width + i * cell_size
        draw.line((border_width, pos, canvas_size-border_width, pos), fill=(0, 0, 0))
        draw.line((pos, border_width, pos, canvas_size-border_width), fill=(0, 0, 0))
    
    # 填写数字
    for i, num in enumerate(grid):
        row, col = divmod(i, 3)
        x = border_width + col * cell_size
        y = border_width + row * cell_size
        
        if num != '':
            # 使用textbbox获取更精确的文本尺寸
            bbox = draw.textbbox((0, 0), str(num), font=font)
            text_width = bbox[2] - bbox[0]
            text_height = bbox[3] - bbox[1]
            
            # 计算居中位置
            center_x = x + (cell_size - text_width) // 2
            center_y = y + (cell_size - text_height) // 2 - 15  # 微调垂直位置
            
            # 设置颜色
            if is_answer:
                # 答案版:空缺位置用黑色,其他用灰色
                color = (0, 0, 0) if (blanks and i in blanks) else (192, 192, 192)
            else:
                # 题目版:全部用灰色
                color = (192, 192, 192)
            
      
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容