背景需求
之前用了很长时间生成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
暂无评论内容