【教学类-43-19】20240113 数独(一) 3-5-6-7-8-10宫格 无空行A4模板

news2025/3/1 13:36:18

作品展示:

3宫格 5宫格 6宫格 7宫格 8宫格 10宫格,题目连在一起

3447ca59c45849b9b6d31a51ac49961a.png

019cf740521641ab94ab594f1d9fda25.png

背景需求:

制作十宫格数独模板,为了凑满20行,删除了每个数独题之间的行列分割线

【教学类-43-18】A4最终版 20240111 数独11.0 十宫格X*Y=Z套(n=10),套用没有分割行列的A4横版模板-CSDN博客文章浏览阅读194次,点赞6次,收藏5次。【教学类-43-18】A4最终版 20240111 数独11.0 十宫格X*Y=Z套(n=10),套用没有分割行列的A4横版模板https://blog.csdn.net/reasonsummer/article/details/135537227375e5328ba5142868984ca391795e640.png

然后我想到平时打印的宫格题有空行空列,虽然看起来清晰,但是剪开后,根本不想再精细修边,有时候让做完题目的孩子把这张数独题目当手工纸,孩子们感觉它不是正方形,大多折叠纸飞机。

bfa90679b8aa4156b6b19f1f8f77b694.png

因此,我希望3-9宫格模板也改成没有分割线的连在一起的样式。

这里先制作3、5、6、7、8、10宫格模板(只能横纵判断)

 

WORD模板修改

1a30d01701014635a76cf7076ff77f4b.png

 

6441744264254b6fae07e5eb2b540919.png80e2428cdfeb463eb1c5c63dccf63e4b.pngf61a7eab22dc4cfa9f0f4ceac8fa8ae3.png4250a49b6166497db79d116d3e179fc9.png

0aaa5012ac6e478098f74ba7986910e2.png

ffad6e783f9d4a0caf1b79e50dff4e69.png6a8287c8ae434510ac213e14cbcc9e98.png

8aca6b75c1624a37902f0b75e4683403.png

代码展示:

# 测试11*11格,2*2一共4套3*3 宫格
'''
目的:数独23 3、5、6、7、8、10宫格X乘Y套,套用没有分栏的A4横版 一页六份连在一起
作者:阿夏(参考)
时间:2024年1月12日 13:35


'''

import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time

import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn


from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor


# 生成题库
import random
import copy

num=int(input('生成几份\n'))
kk=int(input('空格数量,输入5,就是50%,就是空一半)\n'))
# 制作"单元格"# 几宫格
for hs in [3,5,6,7,8,10]:
# hs=int(input('请输入宫格数量(3,5.6,7,8,)\n'))
    
    # 因为有3-9的不同word模板,所以有不同的套数和字体大小
    ll=['3','5','6','7','8','10',] # 如果输入345
    mm=['53','32','32','32','32','32',]# 3对应的套数是4*3套
    nn=['36','36','36','24','24','22']# 3对应的写入单元格的数字大小36磅 
    for r in range(len(ll)):
        if hs ==int(ll[r]):
            # 底边几套.底边看有2份
            db=int(mm[r][0])
            # int(input('底边几套? 3\n'))
            # 侧边几套 侧边看也是2份
            print(db )        
            cb=int(mm[r][1])
            # int(input('侧边几套? 2\n'))
            print(cb)
            size=int(nn[r])
            print(size)        # 写入单元格数字的大小(撑满格子)

    # 新建一个”装N份word和PDF“的临时文件夹
    imagePath1=r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\零时Word'
    if not os.path.exists(imagePath1):  # 判断存放图片的文件夹是否存在
        os.makedirs(imagePath1)  # 若图片文件夹不存在就创建

    # 计算不同模板中的单元格坐标,放在bg里
    # 棋盘格子数量,


    # 如果长方形:底边3*侧边2,3*2=6套 ,就是10*10宫格,底边格子数量就是10*3=30,侧边格子数量就是10*2=20,
    # if db==cb:

    db_size = hs*db
    cb_size=  hs*cb
    print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))
    print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))

    # 确定每个宫格的左上角坐标 00 04 40  44 中间没有分栏的空格了,所以hs不用+1
    bgszm=[]
    for a in range(0,cb_size,hs):    # 0-11每隔4,写一个坐标  侧边y
        for b in range(0,db_size,hs):  # 0-11每隔4,写一个坐标  侧边x
            bgszm.append('{}{}'.format('%02d'%a,'%02d'%b))
    print(bgszm)
    # 10宫格排列底3侧2共6套,底边格子数30
    # 10宫格排列底3侧2共6套,侧边格子数20
    # 10宫格排列底3侧2共6套,侧边格子数20
    # ['0000', '0010', '0020', '1000', '1010', '1020']
        

    # 转为元祖
    start_coordinates = [(int(s[0:2]), int(s[2:4])) for s in bgszm]
    cell_coordinates = []

    # 推算每个起始格子后面的单元格数字
    for start_coord in start_coordinates:
        i, j = start_coord
        subgrid_coordinates = []
        for x in range(hs):
            for y in range(hs):
                subgrid_coordinates.append((i + x, j + y))
        cell_coordinates.append(subgrid_coordinates)

    # 打印结果(元祖样式)
    bg=[]
    for coordinates in cell_coordinates:
        # print(coordinates)     # [(4, 8), (4, 9), (4, 10), (5, 8), (5, 9), (5, 10), (6, 8), (6, 9), (6, 10)]
        for c in  coordinates:
            print(c)        # 元组 (1, 2) 样式
            s = ''.join(str(num).zfill(2) for num in c)   # zfill将元组 (1, 2) 转换为字符串 '0102' 特别是(5,10)这种必须转成2个数字0510
            print(str(s))        #  '12'
            bg.append(s)  #  '0102'
    print(bg)


    # 生成PDf
    P=[] 
    for z in range(num):  
        P.clear()
        #    制作4份数据
        for j in range(db*cb):    #  3宫格,4*3=12套
        
        # ————————————————生成随机宫格,按比例空缺格子
        # 版权声明:本文为CSDN博主「Vaeeeeeee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        # 原文链接:https://blog.csdn.net/m0_46366547/article/details/131334720
            def generate_sudoku_board():
                # 函数体生成数独库表盘
                # 创建一个9x9的二维列表,表示数独棋盘
                board = [[0] * hs for _ in range(hs)]

                # 递归函数,用于填充数独棋盘的每个单元格
                def filling_board(row, col):
                    # 检查是否填充完成整个数独棋盘
                    if row == hs:
                        return True
                    
                    # 计算下一个单元格的行和列索引
                    next_row = row if col < hs-1 else row + 1
                    next_col = (col + 1) % hs

                    # 获取当前单元格在小九宫格中的索引
                    box_row = row 
                    box_col = col

                    # 随机生成1到9的数字
                    numbers = random.sample(range(1, hs+1), hs)

                    for num in numbers:
                        # 检查行、列、小九宫格是否已经存在相同的数字
                        if num not in board[row] and all(board[i][col] != num for i in range(hs)) and all(num != board[i][j] for i in range(box_row, box_row) for j in range(box_col, box_col)):
                            board[row][col] = num

                            # 递归填充下一个单元格
                            if filling_board(next_row, next_col):
                                return True

                            # 回溯,将当前单元格重置为0
                            board[row][col] = 0

                    return False

                # 填充数独棋盘
                filling_board(0, 0)
                return board
                
            def create_board(): # level数字越大代表游戏难度越大
                """
                生成一个随机的数独棋盘,空白格少
                """
                board = generate_sudoku_board()
                board1 =  copy.deepcopy(board)

                blanks = random.sample(range(hs*hs), int(hs*hs*kk/10))
                for i in blanks:
                    row = i // hs
                    col = i % hs
                    board[row][col] = 0

                        
                    # if random.randint(0, hs) < level:
                    #     board1[row][col] = 0
                return board

            v = create_board() 
            # 81空34、46

                    
            # 提取每个元素
            

            for a1  in v:         # 第一次读取,[a,b][c,d][e,f]的内容-列表
                for a2 in a1:    # 第二次读取,[a,b,c,d,e,f]的内容-元素
                    if a2==0:                # 如果某个元素==0,就替换成空
                        P.append('')
                    else:      # 如果某个元素非0,就写入本身的数字
                        P.append(a2)
            print(P)
            print(len(P))
            Q=P

        # 三宫格有2个模板,一个是每页15份,格子稍微大,一个是每页20份,格子稍微小,这里选大一点
        if hs==3:       
            doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\数独长方形({}宫格)合并版 15.docx'.format(hs)) 
        else: 

            doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\数独长方形({}宫格)合并版.docx'.format(hs))     
    #    
        table = doc.tables[0]          # 表0,表2 写标题用的
        # 标题写入3、5单元格  
        for t in range(0,len(bg)):             # 0-5是最下面一行,用来写卡片数字
            pp=int(bg[t][0:2])     # 
            qq=int(bg[t][2:4])
            k=str(Q[t])              # 提取list图案列表里面每个图形  t=索引数字
            print(pp,qq,k)

            # 图案符号的字体、大小参数
            run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
            run.font.name = '黑体'#输入时默认华文彩云字体
            # run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片
            run.font.size = Pt(size) #是否加粗
            # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
            run.font.color.rgb = RGBColor(50,50,50) #数字小,颜色深0-255
            run.bold=True
            # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
        
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
            table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  

            
        doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\零时Word\{}.docx'.format('%02d'%(z+1)))#保存为XX学号的电话号码word     
        time.sleep(2)
        from docx2pdf import convert
        # docx 文件另存为PDF文件
        inputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word/{}.docx".format('%02d'%(z+1))# 要转换的文件:已存在
        outputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word/{}.pdf".format('%02d'%(z+1))  # 要生成的文件:不存在
        # 先创建 不存在的 文件
        f1 = open(outputFile, 'w')
        f1.close()
        # 再转换往PDF中写入内容
        convert(inputFile, outputFile)
            
        print('----------第4步:把都有PDF合并为一个打印用PDF------------')
            
    # 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
    import os
    from PyPDF2 import PdfMerger
    target_path =  'C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word'
    pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
    pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
    pdf_lst.sort()
    file_merger = PdfMerger()
    for pdf in pdf_lst:
        print(pdf)
        file_merger.append(pdf)

    file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/数独/(打印合集)05长方形数独宫格23.0 {}宫格无空{}乘{}等于{}套({}人{}份).pdf" .format(hs,db,cb,db*cb,num,num))

    file_merger.close()
    # doc.Close()

    # # print('----------第5步:删除临时文件夹------------')    
    import shutil
    shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word') #递归删除文件夹,即:删除非空文件夹

    time.sleep(3)    # 防止转换时报错,预留生成时间
                

终端输入:

输入分数,和抽空数量

293aaad800bf45b2862ec66f48da8b8b.png

已经设置好,直接生成3、5、6、7、8、10宫格1份。所以生成时间比较长。

215b358773b547f5bb273baaebd6478a.png

结果展示:

83800c786237431b829e1305229e6c58.png

3447ca59c45849b9b6d31a51ac49961a.png

8f058a7ce09f40d484959f152cae65d4.png3d134f18890b42c18fdfbf040f08eb14.png019cf740521641ab94ab594f1d9fda25.pngd7a30a182d99428dbf670d7908faed2c.png8c7fca64d22c4f97a3a11a9d0fdbb6f5.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1382350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建中国人自己的私人GPT-有道GPT

创作不易&#xff0c;请大家多鼓励支持。 在现实生活中&#xff0c;很多人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 一、…

[Windows] Win10 常用快捷键

文章目录 &#x1f680; [Windows] Win10 常用快捷键&#x1f310; Windows 操作系统&#x1f525; Windows 10 &#x1f310; Windows 10 快捷键概览&#x1f525; 基本快捷键&#x1f525; 窗口快捷键&#x1f525; 功能快捷键 &#x1f4dd; 小结 &#x1f680; [Windows] W…

网站后台拿Webshell

通过注入或者其他途径&#xff0c;获取网站管理员账号和密码后&#xff0c;找到后台登录地址&#xff0c;登录后&#xff0c;寻找后台漏洞上传网页后门&#xff0c;获取网站的webshell webshell的作用是方便攻击者&#xff0c;webshel是拥有fso权限&#xff0c;根据fso权限的不…

Android Studio 虚拟机 Unknown Error 解决

前言 尝试了网上很多解决方式&#xff0c;但很遗憾&#xff0c;都没效果&#xff1b; 于是我就想啊&#x1f914;&#xff0c;虚拟机属于SDK的一部分&#xff0c;那有没有一种可能&#xff0c;是SDK出了问题&#xff1b; 于是我就换了新的SDK&#xff0c;结果 ---- 完美解决…

高德地图Web服务使用方法——电子围栏

1 高德地图Web服务 1.1 添加Key 注册高德地图&#xff0c;进入控制台&#xff0c;创建新应用&#xff0c;添加Key&#xff0c;选择Web服务&#xff0c;不添加域名白名单&#xff0c;勾选同意政策。 刷新界面&#xff0c;记住获取到的Key。 1.2 下载安装Postman https://www…

AWS-SAA-C03认证——之基础知识扫盲

文章目录 前言一、Amazon ECS二、 Amazon EKS三、Amazon EC2四、Elastic Beanstalk五、AWS Fargate六、 AWS Lambda &#xff08;serverless&#xff09;七、Amazon EBS7.1 EBS生命周期 八、Amazon Elastic File System (EFS) -共享文件系统九、什么是 Amazon S3&#xff1f;9.…

2024PMP考试新考纲-【过程领域】近期典型真题和很详细解析(5)

今天华研荟继续为您分享【过程Process领域】的新考纲下的真题&#xff0c;进一步帮助大家体会和理解新考纲下PMP的考试特点和如何应用知识来解题&#xff0c;并且举一反三&#xff0c;在两个多月的时间内&#xff0c;一次性、高等级通过2024年PMP考试。 2024年PMP考试新考纲-【…

WebService

Webservice 是一种传统的soa技术架构, 它不依赖于任何的编程语言,也不依赖于任何的技术平台, 可以直接基于http协议实现网络应用间的数据交互 Webservice 服务端是以接口远程接口为主的, 在java实现的webservice技术里面主要依靠的是CXF开发框架,而这个CXF框架可以直接将接口发…

《向量数据库指南》让「引用」为 RAG 机器人回答增加可信度

在之前的文章中&#xff0c;我们已经介绍了如何用 Milvus 向量数据库以及 LlamaIndex 搭建基础的聊天机器人《Chat Towards Data Science &#xff5c;如何用个人数据知识库构建 RAG 聊天机器人&#xff1f;》《书接上回&#xff0c;如何用 LlamaIndex 搭建聊天机器人&#xff…

计算机图形学作业:三维线段的图形变换

1. 将三维空间某线段 P1P2进行如下的操作&#xff0c;请按要求回答问题&#xff1a; &#xff08;1&#xff09; 沿 X 轴、Y 轴和 Z 轴分别平移 dx、dy 和 dz 的长度&#xff0c;给出相应的变换矩阵。 变换矩阵为&#xff1a; T100001000010dxdydz1 &#xff08;2&#xff09…

Scanner接收用户键盘输入数据(Java)

1.导包&#xff1a;import java.util.Scanner; 一般情况不需要自己导包&#xff0c;idea工具会自动帮助我们导包 2.代码&#xff1a; 得到键盘扫描器对象&#xff1a; Scanner sc new Scanner(System.in); 接收用户输入数据&#xff1a; int sth sc.nextInt(); String…

算法每日一题: 删除排序列表中的重复元素 | 链表的删除

大家好&#xff0c;我是星恒 今天给大家带来的是一道简单的链表删除题&#xff0c;题目很简单&#xff0c;不过可以帮助我们很好的复习链表的删除&#xff0c;尤其适合基础薄弱的友友们学习 ~ 题目&#xff1a;leetcode 83 给定一个已排序的链表的头 head &#xff0c; 删除所有…

【教学类-43-20】20240113 数独(二)4宫格、9宫格 无空行A4模板

作品展示&#xff1a; 4宫格 9宫格 题目连在一起 背景需求&#xff1a; 制作十宫格数独模板&#xff0c;为了凑满20行&#xff0c;删除了每个数独题之间的行列分割线 【教学类-43-18】A4最终版 20240111 数独11.0 十宫格X*YZ套(n10)&#xff0c;套用没有分割行列的A4横版模板…

C语言辨析——深入理解字符常量与表达式

1. 问题 今天看到一个题目&#xff0c;截图如下。 从答题情况来看&#xff0c;本题的答案是B&#xff0c;那么就意味着A、C、D是错的。但我认为这4个选项都是对的。当然&#xff0c;如果要从4个选项中挑选一个的话&#xff0c;那还是选择B妥当一些。 2. 分析 字符常量的定义…

SpringCloud Aliba-Nacos-从入门到学废【1】

&#x1f95a;今日鸡汤&#x1f95a; 当你最倒霉地时候一定要扛住。 因为&#xff0c;那正是你运气该上升的时候。 ——《一人之下》 目录 &#x1f9c8;1.Nacos介绍 &#x1f9c2;2.Nacos服务提供者注册 &#x1f953;3.Nacos服务消费者 &#x1f32d;4.Nacos作为配置中心…

学习使用Rainyun搭建网站

我们选择了白嫖雨云的二级域名 浏览器输入https://www.rainyun.com/z22_ 创建账号然后选择一个你喜欢的子域名我建议后缀选择ates.top的 选择自定义地址&#xff0c;类型选择cname 现在要选择记录值了&#xff0c;有a&#xff0c;aa&#xff0c;txt等 根据实际情况填写。就可以…

最新 Vmware (17 )下载安装教程

文章目录 Vmware安装Vmware官网Vmware官网选择对应的平台 win或者 linux安装包下载完成后 双击开始安装秘钥vmware workstation pro17密钥分享: Vmware安装 Vmware官网 中文网: https://www.vmware.com/cn.html 英文网: https://www.vmware.com/Vmware官网 选择对应的平台 wi…

Aigtek超声功率放大器的选型技巧及参数指标有哪些

超声功率放大器是一种广泛应用于声学测量、医疗成像、声纳等领域的装置&#xff0c;其作用是将输入信号的功率放大到需要的水平。在选型超声功率放大器时&#xff0c;需要考虑一些关键的技巧和参数指标&#xff0c;以确保选择合适的设备来满足特定的需求。 首先&#xff0c;需要…

【Spring Cloud Alibaba】Sentinel 服务熔断与流量控制

目录 前言 一、Sentinel 入门 1.1 什么是 Sentinel ? 1.2 微服务集成 Sentinel 1.3 安装Sentinel控制台 二、Jmeter 压力测试工具 2.1 Jmeter 介绍 2.2 Jmeter 安装 2.3 接口测试 三、Sentinel 使用 3.1 限流规则 3.1.1 warm up(预热模式) 3.1.2 排队等待 3.1.3…

Cortex-M移植

常用寄存器 PRIMASK寄存器 PRIMASK寄存器为1位宽的中断屏蔽寄存器。在置位时&#xff0c;它会阻止不可屏蔽中断&#xff08;NMI&#xff09;和HardFault异常之外的所有异常&#xff08;包括中断&#xff09;。实际上&#xff0c;它是将当前异常优先级提升为0&#xff0c;这就是…