中职软件专业课程教学方法探讨

发表时间:2021/3/29   来源:《科学与技术》2021年第1期   作者:王泽良
[导读] 对于中职学校软件专业学生教学,程序设计课程不能照搬高校教学计划与实施方案。
        王泽良
        四川仪表工业学校  重庆  400000
        摘要:对于中职学校软件专业学生教学,程序设计课程不能照搬高校教学计划与实施方案。本文针对中职学生基础差,理解能力弱,逻辑思维能力不足,容易畏难,容易放弃等特点,探讨兴趣激发,简单易学的教学方法,让学生掌握更多的程序设计知识与软件开发技巧。
        关键词:程序设计;教学方法;Android
一、选择趣味游戏做案例
        传统的教学案例,常常是随便列举一些例子,比如选择分支结构程序教学部分,一般使用的案例是“成绩分数判断及格与否”。学生也能理解学习使用。如果选择更有趣的游戏案例,学生兴趣更浓,愿望更强烈,主动性更强。比如“石头剪刀布”让电脑随机出拳,再让玩家出拳,再判断胜负。这样的教学效果更好。学完一门课程或者部分章节,都会使用综合性的案例,考察学生学习情况。下面以基于Android手机平台的“拼图游戏”为例,把案例中的知识点,运用到实际项目开发。
二、极少代码极简逻辑完成实例
1、分析游戏思路
        该拼图游戏的玩法是首先启动游戏后,界面背景显示一张半透明的图片用于参考位置,上部分切割为3x3的正方形小块,下部分打乱存放9张清晰的小图片,拖动这9张图片到对应的位置,游戏胜利。程序设计的原则是代码量尽量少,细节不要太多,函数方法相互调用少,结构简单,逻辑清晰。
2、小块图片实体类设计
        设计一个名为PinTu的类,具备的属性有切割部分的显示图片,开始位置的x,y坐标,最终到位的x,y坐标,移动过程的当前x,y坐标。当图片到达目标位置后,希望不能继续拖动它,给一个boolean类型变量is_inplace来限定。对于打乱的9张图片,每次单击希望让选中的小图片显示在最顶层,用一个boolean类型变量is_clicked来限定。通过集合List<Integer> indexList=new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8));决定绘图顺序,被选中PinTu对象在集合中删除原位置序号,再在集合末尾增加它的序号,该对象就能最后绘制。
public class PinTu {
    public Bitmap img;
    public boolean is_clicked, is_inplace;   
    public int begin_x, begin_y;
    public int end_x, end_y;
    public int now_x,now_y;   
public PinTu() { }}
3、用于绘图的SurfaceView显示类的设计
        采用SurfaceView 类的子类实现SurfaceHolder.Callback和Runnable接口。surfaceCreated方法用于初始化图片,用循环把底图切割成9张小图片给PinTu数组的9个元素,同时确定每个对象的初始位置,最终位置,当前位置坐标值。然后创建并启动一个用于绘图的线程。一旦启动线程,就会执行run()方法,所有的绘图工作放在该方法中,先用白色填充视图,再绘制半透明底图,再循环绘制9张小图片对象。该方法执行结束,线程就消亡。所以在run方法中定义死循环,用布尔类型变量is_run来决定循环的结束。当游戏暂停或者结束,用户单击“Back”或者“Home”都会执行surfaceDestroyed方法,因此该方法中让is_run赋值为false,实现结束run方法。


    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {    }
    public void surfaceCreated(SurfaceHolder arg0) {
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);   
        for(i=0;i<9;i++){
        pintu[i]=new PinTu();
pintu[i].img=Bitmap.createBitmap(bitmap, (i%3)*cell_length, (i/3)*cell_length, cell_length, cell_length);
pintu[i].end_x= (i%3)*cell_length;
pintu[i].end_y=(i/3)*cell_length;        
pintu[i].begin_x=random.nextInt(phone_w-cell_length);
pintu[i].begin_y=phone_w+random.nextInt(phone_h-phone_w-cell_length);  
pintu[i].now_x=pintu[i].begin_x;
pintu[i].now_y=pintu[i].begin_y;           }
        new Thread(this).start();    }
    public void surfaceDestroyed(SurfaceHolder arg0) {is_run=false;    }
    public void run() {
        while(is_run){
        synchronized (holder) {
        canvas=holder.lockCanvas();
        canvas.drawColor(Color.WHITE);
        paint.setAlpha(100);
        canvas.drawBitmap(bitmap, 0, 0, paint);
        paint.setAlpha(255);               
for(j=0;j<9;j++){
canvas.drawBitmap(pintu[indexList.get(j)].img, pintu[indexList.get(j)].now_x, pintu[indexList.get(j)].now_y, paint);}
holder.unlockCanvasAndPost(canvas);    }}}
4、触屏功能
        让选中对象顶层显示,实现逻辑是判定触屏坐标是否在PinTu对象的尺寸范围内,拖动对象实时在手指位置绘图,实现逻辑是不断计算触屏当前坐标与前一次坐标x,y偏移量,把该偏移量累加到PinTu对象的当前x,y坐标值上。松开手指判定是否到位,或是回到初始位置。每当PinTu对象移动到位,is_win变量自增,通过判定值达到9作为游戏胜利的条件,给出对话框用文字提示。
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    pre_x = (int) event.getX();
    pre_y = (int) event.getY();
    for(i=8;i>=0;i--){
    if((pre_x>pintu[indexList.get(i)].now_x&&pre_x<pintu[indexList.get(i)].now_x+cell_length)&&(pre_y>pintu[indexList.get(i)].now_y&&pre_y<pintu[indexList.get(i)].now_y+cell_length)){
        clicked_index=indexList.get(i);
        indexList.remove(i);
        indexList.add(clicked_index);break;}}
        break;    
    case MotionEvent.ACTION_MOVE:
    off_x=(int) event.getX()-pre_x;
    off_y=(int) event.getY()-pre_y; 
        pintu[clicked_index].now_x+=off_x;
        pintu[clicked_index].now_y+=off_y;            
        pre_x = (int) event.getX();
        pre_y = (int) event.getY();   
    invalidate();  break;
        case MotionEvent.ACTION_UP:
if((pintu[clicked_index].now_x>pintu[clicked_index].end_x-100)&&
(pintu[clicked_index].now_x<pintu[clicked_index].end_x+100)&&
(pintu[clicked_index].now_y>pintu[clicked_index].end_y-100)&&
(pintu[clicked_index].now_y<pintu[clicked_index].end_y+100))
    {pintu[clicked_index].now_x=pintu[clicked_index].end_x;
    pintu[clicked_index].now_y=pintu[clicked_index].end_y;           
    is_win++;     }
    else{    pintu[clicked_index].now_x=pintu[clicked_index].begin_x;
    pintu[clicked_index].now_y=pintu[clicked_index].begin_y;       }
    if(is_win==9){Toast.makeText( getContext(), "success", Toast.LENGTH_LONG).show();is_run=false; break;}
        break;
    default:     break;}
return true;}
5、在Activity组件中显示视图并让界面窗口全屏
public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GameView  myview=new GameView(this);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       setContentView(myview);    }}
三、结语
        本文通过开发基于Android手机“拼图”游戏,阐述中职学校软件专业,程序设计课程中采用的教学方法,知识点的讲解通过游戏案例作为载体,开发完整游戏,锻炼逻辑思维。
参考文献:
[1]吴亚峰.  Android编程典型实例与项目开发[M].  北京:电子工业出版社,2011
[2]李华明.  Android游戏编程之从零开始 [M].  北京:清华大学出版社,2011
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: