班级:高二
进度:刚学完Python程序设计部分
通过石头剪刀布游戏,体验Python图形化效果。
宏观分解:代码分块解读功能,找出强调核心实现部分。
降维任务:明确课堂任务,完善猜拳游戏的命令行版本。
讲解拓展:评价各组表现,点播“精简优化”思维与代码。
巩固提升:通过在线练习,巩固之前所学,让知识落地。
![768c1ee8b0788cfc548a98263d26ab92.png](https://i-blog.csdnimg.cn/blog_migrate/4754089987c567f484005149b80d7609.png)
![768c1ee8b0788cfc548a98263d26ab92.png](https://i-blog.csdnimg.cn/blog_migrate/4754089987c567f484005149b80d7609.png)
![42007139bec5e83d151c10c648fa97a4.png](https://i-blog.csdnimg.cn/blog_migrate/f5b82eca13fe7e0c955395da665bbc03.png)
这一部分其实主要是开拓一下学生的视野,让学生从单调乏味的命令行式编程中跳脱出来,看一下Python可以实现的其他效果。
通过具体的小游戏演示和体验,让学生感受代码的魅力,产生强烈的学习欲望和探究心理。这对于后面课堂的展开有积极的引导意义,对于接下来的命令行实现也有一个促进作用。
NO.2 宏观分解:代码分块找核心 加载相关库、多媒体素材 :import pygame,sys,randomfrom pygame.locals import * #引入pygame中的所有常量list=['剪刀','石头','布','退出'] pygame.init() #pygame模块初始化screen=pygame.display.set_mode((600,400))#定义窗口的大小pygame.display.set_caption("剪刀石头布-pygame版-by潘") #定义窗口的标题background=pygame.image.load('imgs/bg.png') #加载背景图对象screen.blit(background,(0,0))#背景图贴到窗口,blit:位块传送pcount=0ccount=0m_win=pygame.mixer.Sound('mscs/win.wav')m_los=pygame.mixer.Sound('mscs/los.wav')m_eq=pygame.mixer.Sound('mscs/eq.wav')
游戏逻辑实现主体部分:
def start_game(x,y):#根据点击位置 global pcount,ccount screen.blit(background,(0,0))#背景重新覆盖 c=random.randint(0,2) p=-1 if x>20 and x<70 and y>20 and y<70: p=0 elif x>70 and x<120 and y>20 and y<70: p=1 elif x>120 and x<170 and y>20 and y<70: p=2 #猜拳的核心实现部分开始 if p>-1: if (p==0 and c==2) or (p==1 and c==0) or (p==2 and c==1): win=pygame.image.load("imgs/win.png") vs=pygame.transform.scale(win,(275,95)) screen.blit(win,[150,280]) pcount=pcount+1 m_win.play() elif p==c: win=pygame.image.load("imgs/same.png") vs=pygame.transform.scale(win,(275,95)) screen.blit(win,[150,280]) m_eq.play() else: win=pygame.image.load("imgs/lose.png") vs=pygame.transform.scale(win,(275,95)) screen.blit(win,[150,280]) ccount=ccount+1 m_los.play() #猜拳的核心实现部分结束 p_p=pygame.image.load("imgs/"+str(p)+".jpg") p_p=pygame.transform.scale(p_p,(100,100)) textFont = pygame.font.Font("fzjz.ttf",28) text1 = textFont.render(str(pcount),True,(0,0,0)) screen.blit(text1,(500,40)) text2 = textFont.render(str(ccount),True,(0,0,0)) screen.blit(text2,(500,70)) c_p=pygame.image.load("imgs/"+str(c)+".jpg") c_p=pygame.transform.scale(c_p,(100,100)) c_p=pygame.transform.flip(c_p,True,False) screen.blit(p_p,[100,160]) screen.blit(c_p,[400,160]) pygame.display.update() #刷新画面
循环刷新以响应点击:
while True: for event in pygame.event.get(): if event.type==QUIT: sys.exit() elif event.type==pygame.MOUSEBUTTONDOWN:#鼠标点击事件 mouse_x,mouse_y=pygame.mouse.get_pos() #get_pos()返回一个单击时鼠标的xy坐标 start_game(mouse_x,mouse_y) vs=pygame.image.load("imgs/vs.png") vs=pygame.transform.scale(vs,(120,120)) screen.blit(vs,[250,150]) pygame.display.update() #刷新画面
这一部分,主要是带着孩子们进行代码阅读。没错,就是
代码阅读,编程语言和其它语言一样,其实阅读能力也是重要的一方面,只不过课堂上的代码阅读,我们主要是培养学生的
大局观。也就是宏观上的分块,大致都明白这一块在实现什么功能就好。这样解析下来,学生可能就不会觉得,我能做出来吗?太复杂了吧?取而代之的可能是“原来如此”,“
给我足够的时间的话,我也可以”。这是我想实现的效果,这种自信的培养,对性格养成,是具有很大的现实意义的。这种大局观意识,分块思想,对孩子的思维和眼光也是大有裨益的。NO.3
任务降维:编码体验练知识
所谓的降维,是从上面的界面游戏,回归编程本身的过程。确切的说,是让学生安心完善实现一个命令行游戏。
我们在课堂上由老师带领书写部分核心代码,主要是难度较大的循环过程构建和基本数据结构的设计使用。留下部分代码,比如多分支判断语句,以及部分代码逻辑语句,作为学生练习任务中的程序填空部分。
降维后目标效果
为了缓解学生对程序设计的陌生感和思维训练缺失(本质是不重视哈),我们采用小组讨论的方式来实现这几个填空,并找小组演示讲解为什么那么填写,以达到群策群力和榜样作用。
NO.4 讲解拓展:优化逻辑促思维学生讲解之后,由老师进行分析讲授。重点讲解中间的列表字典、While、if嵌套部分。
具体参考代码
import randomcount=0dic={"石头":0,"剪刀":1,"布":2}ls=["石头","剪刀","布"]per=input("请出拳:")while per!="退出": cn=random.randint(0,2) if per in ls: pn=dic[per] print("人:%s,机:%s" % (per,ls[cn])) if pn==cn: print("平局\n") else: if (pn==0 and cn==1) or (pn==1 and cn==2) or (pn==2 and cn==0): print("人胜\n") count+=1 else: print("机胜\n") per=input("请出拳:") else: per=input("输入有误,请重新出拳:")print("游戏结束,人胜次数%d" % count)
然后排除提升任务:
优化判断胜负语句
if(pn==0 and cn==1) or (pn==1 and cn==2) or (pn==2 and cn==0):
同样是学生思考,给出不同的写法,这里我们由学生自主探究,并不进行小组讨论,因为思维的核心主要靠独立思考。当然可以给小组赋分,毕竟个人也是小组的一部分。
我们期待学生的写法:
if pn-cn==-1 or pn-cn==2:
这其实就是进行了抽象计算。再进一步,从语言的角度,可以换为:
if pn-cn in (-1,2):
这也是对基本的列表(元组)、in运算符熟悉的孩子才能想到的。
本部分的安排,其实是一个循序渐进的过程,有助于训练孩子的计算思维、数据思维。就是能看出表象的石头剪刀布背后的“数”,如果前面的引入部分算是最简单的“模块化”思维,这其实就是最简单的“抽象化”。
只有打下这样的基础,耳濡目染、日精日进,将来他们才有可能有“自动化”、“系统化”的思维,才能实现新课程真正想达到的一些效果。NO.5 巩固提升:在线测试固所学编程课堂最忌讳的就是,一鼓作气、再而衰、三而竭。前面所有的花里胡哨,最终也还是要落地到基本知识,毕竟还有学业水平考试。
所以我们在魔灯(moodle)平台或者其他在线学习平台(问卷星也可以)上,可以放上一组测试单选测试题,来复习各种基础知识。
通过自动评分,和前面的个人小组表现(借助moodle或者别的课堂辅助软件)汇总,最后可以确定表现比较好的同学以及小组,完成最终的汇总评价。
附上几个参考练习题(原创题转载请注明):
可以考考字符串、函数、break语句之类的课堂案例没练习到的知识。
![a8acefac2e25f4af34059c8520f28592.gif](https://i-blog.csdnimg.cn/blog_migrate/313fff9e421784fd97dda6f0306f74af.gif)