趣味游戏驱动的程序设计实践

2016-08-19 18:08孙瑜
科教导刊·电子版 2016年19期
关键词:程序设计教学设计实践

孙瑜

摘 要 为了提高程序设计课程的教学效果,通过游戏类趣味问题驱动来引发学习兴趣,借助程序设计的知识载体,学习和掌握基本问题的求解过程和基本思路;以达到在解决问题的实践中训练和培养观察能力、分析解决问题的实践能力。

关键词 教学设计 猜数字游戏 程序设计 实践

中图分类号:G633 文献标识码:A

0序言

计算机程序设计语言课程如 C、C++语言课程,是一门受众面广、实用性强的课程。在多年的C++教学中,不乏学生们对C++编程难学、枯燥的抱怨。程序设计课程是“编”出来的,学生要花大量时间在上机实验中去编程序,仅仅在面授课中讲解是远远不够的。如何在上机实验中激发学生的兴趣,调动起学生的学习积极性,对于学好C++语言这样实践性强的课程是十分重要的。为了达到更好的学习效果,需要让学生主动学习,以学生为主体,以激发学生的兴趣为目标,强调实践和思考的教学理念。更多的是通过学生自主阅读、实验、程序编写、调试等环节达到学习目的。

1问题引入

为了循序渐进地引入教学内容,同时考虑到对不同学生进行因材施教,设计具有游戏趣味的猜数字问题,根据难易程度分为如下三个等级:

(1)问题1(用户猜测100以内随机整数):电脑随机产生一个1-100之间的随机数,让用户猜测,电脑提示用户猜大了、猜小了还是猜对了,根据提示,若没猜对,用户继续猜测下一个数字,直到猜对为止。要求猜测次数不超过10次。

(2)问题2(用户猜测电脑产生的4位整数):电脑随机产生一个各位互不重复的4位整数,请用户猜测一个数字,电脑反馈信息为xAyB,以字母A表示用户猜对了x个仅数值正确,位置不正确的数字,以字母B表示y个数值和位置都正确的数字,例如:如果系统生成的数字为2794,而玩家输入的数字为1234,则反馈信息为 2A1B。根据反馈,用户继续猜测下一个数字,如果反馈信息为4A4B则意味着玩家猜出了全部的4个数字而获胜。

(3)问题3(电脑猜测用户想的4位整数):用户想一个各位互不重复的4位整数,请电脑猜测一个数字,用户反馈信息xAyB,以字母A表示用户猜对了x个仅数值正确,位置不正确的数字,以字母B表示y个数值和位置都正确的数字,例如:如果系统生成的数字为2794,而玩家输入的数字为1234,则反馈信息为 2A1B。根据反馈,电脑继续猜测下一个数字,如果反馈信息为4A4B则意味着电脑猜出了全部的4个数字而获胜。要求电脑猜测的次数不超过10次。

2教学设计

为了达到更好的教学效果,让学生参与学习、主动学习,增强学习兴趣,对不同难度的问题,进行不同的教学过程设计。

问题1:提出问题,程序演示,分析问题,任务分解,流程设计,代码设计,代码调试。

问题2:提出问题,程序演示,分析问题,课下自行代码编写,代码调试。

问题3:提出问题,程序演示,关键任务思路分析,数据结构设计,课下代码编写、调试。

2.1 问题分析

2.1.1问题1的任务分解

任务1.1 产生一个100以内的随机数;任务1.2 用户猜测一个数字; 任务1.3 判断猜测的正确性,并给出提示;任务1.4 若没猜对,继续转任务12。若猜对了,或者猜测次数超过10次,结束程序。

2.1.2问题2的任务分解

任务2.1 产生一个无重复四位数;任务2.2 用户猜测一个数字;

任务2.3 分析猜测结果,给出提示;进一步细分难点任务。

任务2.3.1 将四位数的各位分离,分别分离产生的答案数字和用户猜测数字的各位数字;

任务2.3.2 比较答案和猜测的数字,得出猜测结果xAyB;

任务2.4 若猜测正确或猜测次数>10,结束猜测;否则,转任务22;任务2.5 输出猜测结果。

2.1.3问题3的任务分解

任务3.1 用户默想一个无重复四位数;任务3.2 程序产生一个候选猜测数字;任务3.3 用户输入猜测数字的正确数字和位置xAyB;任务3.4 根据猜测结果,过滤排除候选数字;

任务3.5 若猜测正确或猜测次数>10,结束猜测;否则,转任务3.2。

3.2 教学内容与案例目标的分解

结合案例分析,循序渐进地教学设计,教学内容与案例任务结合如下:

3.2.1教学内容

(1)选择结构:任务1.3 判断猜测的正确性;

(2)循环结构:任务1.4 继续猜测,直至猜对;任务2.4 重复猜测直至 猜对,或者猜测次数>10;

(3)函数:任务2.1 产生一个无重复四位数;任务2.3 分析猜测结果,得出xAyB;任务3.2 产生下一个猜测数字;任务3.4 过滤排除候选数字;

(4)数组:任务2.3.1将四位数的各位分离;利用二维数组进行数据结构设计;

(5)指针、STL::list:利用链表、list进行数据结构设计。

3.3 流程设计

3.3.1问题1 的流程设计

step1. 初始化,产生一个1-100之间的随机数;

step2. 判断猜测正确或猜测次数>10,若是转step5.

step3. 用户输入猜测数字;

step4. 分析猜测结果,并反馈;猜测次数增1,返回step2.

step5. 输出猜测结果。

3.3.2问题2 的流程设计

step1. 初始化,产生一个无重复四位数myRand(); 分离各位数字separate();

step2. 判断猜测正确或猜测次数>10,若是转step5.

step3. 用户输入猜测数字;

step4. 分离并分析猜测结果,并反馈;猜测次数增1,返回step2.

step5. 输出猜测结果。

3.3.3问题3的设计与分析

(1)数据结构设计。

方案一: 定义二维数组tree[4540][6],存放格式:{1, 2, 3,4, 1234, 0} ,最后分量取值为0表示尚未排除,取值为-1表示已排除,取值>0表示很可能候选。

方案二:定义链表决策树tree,存放所有候选4位数字,若排除某个候选数字,则删除此结点,最后直至剩下1个或0个。

方案三:利用STL的list定义主数据结构tree,可以利用STL::list提供的函数,更方便地进行数据存储和处理。

(2)主流程设计。

step1. 初始化tree。void init(){}//将所有四位不重复的数字,从小到大存放在tree中,1023 1024 … 9876。

step2. 产生一个候选数字guessNext()。取下一个候选数字;返回值-1表示没有答案;

step3. 用户输入猜测数字的正确数字和位置xAyB;

step4. 将所有tree中候选数字逐一比较是否满足xAyB,不满足则排除掉;void filter(int n){ }

step5. 转step2.

4 代码设计与调试

问题1可以根据教学内容在课堂上进行代码的逐步完善,并演示基本的代码调试技巧。对于问题2在课堂上进行主流程分析后,编写代码框架,让学生在课下进行代码的具体编写和调试。

问题2的程序主框架

int myRand(){//产生一个四位数,各位数字互不重复

/*产生1-9之间的随机数a;产生0-9之间的随机数b、c、d,且abcd均互不相同。*/

res=a*1000+b*100+c*10+d; return res; }

void seperate(int num,int ans[]){//将一个四位数各位分离,存放在数组中

//将4位数num,分离出千、百、十、个位,存放在ans[0]、ans[1]、ans[2]、ans[3]中。}

void compare(int guess[], int answer[], int & digit, int& location){

//比较guess与answer,猜对了digit个数字,猜对了location个位置 略}

int main(){

int guess=0,guessDigits[4]={0},guessTimes=0; //数据结构定义

int answer=1234,answerDigits[4]={0}; int digitOK=0,locationOK=0; int i=0,j=0;

answer=myRand();//产生一个四位数

seperate(answer,answerDigits);//将答案各位数分离

while(digitOK<=4 && locationOK<4 &&guessTimes<10){ //开始猜测

guessTimes++;

cout<

cin>>guess;//输入用户猜测

seperate(guess,guessDigits); //将猜测各位数分离

compare(guessBits,answerDigits,digitOK,locationOK);//判断猜测结果

cout<<"\b "<

if(guessTimes>=10 &&locationOK<4)//输出猜测结果

cout<<"Guess more than 10 times,you lose the game.\n";

else{cout<<"you win the game.\n"; }

return 0; }

利用STL::list方案进行问题3的思路设计,提供一个思路,让学生自行实现程序。

list tree;//存放候选数字的决策树

int guessed[11][3]={{0}};//存放所有猜测过的数字与反馈结果

void init(){//初始化决策树,分别存放1023,1024,…,9875,存放格式为1 0 2 3 1023 0(-1或1)

//略

tree.empty();

i=tree.begin();

//略

tree.push_back(n); i++;

//略 }

//产生下一个猜测数字,n表示猜测次数

int guessNext(int n){

int res=1234; list::iterator i;

if(n==1)

return res;

i=tree.begin();

if(!tree.empty()){//取出候选数字}

else{cout<<"you are cheating.\n"; res=-1;}

return res; }

bool compare(int ans,int gue,int x,int y){ //判断gue与ans的反馈信息是否符合xAyB

/*分离ans和gue的各位数字; 判断数字正确个数是否为x个;判断数字和位置均正确个数是否为y个*/ }

//根据猜测结果,筛选过滤候选数字,留下满足xAyB反馈的数字,去除不满足的候选数字。

void filter(int n){

//略

x=guessed[n][1];y=guessed[n][2];

while(i!=tree.end()){

if(compare(*i,guessed[n][0],A,B)){//符合反馈信息

i++;}

else{ //排除掉该候选数字

i=tree.erase(i); } } }

int main(){//主函数

int numOK=0,locationOK=0,guess=1234,n=0;

init();

while(guess!=-1 && locationOK<4 && n<=10){ //尚未反馈4A4B, 且猜测次数<10

guess=guessNext(n+1);

if(guess==-1)break;//没有正确数字,退出

cout<<++n<<"th guess: "<

cin>>numOK>>locationOK;//存放猜测数字以及反馈信息

filter(n);//过滤排除候选数字 }

return 0; }

5 结语

从教学实践情况来看,这种教学设计方式确定了课程的实施方案及操作步骤,以提高学生学习积极性和主动性为导引,能够及时获得反馈,取得了很好的教学效果。如何能更加合理地运用更好的教学方式去教学,还是有很多内容值得我们去实践和探索的。

参考文献

[1] 吴文虎.我怎么讲好“程序设计基础”这门课[J].中国大学教学,2011(12):10-12.

[2] 李可.编写小型游戏程序在C++教学中的一点应用心得[J].科技资讯,2008(27):19-20.

[3] 王之元,易晓东,李姗姗.面向MOOC的程序设计语言课程教学设计[J].计算机教育,2014(2):55-58.

[4] 何钦铭.“程序设计基础”课程教学实施方案[J].中国大学教学,2010(5):62-65.

[5] 刘芳.《C语言程序设计》教学存在的问题及改进[J].教育理论与实践,2012,32(36):51-52.

[6] 孙慧然.“程序设计基础课”理论与实验教学的改革与实践[J].实验技术与管理,2012,29(4):299-300.

[7] 教育部高等学校计算机科学与技术教学指导委员会.高等学校计算机科学与技术专业核心课程教学实施方案[M].北京:高等教育出版社,2009.

[8] 谭浩强.C++程序设计(第2版)[M].北京:清华大学出版社,2013.

猜你喜欢
程序设计教学设计实践
基于Visual Studio Code的C语言程序设计实践教学探索
从细节入手,谈PLC程序设计技巧
高职高专院校C语言程序设计教学改革探索
高中数学一元二次含参不等式的解法探讨
“仿真物理实验室” 在微课制作中的应用
翻转课堂在高职公共英语教学中的应用现状分析及改善建议
PLC梯形图程序设计技巧及应用