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

(整期优先)网络出版时间:2021-03-26
/ 3

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

王泽良

四川仪表工业学校 重庆 400000

摘要:对于中职学校软件专业学生教学,程序设计课程不能照搬高校教学计划与实施方案。本文针对中职学生基础差,理解能力弱,逻辑思维能力不足,容易畏难,容易放弃等特点,探讨兴趣激发,简单易学的教学方法,让学生掌握更多的程序设计知识与软件开发技巧。

关键词:程序设计;教学方法;Android

一、选择趣味游戏做案例

传统的教学案例,常常是随便列举一些例子,比如选择分支结构程序教学部分,一般使用的案例是“成绩分数判断及格与否”。学生也能理解学习使用。如果选择更有趣的游戏案例,学生兴趣更浓,愿望更强烈,主动性更强。比如“石头剪刀布”让电脑随机出拳,再让玩家出拳,再判断胜负。这样的教学效果更好。学完一门课程或者部分章节,都会使用综合性的案例,考察学生学习情况。下面以基于Android手机平台的“拼图游戏”为例,把案例中的知识点,运用到实际项目开发。

二、极少代码极简逻辑完成实例

1、分析游戏思路

该拼图游戏的玩法是首先启动游戏后,界面背景显示一张半透明的图片用于参考位置,上部分切割为3x3的正方形小块,下部分打乱存放9张清晰的小图片,拖动这9张图片到对应的位置,游戏胜利。程序设计的原则是代码量尽量少,细节不要太多,函数方法相互调用少,结构简单,逻辑清晰。

2、小块图片实体类设计

设计一个名为PinTu的类,具备的属性有切割部分的显示图片,开始位置的x,y坐标,最终到位的x,y坐标,移动过程的当前x,y坐标。当图片到达目标位置后,希望不能继续拖动它,给一个boolean类型变量is_inplace来限定。对于打乱的9张图片,每次单击希望让选中的小图片显示在最顶层,用一个boolean类型变量is_clicked来限定。通过集合List indexList=new ArrayList(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_xpintu[indexList.get(i)].now_y&&pre_y

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].now_y>pintu[clicked_index].end_y-100)&&

(pintu[clicked_index].now_y

{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