——发挥学生主体性学习
关键词: 信息科技 新课标 核心素养 Python 多媒体 交互性 计算思维 游戏开发 Pygame 游戏化 网络化 程序封装 面向对象 数据结构 软件工程 设计模式 新课程建设 华为平板 Python 编译器 IDE 垃圾分类 小游戏
在这里插入图片描述

《 信息科技》新课程核心素养目标: 懂底层原理,有计算思维,会做项目实验……笔者认为底层原理部分知识概念要用关键词引领,关键词拖放反馈为学习,拖放判答为考核。交互式展开的知识脉胳,演示视频及交互动画,因此有了软件需求。
作为一名义务教育阶段的信息科技教师,在国家新课程改革大背景下,笔者指导学生通过 Python 游戏编程学集成开发环境、学程序语言、学变量数据结构、学程序流程、学对象封装模块化设计、学软件设计模式。设想有一天让学生们用提高的信息素养参与新课程建设。成熟后再由信息科技学科推广到各科学习。
具体措施: 逆向学习是项目开展的有效途径。学习专业游戏开发者成熟经验,在熟知游戏开发基本原理情况下,以实现较大规模游戏项目为指引,分步实现。先搭建主框架初始化及实现一个黑窗口并自带一个循环能侦测用户鼠标键盘输入。接着讲解图像加载 Surface (表面),再 Blit 到主窗口(主表面)。当然也可用精灵封装一个 Image ,创建精灵组对象,更新和渲染。注意逻辑更新和物理渲染。创建常量变量放 Settings 模块,不需要放循环中。更新和渲染往往要放循环中,还有容器的概念,比如创建一 个 Level 类或 Scene 类,初始化,加载资源,更新。有同学不知道 Level , 闹笑话噢。创建各个小部件 ( 类 ) 继承自 Sprite 类,也有初始化、更新渲染。
一个好的开发环境能有效提升开发效率,笔者发现平板轻量化办公有效实现搭建 Python 开发环境和运行 Pygame 作品。我用华为平搭载鸿蒙搭建开发环境实现开发编译作品,其实安卓系统平板也可以。学生们在家完全可以在家长监督下,利用平板或手机配置好 Python 开发环境,利用老师提供的资料,展开项目学习和练习。
一个好的想法很重要。在已有游戏引擎的情况下,不怕做不到就怕想不到。不断增加代码编写量,积累前人已有经验,在开发过程中解决疑难。夯实基础,好的作品一定能实现。多媒体音视频演示,仿真模拟操作,游戏化交互反馈,最终形成网络化,计算思维 ( 编程 ) 都大有可为。
上述过程需要大量图像处理,用图像素材处理软件 SheBox 和 Photoshop 软件分割、美化 PNG 图像成小块做图块,像活字印刷一样使用图像文字。作动画帧,高效地取得素材,有力保障项目的开展。
教学管理上,在机房每排设两个小组长,老师培训小组长,小组成带小组成员,兵带兵。符合学习主体性,无差性调动学生积极性。好学生是夸出来的,注意常用赞赏的语气鼓励学生,用技术让学生折服而不是强迫学生,毕竟兴趣是最好的老师,探索的欲望往往是无穷的,永远不要怀疑学生的能力。
个人认为,实验应在理论指导下进行,而利用应用场景将应用场景中的知识加以罗列总结是否可以强化知识的价值,有了应用场景为载体,是否提高学习的效果。可以按课本提供的应用场景编写游戏场景,在虚拟世界学习知识概念。例如: 小明上网冲浪, 完成老师布置的查资料任务。互联网、万维网、 浏览器、网址、域名服务器、邮件服务器等等。 利用软件虚拟不同应用场景环境,是否用游戏中的地图、关卡来解决。那家庭宽带、学校、单位工作网络场景呢?
说说动画的算法思路:用精灵实现。初始化阶段一个Surface 列表,一个初始值为 0 的索引。循环体内索引超过列表长度变为 0。不断更新渲染列表中索引为当前索引的 Surface 。而几种状态动画的切换则用到字典存储各动画帧。初始某状态 ( 键值 ),切换的状态,循环体内根据当前键值播放列表中序列帧。用好整数,用好列表,用好字典,知道需要什么画面,什么放在循环中,是不是动画也不难了。此处教学生循环体外赋初值、循环体内更新变化的代码填充规则。小部件代码段和容器内代码段和游戏主循环代码段具有一样的初始化、更新、渲染框架。即主框架在循环体中执行容器对象实例更新、渲染代码,而容器更新最终更新渲染了各部件对象实例相应内容。注意到垃圾分类游戏代码中的大字典吗?可以根据位置接近或碰撞检测某只桶判断所属种类垃圾该不该放几号桶,即数字对不对上号。如果给带盖垃圾桶准备打开关闭两种状态,是不是一个逻辑变量 ( 开关 ) 因某条件触发就可呢?倒计时、游戏时间显示、显示 √ 和 Ⅹ ,结果都能实现。那么各种场景呢?
大象装冰箱,总共几步。面向过程的程序,打开冰箱门的动作,装进去,关上冰箱门的动作,几个函数解决问题。面向对象的程序,冰箱有门开关的状态属性,关联打开关闭的动作,大象这个主体或人这个主体在门开的情况下送大象进入冰箱。所以找名词,构建类为关键。类 Class 是对象模板,生成的实例分可视和不可视两类。
关于仿真模拟实验,少不了虚拟实验器材的选择、拖放、连线、布置、开关、仪表等技术。是不是全局变量,对象内部变量可以控制。还有自制定时器技术,少不了列表和字典 等数据结构。计算机基本原理:存储与运算,数据结构有效组织数据,方便算法的实现。场景切换,少不了软件设计模式。基础概念:对象定义、实例、什么时候出现 ( 是触发开关还是经过一段时间即多少次循环 )、什么时候隐藏及消亡、动画的逻缉及不同状态动画切换技术、 镜头语言及是否存用主角在中央,控制运动时背景等产生相对运动。当然少不了鼠标、键盘各种响应。
八九十年代的软件危机诞生了软件工程。对于编程我选择面向对象,类、对象、方法、事件、封装。图形积木丧失了自由度,我不认为能降低难度,反而不利于阅读,影响面向对象的实现。因为不灵活,我认为真心的难。类、封装,我觉得像一块块积木,分外亲切。 用计算思维 ( 编程 ) 建设新课程也许目标过于宏大, 惟有群策群力,分工协作,经过一段时间才会有所建树。困难永远不会是技术因素,由于水平有限,本次活动只当一次交流探索。实在是课时太少,学生兴趣焦点难以掌控等因素才会造成想办法,班门弄斧。
Python 中文字先实例化 Font 对象完整字体设置后调用函数生成成一个个 TextImage ,等同于一个 Surface 。就可以 Blit 了,声音也很简单,画图函数可在 Surface 上画直线及各种几何图形。这里提供一个等腰三角形三线合一 ( 底边上中线、底边上高、顶角平分线 ) 的算法思路。用字典存储三个顶点,初始化坐标决定三角形大小形状位置。三个可拖动的小圆 ( is_drag 初值为 False 一定范围内,is_drag 为 True ,否则为 False ),拖动即为随鼠标坐标变化位置。坐标变化后对字典中某顶点坐标重新赋值。循环中根据字典中坐标值两两擦除重画各边并计算中点、垂足点、顶角平分线与底边交点,从而配合顶点坐标两两划线实现。而 Pygame 作为 Python 环境中游戏引擎自然容易实现。是不是还可以利用 Python 自带的数据库 sqlite3 功能,也许想得到不怕做不到。用简单的语言在游戏开发实际需求中学数据结构、算法真的美美的。
笔者在海龟编辑器中用少儿版的由 Pygame 封装的 Pgzero 编写了指法训练介绍基本键及指法基本规律,可通过网络分享,在机房仿真模拟操作指法训练。用对象表示按键,用字典配合各键定位,可以展现代码及运行结果。在网页上运行代码,随处可分享,算是网络化的例子。另外程序是相通的,学好一门语言算法数据结构,还有其他适合的语言可选。多年以前提出的游戏化、网络化的课件制作目标,貌似已经解决,而起决作用的是熟练使用数据结构的算法实践。是只要想的到的 “ 需求 ” ,是程序算法的 “ 巧思 ” 。
工程过于浩大,为利于学生实现,可提供主框架,学习变量、数据结构,往里填充部件代码,部件也可以提供,提供包含图像资源的工程文件夹。指导学生安装编译开发环境,便于在家在家长监督下利用平板,手机安装,并能将所给资源配置到默认工程文件夹。Python 具有块状语言特性,引导学生注意缩进语法,设计正确的程序流程(英文状态下一个 Tab 键,相当于 4 个空格)。说了这么多,编写校本教程服务于新课程很关键。用一个个短小精焊的短代码,有着明确的目标,开启测试之旅。海龟编辑器及编程猫也有线上版和客户端。
现实中存在编译环境、软件发布成可运行程序被误杀、不兼容的命令语句等诸多问题,但丝毫不影响学习,稍加变通都能得到解决。
“一千名观众 一千个哈姆雷特”,一线教师的我有我的触角,用我的思索解读新课程。根据学校现有条件,建设《信息科技》新课程校本资源。充分利用手中累积的资源,多平台、跨平台、多种技术手段。扬帆千里,终有所为。向死而生,挑战权威。在新课改大潮下,希望每位同仁成为信息科技“教学专家”。谢谢大家。

import pygame,sys
from pygame import *
import time,random
WIDTH=3200    
HEIGHT=1800
FPS = 3
RubbishBinImg=[{'img':f'images/slice01.png','key':'1'},
               {'img':f'images/slice02.png','key':'1'},
               {'img':f'images/slice03.png','key':'1'},
               {'img':f'images/slice04.png','key':'3'},
               {'img':f'images/slice05.png','key':'1'},
               {'img':f'images/slice06.png','key':'2'},
               {'img':f'images/slice07.png','key':'1'},
               {'img':f'images/slice08.png','key':'1'},
               {'img':f'images/slice09.png','key':'1'},
               {'img':f'images/slice10.png','key':'0'},
               {'img':f'images/slice11.png','key':'1'},
               {'img':f'images/slice12.png','key':'1'},
               {'img':f'images/slice13.png','key':'1'},
               {'img':f'images/slice14.png','key':'1'},
               {'img':f'images/slice15.png','key':'1'},
               {'img':f'images/slice16.png','key':'1'},
               {'img':f'images/slice17.png','key':'1'},
               {'img':f'images/slice18.png','key':'1'},
               {'img':f'images/slice19.png','key':'1'},
               {'img':f'images/slice20.png','key':'1'},
               {'img':f'images/slice21.png','key':'1'},
               {'img':f'images/slice22.png','key':'1'},
               {'img':f'images/slice23.png','key':'1'},
               {'img':f'images/slice24.png','key':'1'},
               {'img':f'images/slice25.png','key':'1'}
]
class Background(pygame.sprite.Sprite):
    def __init__(self,group):
        super().__init__(group)
        self.image=pygame.Surface((80,120))
        self.image=pygame.image.load(f'images/bj.png')
        self.image=pygame.transform.scale(self.image,(WIDTH,HEIGHT))
        self.rect=self.image.get_rect(topleft=(0,0))
        #self.image.fill('green')
        
class Rubbish_Bin(pygame.sprite.Sprite):
    def __init__(self,group):
        super().__init__(group)
        self.image=pygame.Surface((WIDTH,HEIGHT//4))
        self.image.set_colorkey('black')
        rubish_bin_files=[f'images/slice55_55.png',f'images/slice56_56.png',
                            f'images/slice57_57.png',f'images/slice58_58.png']
        rubbishbin_surfes=[]
        for i in range(4):
            rubbishbin_surfes.append(pygame.image.load(rubish_bin_files[i]).convert_alpha())
            self.image.blit(pygame.transform.scale2x(rubbishbin_surfes[i]),(600*i+400,40))
        self.rect=self.image.get_rect(topleft=(0,HEIGHT//4*3))        
class Game:
    def __init__(self):
        pygame.init()
        self.win=pygame.display.set_mode((WIDTH,HEIGHT))
        self.all_visible_sprites=pygame.sprite.Group()
        self.clock=pygame.time.Clock()
        self.bg=Background(self.all_visible_sprites)
        self.rubbish_bin=Rubbish_Bin(self.all_visible_sprites)
        self.random_num=random.randint(0,len(RubbishBinImg)-1)
        self.isMoving=False
        self.position=WIDTH//2-200,HEIGHT//2-100
        self.mouseCursor=pygame.image.load(f'images/hand_cursor.png').convert_alpha()

    	def mouse(self):
        	x,y=pygame.mouse.get_pos()
        	x-=self.mouseCursor.get_width()/2
       		y-=self.mouseCursor.get_height()/2
        	pygame.mouse.set_visible(False)
        	self.win.blit(self.mouseCursor,(x,y))
        
	    def run(self):
	        while True:
	            for e in pygame.event.get():
	                if e.type==QUIT:
	                    sys.exit()
	                if e.type==pygame.MOUSEBUTTONDOWN:
	                    if e.button==1:
	                        self.isMoving=True
	                if e.type==pygame.MOUSEBUTTONUP:
	                    if e.button==1:
	                        self.isMoving=False
	                if self.isMoving==True:
	                    self.position=pygame.mouse.get_pos()
	                    #time.sleep(0.5)
	                elif self.isMoving==False:
	                    
	                    self.position=WIDTH//2-200,HEIGHT//2-100
	            if not self.isMoving:
	                self.random_num=random.randint(0,len(RubbishBinImg)-1)
	            
	            self.win.fill('white') 
	            self.all_visible_sprites.update()
	            self.all_visible_sprites.draw(self.win,(400,300)) 
	            self.rubbish=pygame.image.load(RubbishBinImg[self.random_num]['img'])
	            self.rubbish.set_colorkey('white')
	            self.rubbish=pygame.transform.scale2x(self.rubbish)
	            self.rubbish=pygame.transform.scale2x(self.rubbish)
	            self.rubbish=pygame.transform.scale2x(self.rubbish)
	            self.win.blit(self.rubbish,(self.position[0]-self.rubbish.get_width()//2,
	            				self.position[1]-self.rubbish.get_height()//2))
	            self.mouse()
	            pygame.display.update()
	            self.clock.tick(FPS)

#主调程序
 if __name__=="__main__":
 	game=Game()
 	game.run()
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐