【教学类-13-04】20230404《数字色块图+判断密码是否正确-5*7*8-A4横板-横切》(中班主题《我爱我家》)

背景需求:

1、项目:

去年上学期给中班、大班孩子做过一个“像素数字图“”的游戏。

【教学类-13-01】20221112《数字色块图5*7*9-A4竖版》(中大班主题《》)

【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)

2、问题:

从作品来看,他们大都用色块区分出四个数字,拍照时,不少孩子询问我:“老师,我写的对吗?”

 问题:

因为是代码生成的4位随机数字,我根本不知道他们是否写的正确,只能快速目测来验证。

情况一:一些孩子的数字色块比较清晰整洁,容易辨识。(但清晰的色块也不一定写对,如29的第三个数字E实际是8)

 

情况2:一些涂色杂乱、不会做、涂色覆盖提示数字的密码纸,让我辨认起来非常费力。最后只能糊弄。

 需求:

今年再次尝试在中班做横板的“像素数字密码图”,我不想目测判断幼儿“破译”的正确性,想用电脑程序来判断孩子们写出来的数字的正确性( if ……else……的代码)

思路:

1、提取密码数字:在“数字图-横版”代码,把随机抽取的4个数字密码,写入"密码.xlsx"保存,同时生成PDF打印纸

2、打印破译纸片:打印这套生成的pdf纸张打印出来,横向切割成小纸片(4个数字)

3、判断密码正确:写一个判断程序,如果幼儿输入的四个数字在EXCLE 的密码列表里,就输出大型的“√”,如果输入错误,EXCLE密码列表里没有这个数字,就输出大型的“×”。

4、验证程序exe:因为我不会做UI界面,所以还是采用exe打包代码的方式,在电脑桌面上运行Python程序(黑底白字,文字很小),虽然我知道这种黑底界面操作起来,根本不适合幼儿,但是自身技术不达标,只能先将就一下了。o(╥﹏╥)o)

代码解析:

一、材料准备:

 word样式:

使用word模板与下面链接的word模板一致

【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)

二、代码1:生成word学具和EXCEL密码

(一)全部代码

'''

作者:阿夏
时间:2022年11月18日数字像素图(A4横板5*7 8个表 中间一切二横切)
(A4横板排5*7*8 每套两个数字涂成不同的颜色  有括号,要汇总密码))
'''

import os,random

num=int(input('生成多少份\n'))
Number=int(input('抽取几个数字(10个数字中取横板8个(4个一组)\n'))
size=float(input('数字大小(最大28,建议25)\n'))
weight=int(input('表格宽度(5格)\n'))
height=int(input('表格长度高度(7格)\n'))

print('----------第1步:提取所有图案------------')

import random
# m数字位置上的数字


print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
os.mkdir(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\零时Word')


print('----------第3步:随机抽取8个不重复的图案 ------------')
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


# 新建
# 导入库
from openpyxl import Workbook
wb = Workbook()
ws= wb.active

for z in range(0,num):   #多少份  

    m=str(random.randint(0,1)) # 涂色部分数字,数字小 0和1(小数)(只有用0的画,有大量重复,所以加了1)
    n=str(random.randint(2,9)) # 非涂色部分数字,2,3,4,5,6,7,8,9  (大数)

    N=[]
    def same():
        for r in range(0,len(nn)):
            nn1=int(nn[r][0])
            nn2=int(nn[r][1])
            for nnn in range(nn1,nn2):
                N.append(n) 

            mm1=int(mm[r][0])
            mm2=int(mm[r][1])
            for mmm in range(mm1,mm2):
                N.append(m)
    print(N)
    # print(len(N))

    # 数字0 的坐标位置列表值
    nn=['06','02','01','02','01','02','01','02','06']
    mm=['03','01','01','01','01','01','01','03','00']
    same()

    # 数字1 的坐标位置列表值
    nn=['07','04','04','04','04','07']
    mm=['01','01','01','01','01','00']
    same()

    # 数字2 的坐标位置列表值
    nn=['06','04','02','02','04','06']
    mm=['03','01','03','01','03','00']
    same()

    # 数字3 的坐标位置列表值
    nn=['06','04','02','04','02','06']
    mm=['03','01','03','01','03','00']
    same()

    # 数字4 的坐标位置列表值
    nn=['06','01','02','01','02','01','02','03','06']
    mm=['01','01','01','01','01','01','04','01','00']
    same()

    # 数字5 的坐标位置列表值
    nn=['06','02','04','04','02','06']
    mm=['03','01','03','01','03','00']
    same()

    # 数字6 的坐标位置列表值
    nn=['06','02','04','02','01','02','06']
    mm=['03','01','03','01','01','03','00']
    same()

    # 数字7 的坐标位置列表值
    nn=['06','04','04','04','04','06']
    mm=['03','01','01','01','01','00']
    same()

    # 数字8 的坐标位置列表值
    nn=['06','02','01','02','02','01','02','06']
    mm=['03','01','01','03','01','01','03','00']
    same()

    # 数字9 的坐标位置列表值
    nn=['06','02','01','02','04','02','06']
    mm=['03','01','01','03','01','03','00']
    same()

    Nall=[] # [[],[],[]]的样式

    for aaa in range(0,int(len(N)/int(weight*height))):    # 把35*10个数字,分割成35一组,35一组,一共10组(0-9)
        aaaa=(N[aaa*int(weight*height):aaa*int(weight*height)+int(weight*height)])
        Nall.append(aaaa)        # 10组的35个数字
    print(Nall)
# [['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', 
# '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '1', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '1', '6', '6', '6', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '6', '6', '6', '1', '1', '1', '6', 
# '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6'], ['6', '6', '6', '6', '6', '6', '1', '1', '1', '6', '6', '1', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '1', '6', '6', '1', '1', '1', '6', '6', '6', '6', '6', '6']]
    print(len(Nall))  # 10个数字
#    
    # NALL 一共有10个,写出所有索引数字
    ss=[]
    for o in range(len(Nall)):        # 0-9
        ss.append(o)
    print(ss)

    q=random.sample(ss,Number)    # 随机抽取8个不重复索引的数字
    print(q)
    
    # [3, 7, 9, 6, 1, 0, 8, 4]

    nine=[]
    for r in range(len(q)):
        
        nine.append(Nall[q[r]])
# #         # nine2=random.sample(Nall,Number)
# #     #     nine=random.sample(Nall,Number)      # 从10个中间随机抽8组(排序打乱,数字会少一个)
    print(nine)
    print(len(nine))

    # 把密码写入EXCLE 
    sin1='{}{}{}{}'.format(q[0],q[2],q[4],q[6])
    sin2='{}{}{}{}'.format(q[1],q[3],q[5],q[7])
    print('密码1:{}{}{}{}'.format(q[0],q[2],q[4],q[6]))
    print('密码2:{}{}{}{}'.format(q[1],q[3],q[5],q[7]))    


    ws['A{}'.format(z+1)]=sin1
    ws['B{}'.format(z+1)]=sin2
    

    # 做成docx学具
    doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\数字像素图横板8个横切.docx') 

    for numbg in range(0,len(nine)): # [[],[],[]]的样式的索引数字
    #     print(num1)
        NUMnum=nine[numbg]
        print(NUMnum)      

    #  确定8*4表格的表格单元格坐标(如第1行第1格是0,0 ,第2行第3格是(1,2)   
        bg=[]
        for x in range(0,height):
            for y in range(0,weight):
                ww='{}{}'.format(x,y)
                bg.append(ww)
        print(bg)      
    
    # ['00', '01', '02', '03', '04', '05', '06', '07', '10', '11', '12', '13', '14', '15', '16', '17', '20', '21', '22', '23', '24', '25', '26', '27', '30', '31', '32', '33', '34', '35', '36', '37']
    # 提取表格单元格坐标和图形的坐标
    
        table = doc.tables[numbg]          # 一共有9个表格        

        for t in range(0,len(NUMnum)):             # 图案的长度为8*4=32个    遍历0-32(32个)
            pp=int(bg[t][0])     # 提取表格bg里面每个元素的第0个数字==单元格X坐标  t=索引数字
            qq=int(bg[t][1])
            k=NUMnum[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(size)  #输入字体大小默认30号
            run.font.color.rgb = RGBColor(100,100,100) #设置颜色10%黑色=深灰
            
            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     

    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)

wb.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\四位密码.xlsx')

print('----------第4步:把都有PDF合并为一个打印用PDF------------')
    
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
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 = PdfFileMerger()
for pdf in pdf_lst:
    print(pdf)
    file_merger.append(pdf)
file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/像素图/(打印合集) 中6班 像素图数字横版横切{}乘{}乘8个({}份).pdf".format(weight,height,num))
file_merger.close()
# doc.Close()

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

(二)重点解析

本文重点解析与下面链接95%内容一致

【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)

区别之处:(加了一个EXCEL保存密码数据)

 

 (三)终端输入

 (四)结果展示

 生成结果:

1、XLSX-密码合计

2、PDF-密码纸

  PDF的第1页两个密码与EXCLE第1行两个数字秘密相同,这两个必须是一套。否则后面的验证EXE做不出来。

三、代码2:验证密码正确性

(一)全部代码

  




import xlrd
import time




workbook=xlrd.open_workbook(r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图\四位密码.xlsx')
sheet= workbook.sheet_by_index(0)# 第1张工作表
A1=[]   # 第1列密码
B1=[]   # 第2列密码

# sheet.cell_value(i,0):第i行的第0个元素
for i in range(0,sheet.nrows):
    A1.append(sheet.cell_value(i,0))
    B1.append(sheet.cell_value(i,1))
    # 删除重复
    if len(A1)!=len(B1):
        print("False")

list=A1+B1
print(list)
for x in range(28):
    n=3
    for i in range(0,n):
        b=input('\n<<<请输入密码(还有{}次机会)>>>\n\n'.format(n))
        if b in list:
            print('----------------------')
            print('    密码:{}    '.format(b))
            print('                   ✔     ')
            print('                 ✔     ')
            print('               ✔     ')
            print('             ✔     ')
            print('   ✔       ✔    ')
            print('     ✔   ✔    ')
            print('       ✔     ')
            print('                ')       
            print('                        ')
            print('    (* ̄︶ ̄*)       ')
            print('                      ') 
            print('     领取礼物        ')
            print('----------------------')
            print('                      ') 
            print('----下一位开始-----') 
            break    
            
        else:
            print('----------------------')    
            print('    密码:{}     '.format(b))
            print('  ✘           ✘ ')
            print('    ✘       ✘   ')
            print('      ✘   ✘   ')
            print('        ✘           ')
            print('      ✘   ✘     ')
            print('    ✘       ✘     ')
            print('  ✘           ✘ ')
            print('                ')  
            print('                      ') 
            print('      o(╥﹏╥)o        ')
            print('                      ') 
            print(' 再来一次(还有{}次机会)         '.format(n-1))
            print('----------------------')
            n-=1
            continue
        
    print('                      ')   
    print('----下次努力-----') 
    print('                      ')   
    print('----下一位开始-----') 
    continue 
#     # time.sleep(2) 
#     # pass
         
        

        

(二)重点解析

读取提取出来的所有密码

 

 (三)做成EXE

 设置打包:

原始路径 

 修改盘符

 查找路径

  

 

 开始生成EXE

 

 先测试EXCLE密码里面的第1个数字

 把EXE复制在桌面上,并确保“4位密码.xlsx”也在桌面的文件夹里,链接不成功,也无法实现验证。

 程序都OK了,开始教学吧

教学过程:

时间:2023年4月4日 8:20-8:30

班级:中6班

人数:19人

一、材料准备:

 

 

 二、学习过程:

 

 

 

 没有拍很多,因为第一位孩子已经“破译完成密码”,让老师教怎么用电脑了,后面的教学时间我被拖在电脑旁。保育员阿姨在指导孩子如何写矩形数字。

作品分析:

EXE程序验证界面的截图

作品扫描

完成度分析

第1类:破译正确,括号和右上角都写出数字组 

 

 

 第2类:破译正确,括号写出数字组 (右上角没有)

 

 孩子用记号笔又写了一次答案,(6251)

   第3类:破译正确,但没有写出数字组

 

 

 

 

 第4类:破译部分正确  部分数字书写正确(总体判断是不理解)

(正确答案:1982)

 (正确答案:9047)

 (正确答案:7356)

这位孩子应该是理解的,但是画面涂色的效果效果不明显,幼儿自身也无法说出这些方块结构数字是到底是什么数字

第5类:破译失败,自主绘画(是否与数字大量包含2、3、5、6、9有关)

 (正确答案:8236)

  (正确答案:2960)

 (正确答案:5634)

 (正确答案:9523

 由此可以看到学具的完成度情况

序号       学习结果数量(份)比例
1第1类:破译正确,括号和右上角都写出数字组421.05%
2第2类:破译正确,括号写出数字组 (右上角没有)315.7%
3第3类:破译正确,但没有写出数字组526.31%
4 第4类:破译部分正确  部分数字书写正确315.7%
5第5类:破译失败,自主绘画 教师告诉答案421.05%

结果显示:幼儿对破译号码的完成度情况如下,共有63.15%的孩子能够破译全部四个号码。另外36.84%的孩子破译有困难(15.7%的孩子破译了1个号码-通常是数字1,21.05%的孩子完全不理解结题方法。)

对上面五类作品进行具体分析

20230404 中6班 破译4位数字(密码纸)
学号密码姓名学号密码01数字01数字括号括号备注
21904写了一个姓19044蓝色粗体1904蜡笔红色 
493124紫色+记号笔9312记号笔 
7369536954紫、红、粉+记号笔 (四个块面勾边,两个快面加单线)3695记号笔 
982944浅绿8294蜡笔绿色 
10367235724紫色 2个涂色块 2个勾单线 
1154364蓝色粗体 第一个数字是红字蓝底 
1245014红字蓝底10(不是正确的)蜡笔蓝色 
1482360自己画了0701画图案
1519821找到部分0并画框记号笔,涂色大红天蓝浅绿1809记号笔 
166251学号在反面4第1个字:蜡笔画框红色涂色、第2-4个子,铅笔数字 紫色粉色勾边6221蜡笔黑色镜像数字
1771544数字:红绿紫绿 背景:蓝红红紫 
1890471记号笔边+粉红数字 勾出部分数字 
19952332 中1 2 0  记号笔书写+粉红紫色涂色背诵老师告诉的正确答案,默写括号数字952记号笔 
2173563红色 线条 735镜像学号
2212054紫色的数字,浅蓝深蓝深绿浅绿背景双色对比
2329600记号笔画小方框 少量蓝色 
2456340177全涂 粉红色 
2647014黄黄黄粉 粗体 
27834083404黄色粗体8340蜡笔蓝色 

通过学号来看,发现一个显著的规律:

1、性别差异显著:女孩在辨识X与0、X与1的能力比男孩强。本次活动中,第4、5类未完成不正确的7位孩子中仅有1位女孩(她只有一题错误),其他都是男孩。

2、绘线方式多元:示范时讲解了画线了、勾边法、画小框法等等,孩子分别用记号笔、铅笔、蜡笔进行了各种绘线尝试,不少作品中有几种样式的展示。大部分孩子只来得及找出数字,2位孩子尝试对背景进行涂色。

3、图形结构差异:本次单元格内的方形数字和幼儿日常绘画的圆形数字有差异,这是导致幼儿无法看到数字的一个原因,从7份作品中,看到1位女孩画出了模糊的数字外形,但无法与圆形数字关联(说不出是什么数字),其他6位男孩的随机密码中大量包含2、3、5、6、9的数字,这些数字的细微差异(哪一条线封闭、哪一条线打开、中间包含格子)影响幼儿的理解、涂色

第2部分:输入号码及验证: (EXE打包)

(为了便于幼儿输入数字和回车按钮,我装了一个会计数字键盘)

 这位女孩说习惯于按26格键盘上的数字:“这个是从1开始的”(孩子适应从左到右的顺序找数字)

 

 

 

 

 

 会计键盘上的数字是3*3=9格排列,幼儿要找一会儿才能找到正确的数字

 

 

 

 

 

 

分析:19位孩子都拿着完成或者没有完成的密码纸排队等候验证(为了拿小礼物——便利贴)

1、女孩的完成度很高,2位女孩在排队时观察教师指导其前面幼儿的过程,因此自己输入时很流畅。

2、虽然不少男孩找不到数字,但他们也排队,或者沉默、或者主动求助老师:”你告诉我答案吧“”我不知道!“(为了礼物拼了!)。所有孩子都体验了一次如何用键盘输入密码的过程,了解如何按键,以便下一次活动参与答案验证(机器验证)

3、孩子们对便利贴礼物很喜爱——“这是找数字,电脑里对了,老师奖给我们的!“他们一有空,就把口袋里的便利贴拿出来摆弄。

4、一位女孩的4个数字画的很清晰,但是输入后显示错误,老师仔细看了,发现其中的5其实是6,这是唯一一位出现错误,并验证第2次的孩子。

感悟:

本次活动中,我再次感受到90后家长在培养20后的孩子方面的力度(好”卷“),

孩子们对于破译密码(画图),玩电脑(验证)、拿礼物(炫耀)有兴趣(礼物是重点),以自己的能力水平,去完成作业。

比如,那些不理解的题意的孩子,也没有空着,而是尝试画了几个数字或者图案,尽量贴近教师的要求(破译方形结构的数字)

可见孩子们都有强烈的自我学习动机是(大家都没有浪费时间,都在做事)。

因此:

  设计人手一份纸类学具,不仅可以让孩子们在游戏中反复进行前书写练习(数字、文字),还能在绘画勾线涂色中认识数字和文字更多的字体造型,加上人机互动学具的运用(电脑输入验证),可以进一步满足学习目标(验证),提升幼儿对于电子产生的学习兴趣。也提升教师的教学效率。

联想:

几天前,有一位孩子向我感叹:”我妈妈说,你好厉害!能想出这么多的数字(玩具)!“

午睡时,我在笔记本电脑编写”周计划转移“的代码(VS code),一位上厕所的男孩路过看到了,也说:”老师,你在工作吗?我爸爸的电脑上也是这样子的(黑底白代码)!“

……

编程技术离生活不远,希望作为老师的我们和我们的孩子们都能从编程中获得收益。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值