论文部分内容阅读
摘要:如何利用实验教学这个环节提高学生的编程技巧及兴趣,该文中设计了一堂生动有趣的C#实验课的教学过程。通过由简单到复杂,步步推进的方式,引导学生在上机时把“龟兔赛跑”这一个妇孺皆知的儿童故事制作成一个简单的游戏,在达到教学目的同时,可以激发学生学习程序设计的热情和兴趣。
关键词: C#实验课;图像绘制;“龟兔赛跑”游戏;教学设计
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)09-2144-05
A Lively and Interesting C # Experimental Teaching Design
HU Qiao-er
(Jiangsu Maritime Institue, Nanjing 211170, China)
Abstract:How to use the experimental teaching this link to improve the programming skills and interests, this paper design a vivid and interesting C # experiment teaching process. Through from simple to complex, step by step way, guide the machine when the students to" the tortoise and the hare" this one even woman and children all know the children’s story into a simple game, in the teaching aim can be achieved at the same time, can stimulate the students’ enthusiasm and interest in learning program design.
Key words:C # experiment course; Image rendering;“the tortoise and the hare" game; teaching design
1概述
众所周知,实验教学是程序设计语言理论教学的重要辅助手段。C#作为一门程序设计语言,在教学过程中上机实验是一项必不可少的教学环节。通过实验课,可以验证、巩固理论课堂教学所学的知识点,并提高学生的程序设计能力。然而,程序设计是逻辑性很强的一项艰苦工作,教师如何在课前做好充分的准备工作,通过实验内容、实验过程的设计以及实验素材的提供,激发学生的学习兴趣,是决定实验课成败的重要因素之一。下面通过实现一个简单的“龟兔赛跑”游戏,设计一堂生动有趣的C#实验课的教学过程,以供同行参考。
2实验教学设计
2.1设计实验内容
2.1.1基本部分:(达到本次实验基本目的)
1)在窗体内画一只龟和一只兔比赛跑步,用按钮控制比赛开始或结束。
2)添加背景跑道,显示乌龟和兔子跑过的距离
3)添加控制兔子停下来休息的按钮
2.1.2扩展部分:(已学知识点综合应用,增加编程兴趣、提高编程技巧)
1)添加比赛结果信息显示:窗体绘制一朵大红花,并绘制文本“XX赢了!”2)添加计数器,控制比赛在龟或兔先跑完二个来回后结束
2.2提供实验素材
乌龟的正反各4张图像,兔子的正反各4张图像,大红花图像,背景跑道图像
2.3设计实验步骤
2.3.1基本部分
1)在窗体内画一只龟和一只兔比赛跑步,用按钮控制比赛开始或结束。
a)新建1个Windows应用程序项目:Bx_1
b)设置窗体属性如下:name属性为MainForm,Text属性为“龟兔赛跑”,Size属性设为适当大小,DoubleBuffered属性为True。
c)在窗体上添加Button控件并命名为btnPlay,Text属性设为“开始”。
d)在窗体上添加Timer控件,Interval属性设为150。
e)在窗体上添加2个ImageList控件,分别命名为imgTortoise、imgRabbit,ImageSize属性均设为“100,100”,分别载入龟、兔的8张图像
f)选中窗体,并在事件窗口中双击Paint事件,生成窗体的Paint事件;双击btnPlay控件,生成按钮的Click事件;双击Timer1控件生成定时器的Tick事件。在代码窗口中输入代码:(以下给出程序框架,要求学生在实验过程完成注解部分的代码)
int torX = 0; //龟的位置
int torVX=10; //龟的方向和每次移动的距离
int torPic = 0; //龟的轮换图片索引
int rabX = 0; //免的位置
int rabVX = 30; //免的方向和每次移动的距离
int rabPic = 0; //免的轮换图片索引
private void MainForm_Paint(object sender, PaintEventArgs e)
{//用虚拟画布画图
}
private void btnPlay_Click(object sender, EventArgs e)
{//“开始”按钮和“停止”按钮的切换
}
private void timer1_Tick(object sender, EventArgs e)
{
//移动龟
//当龟方向为右时,只取前4张图片;方向为左时,只取后4张图片
//当龟到达右边界或左边界时转向
//移动兔
//当兔方向为右时,只取前4张图片;方向为左时,只取后4张图片
//当兔到达右边界或右边界时转向
this.Refresh();
}
2)添加背景跑道,显示乌龟和兔子跑过的距离
设置窗体BackGroudImage属性,修改龟兔的纵坐标,使它们位于跑道上。增加2个变量,分别用于统计龟兔跑过的距离。
3)让兔子停下来休息
添加命令按钮btnRest,该按钮的Text属性要进行“兔子跑了”或“兔子休息”的切换,在计时器控件的Tick事件中对兔子进行操作前要先加上对该按钮状态的判断。
2.3.2扩展部分
1)添加比赛结果信息显示:窗体绘制一朵大红花,并绘制文本“XX赢了!”
在比赛结束时添加绘制大红花及“XX赢了!”文本的语句。
2)添加计数器,控制比赛在龟或兔先跑完二个来回后结束。
增加2个变量分别做龟、兔的计时器,当跑到它们跑到左、右边界时计数器值加1,同时要紧跟其后增加判断比赛是否结束的语句。
2.4运行效果演示
完成基本部分及扩展部分后的程序运行效果如下面图1、图2所示。
图2程序扩展部分运行效果
2.5上课过程设计
“演示法”引入实验内容,依据实验内容分阶段,先演示运行效果,再进行要点难点分析、讲解,注意事项提醒,然后学生上机实验,教师巡回辅导,如此反复,由简单到复杂,引导学生一步步完成实验内容,达到预期的实验目的。实验各阶段要点、难点分析及注意事项参见表1。
表1分阶段要点、难点分析
在学生上机过程中,教师要巡回辅导,注意以“点”带“面”,留意学生间存在的共性问题,通过广播或投影进行提醒或集体答疑。允许学生自主练习和互助练习相结合,可以大大减轻指导教师与学生一对多的辅导压力。同时提醒学生做完一部分,调试运行一部分,便于降低程序调试难度。
实验课结束前,要有评价与总结。可以展示个人优秀作品,再次提醒上机过程中发现的突出共性问题的解决方法。
最后,布置课后作业:继续完成扩展部分的内容;在学有余力的情况下,发挥想像力,对“龟兔赛跑”的故事及画面进行创意并编程实现。
2.6程序参考代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Ex_1
{public partial class MainForm : Form
{
int torX = 0; //龟的位置
int torVX = 10; //龟的方向和每次移动的距离
int torPic = 0; //龟的轮换图片索引
int rabX = 0; //免的位置
int rabVX = 30; //免的方向和每次移动的距离
int rabPic = 0; //免的轮换图片索引
int torDis = 0; //乌龟跑的路程
int rabDis = 0; //兔子跑的路程
int countTor = 0; //乌龟的计数器
int countRab = 0; //兔子的计数器
public MainForm()
{
InitializeComponent();
}
private void MainForm_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap(ClientSize.Width, ClientSize.Height);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(imgRabbit.Images[rabPic], rabX, 270);
g.DrawImage(imgTortoise.Images[torPic], torX, 370);
e.Graphics.DrawImage(bmp, 0, 0);
g.Dispose();
bmp.Dispose();
}
private void btnPlay_Click(object sender, EventArgs e)
{
//为了可以在运行过程中反复开始游戏,变量需要初始化,为重新开始游戏做好准备
torX = 0;
torVX = 10;
torPic = 0;
rabX = 0;
rabVX = 30;
rabPic = 0;
torDis = 0;
rabDis = 0;
countRab = 0;
countTor = 0;
timer1.Start();
btnPlay.Enabled = false; //游戏开始后,“开始”按钮处于不可用状态
btnRest.Enabled = true; //游戏开始后,控制兔子休息的按钮激活
}
private void timer1_Tick(object sender, EventArgs e)
{
torX = torVX; //移动龟
torDis = Math.Abs(torVX); //增加龟跑的路程
if (torVX > 0) //当龟方向为右时,只取前4张图片;方向为左时,只取后4张图片
{ torPic = ( torPic) % 4;
}else
{ torPic = 4 ( torPic) % 4;
}
if (torX 100 >= ClientSize.Width || torX < =0)//当龟到达右边界或左边界时转向
{ torVX = -torVX;
countTor ; //龟的终点计数器加1
}
tsslTor.Text = "乌龟跑的路程:" torDis.ToString(); //状态栏显示乌龟跑的路程
if(btnRest.Text=="兔子休息")
{ rabX = rabVX; //移动兔
rabDis = Math.Abs(rabVX); //增加兔跑的路程
if (rabVX > 0) //当兔方向为右时,只取前4张图片;方向为左时,只取后4张图片
{rabPic = ( rabPic) % 4;
}else
{ rabPic = 4 ( rabPic) % 4;
} if (rabX 100 >= ClientSize.Width || rabX <= 0) //当兔到达右边界或右边界时转向
{rabVX = -rabVX;
countRab ; //兔的终点计数器加1
} }
tsslRab.Text = "兔子跑的路程:" rabDis.ToString(); //状态栏显示兔跑的路程
this.Refresh();
if (countRab >= 4 || countTor >= 4)
{ //比赛结束处理及信息显示
timer1.Stop();
btnPlay.Enabled = true; //“开始”按钮激活,准备下一次比赛
btnRest.Enabled = false; //比赛结束,控制兔子的按钮不可用
string result = "兔子赢了!";
if (torDis >= rabDis)
{
result = "乌龟赢了!!";
}
Bitmap bmp = new Bitmap(@"d:flower.jpg");
Graphics g = this.CreateGraphics();
g.DrawImage(bmp, 200, 250);//绘制“大红花”
g.DrawString(result, new Font("隶书", 30), Brushes.Red, 400, 200);
g.Dispose();
bmp.Dispose();
} }
private void btnRest_Click(object sender, EventArgs e)
{ if(btnRest.Text=="兔子休息")
{ btnRest.Text="兔子跑了";
} else
{ btnRest.Text="兔子休息";
}}}}
3结束语
经过多次教学实践证明:通过本次实验,学生能够很好地了解动画制作的基本原理,掌握C#图像绘制的方法及双缓冲技术的使用,最重要的是:本次实验通过由简单到复杂、步步推进的方式完成一个简单的游戏制作。利用这样一个妇孺皆知的儿童故事,把枯燥的编程训练变成一堂妙趣横生的实验课,学生在整个学习实验过程中热情高涨,程序设计的兴趣激增。(实验素材及代码已上传到http://www.csdn.net,供有兴趣的读者下载使用)
参考文献:
[1]王明福. C#程序设计案例教程[M].北京:科学出版社,2009
[2]陈广. C#程序设计基础教程与实训[M].北京:北京大学出版社,2008.
关键词: C#实验课;图像绘制;“龟兔赛跑”游戏;教学设计
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)09-2144-05
A Lively and Interesting C # Experimental Teaching Design
HU Qiao-er
(Jiangsu Maritime Institue, Nanjing 211170, China)
Abstract:How to use the experimental teaching this link to improve the programming skills and interests, this paper design a vivid and interesting C # experiment teaching process. Through from simple to complex, step by step way, guide the machine when the students to" the tortoise and the hare" this one even woman and children all know the children’s story into a simple game, in the teaching aim can be achieved at the same time, can stimulate the students’ enthusiasm and interest in learning program design.
Key words:C # experiment course; Image rendering;“the tortoise and the hare" game; teaching design
1概述
众所周知,实验教学是程序设计语言理论教学的重要辅助手段。C#作为一门程序设计语言,在教学过程中上机实验是一项必不可少的教学环节。通过实验课,可以验证、巩固理论课堂教学所学的知识点,并提高学生的程序设计能力。然而,程序设计是逻辑性很强的一项艰苦工作,教师如何在课前做好充分的准备工作,通过实验内容、实验过程的设计以及实验素材的提供,激发学生的学习兴趣,是决定实验课成败的重要因素之一。下面通过实现一个简单的“龟兔赛跑”游戏,设计一堂生动有趣的C#实验课的教学过程,以供同行参考。
2实验教学设计
2.1设计实验内容
2.1.1基本部分:(达到本次实验基本目的)
1)在窗体内画一只龟和一只兔比赛跑步,用按钮控制比赛开始或结束。
2)添加背景跑道,显示乌龟和兔子跑过的距离
3)添加控制兔子停下来休息的按钮
2.1.2扩展部分:(已学知识点综合应用,增加编程兴趣、提高编程技巧)
1)添加比赛结果信息显示:窗体绘制一朵大红花,并绘制文本“XX赢了!”2)添加计数器,控制比赛在龟或兔先跑完二个来回后结束
2.2提供实验素材
乌龟的正反各4张图像,兔子的正反各4张图像,大红花图像,背景跑道图像
2.3设计实验步骤
2.3.1基本部分
1)在窗体内画一只龟和一只兔比赛跑步,用按钮控制比赛开始或结束。
a)新建1个Windows应用程序项目:Bx_1
b)设置窗体属性如下:name属性为MainForm,Text属性为“龟兔赛跑”,Size属性设为适当大小,DoubleBuffered属性为True。
c)在窗体上添加Button控件并命名为btnPlay,Text属性设为“开始”。
d)在窗体上添加Timer控件,Interval属性设为150。
e)在窗体上添加2个ImageList控件,分别命名为imgTortoise、imgRabbit,ImageSize属性均设为“100,100”,分别载入龟、兔的8张图像
f)选中窗体,并在事件窗口中双击Paint事件,生成窗体的Paint事件;双击btnPlay控件,生成按钮的Click事件;双击Timer1控件生成定时器的Tick事件。在代码窗口中输入代码:(以下给出程序框架,要求学生在实验过程完成注解部分的代码)
int torX = 0; //龟的位置
int torVX=10; //龟的方向和每次移动的距离
int torPic = 0; //龟的轮换图片索引
int rabX = 0; //免的位置
int rabVX = 30; //免的方向和每次移动的距离
int rabPic = 0; //免的轮换图片索引
private void MainForm_Paint(object sender, PaintEventArgs e)
{//用虚拟画布画图
}
private void btnPlay_Click(object sender, EventArgs e)
{//“开始”按钮和“停止”按钮的切换
}
private void timer1_Tick(object sender, EventArgs e)
{
//移动龟
//当龟方向为右时,只取前4张图片;方向为左时,只取后4张图片
//当龟到达右边界或左边界时转向
//移动兔
//当兔方向为右时,只取前4张图片;方向为左时,只取后4张图片
//当兔到达右边界或右边界时转向
this.Refresh();
}
2)添加背景跑道,显示乌龟和兔子跑过的距离
设置窗体BackGroudImage属性,修改龟兔的纵坐标,使它们位于跑道上。增加2个变量,分别用于统计龟兔跑过的距离。
3)让兔子停下来休息
添加命令按钮btnRest,该按钮的Text属性要进行“兔子跑了”或“兔子休息”的切换,在计时器控件的Tick事件中对兔子进行操作前要先加上对该按钮状态的判断。
2.3.2扩展部分
1)添加比赛结果信息显示:窗体绘制一朵大红花,并绘制文本“XX赢了!”
在比赛结束时添加绘制大红花及“XX赢了!”文本的语句。
2)添加计数器,控制比赛在龟或兔先跑完二个来回后结束。
增加2个变量分别做龟、兔的计时器,当跑到它们跑到左、右边界时计数器值加1,同时要紧跟其后增加判断比赛是否结束的语句。
2.4运行效果演示
完成基本部分及扩展部分后的程序运行效果如下面图1、图2所示。

图2程序扩展部分运行效果
2.5上课过程设计
“演示法”引入实验内容,依据实验内容分阶段,先演示运行效果,再进行要点难点分析、讲解,注意事项提醒,然后学生上机实验,教师巡回辅导,如此反复,由简单到复杂,引导学生一步步完成实验内容,达到预期的实验目的。实验各阶段要点、难点分析及注意事项参见表1。
表1分阶段要点、难点分析

在学生上机过程中,教师要巡回辅导,注意以“点”带“面”,留意学生间存在的共性问题,通过广播或投影进行提醒或集体答疑。允许学生自主练习和互助练习相结合,可以大大减轻指导教师与学生一对多的辅导压力。同时提醒学生做完一部分,调试运行一部分,便于降低程序调试难度。
实验课结束前,要有评价与总结。可以展示个人优秀作品,再次提醒上机过程中发现的突出共性问题的解决方法。
最后,布置课后作业:继续完成扩展部分的内容;在学有余力的情况下,发挥想像力,对“龟兔赛跑”的故事及画面进行创意并编程实现。
2.6程序参考代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Ex_1
{public partial class MainForm : Form
{
int torX = 0; //龟的位置
int torVX = 10; //龟的方向和每次移动的距离
int torPic = 0; //龟的轮换图片索引
int rabX = 0; //免的位置
int rabVX = 30; //免的方向和每次移动的距离
int rabPic = 0; //免的轮换图片索引
int torDis = 0; //乌龟跑的路程
int rabDis = 0; //兔子跑的路程
int countTor = 0; //乌龟的计数器
int countRab = 0; //兔子的计数器
public MainForm()
{
InitializeComponent();
}
private void MainForm_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap(ClientSize.Width, ClientSize.Height);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(imgRabbit.Images[rabPic], rabX, 270);
g.DrawImage(imgTortoise.Images[torPic], torX, 370);
e.Graphics.DrawImage(bmp, 0, 0);
g.Dispose();
bmp.Dispose();
}
private void btnPlay_Click(object sender, EventArgs e)
{
//为了可以在运行过程中反复开始游戏,变量需要初始化,为重新开始游戏做好准备
torX = 0;
torVX = 10;
torPic = 0;
rabX = 0;
rabVX = 30;
rabPic = 0;
torDis = 0;
rabDis = 0;
countRab = 0;
countTor = 0;
timer1.Start();
btnPlay.Enabled = false; //游戏开始后,“开始”按钮处于不可用状态
btnRest.Enabled = true; //游戏开始后,控制兔子休息的按钮激活
}
private void timer1_Tick(object sender, EventArgs e)
{
torX = torVX; //移动龟
torDis = Math.Abs(torVX); //增加龟跑的路程
if (torVX > 0) //当龟方向为右时,只取前4张图片;方向为左时,只取后4张图片
{ torPic = ( torPic) % 4;
}else
{ torPic = 4 ( torPic) % 4;
}
if (torX 100 >= ClientSize.Width || torX < =0)//当龟到达右边界或左边界时转向
{ torVX = -torVX;
countTor ; //龟的终点计数器加1
}
tsslTor.Text = "乌龟跑的路程:" torDis.ToString(); //状态栏显示乌龟跑的路程
if(btnRest.Text=="兔子休息")
{ rabX = rabVX; //移动兔
rabDis = Math.Abs(rabVX); //增加兔跑的路程
if (rabVX > 0) //当兔方向为右时,只取前4张图片;方向为左时,只取后4张图片
{rabPic = ( rabPic) % 4;
}else
{ rabPic = 4 ( rabPic) % 4;
} if (rabX 100 >= ClientSize.Width || rabX <= 0) //当兔到达右边界或右边界时转向
{rabVX = -rabVX;
countRab ; //兔的终点计数器加1
} }
tsslRab.Text = "兔子跑的路程:" rabDis.ToString(); //状态栏显示兔跑的路程
this.Refresh();
if (countRab >= 4 || countTor >= 4)
{ //比赛结束处理及信息显示
timer1.Stop();
btnPlay.Enabled = true; //“开始”按钮激活,准备下一次比赛
btnRest.Enabled = false; //比赛结束,控制兔子的按钮不可用
string result = "兔子赢了!";
if (torDis >= rabDis)
{
result = "乌龟赢了!!";
}
Bitmap bmp = new Bitmap(@"d:flower.jpg");
Graphics g = this.CreateGraphics();
g.DrawImage(bmp, 200, 250);//绘制“大红花”
g.DrawString(result, new Font("隶书", 30), Brushes.Red, 400, 200);
g.Dispose();
bmp.Dispose();
} }
private void btnRest_Click(object sender, EventArgs e)
{ if(btnRest.Text=="兔子休息")
{ btnRest.Text="兔子跑了";
} else
{ btnRest.Text="兔子休息";
}}}}
3结束语
经过多次教学实践证明:通过本次实验,学生能够很好地了解动画制作的基本原理,掌握C#图像绘制的方法及双缓冲技术的使用,最重要的是:本次实验通过由简单到复杂、步步推进的方式完成一个简单的游戏制作。利用这样一个妇孺皆知的儿童故事,把枯燥的编程训练变成一堂妙趣横生的实验课,学生在整个学习实验过程中热情高涨,程序设计的兴趣激增。(实验素材及代码已上传到http://www.csdn.net,供有兴趣的读者下载使用)
参考文献:
[1]王明福. C#程序设计案例教程[M].北京:科学出版社,2009
[2]陈广. C#程序设计基础教程与实训[M].北京:北京大学出版社,2008.