实验报告
实验名称:《学生学籍管理系统》可行性分析报告
院 系: 计算机科学与工程学院
专 业: 软件工程
班 级: Y121121
学 号: Y12112120
姓 名: 陆风超
指导教师: 王晓楠
开课时间: 2014 至 2015 学年下学期
常熟理工学院计算机科学与工程学院 制
目录
1.系统建立的背景... III
2.现行系统存在的问题分析... IV
3.系统的开发方式和目标... IV
4.系统的可行性分析... VI
4.1经济可行性分析... VII
4.2运行可行性... VII
1.系统建立的背景
现在的社会日新月异,学校的发展也需要与时俱进。学生的数量越来越大,学籍资料更换频率频繁。手工数据管理,资料存放在多处,没有统一管理模式,整理不便,统计困难,劳动量大,却质量低下,错误频发。由此可见,手工管理模式的缺点日益凸显。
随着教育体制改革,学生管理正在逐步迈向管理信息现代化。学籍管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学籍管理系统应该能够为用户提供充足的信息和快捷的查询手段。可是我国学生管理信息化水平并不高。学生学籍管理系统要实现的目标是为该校提供全面的学生学籍管理的解决方案,以解决传统人工管理方式效率低、保密性差,不利于查找、更新和维护的问题,极大地提高学生学籍管理的效率,节约教育经费,以适应学校信息化建设的发展趋势
2.现行系统存在的问题分析
当前,学生学籍管理的弊端主要表现在两方面:一,工作繁杂、工作量大、错误率高;二,缺乏监督体系和控制手段。学籍管理的政策性很强,应该严格按照上级部门的有关政策和规定办事,然而,由于传统的学籍管理模式缺乏有效的监督措施,使有关部门的政策规定难以得到及时准确的贯彻执行,使学籍管理工作完全失去了应有的严肃性,给学校的人才培养质量带来了严重的影响,也给社会带来了很大的负面影响。
3.系统的开发方式和目标
提高学生学籍管理的效率,节约管理成本,增强学生管理的安全性。满足学校领导、教育管理单位、学生管理人员、教师和学生的不同层次和不同方面的需要。为学校将来的整体信息化建设提供必要的支持。总之,通过该系统的建设来提高学校学生
学籍管理效率,使得学校的发展能够适应当前的教育信息化建设的总体发展趋势。 因此,开发一个功能完善、操作简单、界面友好、有针对性的学籍管理系统对学校、乃至社会都是非常必要,非常有意义的。
以现代计算机技术、网络技术为基础的数字化教学正朝着信息化、网络化、现代化的目标迈进。如今,国内的大部分学校都已接入或将要接入互联网并建成校园网,各校的硬件设施已经比较完善,通过设计和建设网络拓扑架构、网络安全系统、数据库基础结构、信息共享与管理,从而实现教育的网络化和信息化。与网络技术相结合的新型学生学籍管理模式,对教育、教学过程有着极为宝贵的特性,可以为新型的办学模式提供一个信息化的平台。
当前市场上学生学籍管理方面软件较多,但一般都是单机版,没有实现连网功能。而就现在学生学籍信息管理的发展趋势,以及学校跨校区延伸管理和二级学院分级管理的实际情况,这种单机版的管理软件并不是很实用。市场上学生学籍管理的软件侧重于记录学生的基本情况,其基本功能已不太适合现在规模扩大的广大学校。随着学校办学规模的扩大、专业设置和学生人数的逐年增加,原本基于小型数据库的、半手工操作、单机版的学生学籍管理系统已经难以适应当今广大学校的发展要求,而应用先进的信息网络技术建立一套完整、规范的学生学籍信息资料计算机管理学籍,以便快捷地录入、统计、查询、检索学生的各类信息,及时了解学生的学习情况、使不同校区、二级学院、系部的分级管理达到资源共享,协同管理,实现管理信息现代化、规范化和科学化的学籍管理系统是现代学籍信息管理系统的发展趋势。它还必须具备使用方便,界面简洁,学校的管理人员很容易操作和使用的特点。相信这种学生学籍管理软件会得到广大学校和广大学生信息管理人员的青睐。
由于本系统管理的对象单一,都是学生,且每个数据内容具有较强的关联性,涉及的计算过程不是很复杂。因此,比较适合于采用数据库管理。在技术难度方面,由于有指导老师的指导和相关参考文献,特别是网上资料,特别是参考其它程序的功能,因此完全可以实现。
4.系统的可行性分析
本系统利用现有的人力和物力开发出来的,作为阶段性产品,日后的发展空间大,实现方法逐步简单容易,并且开发本系统所使用的语言及设计平台,成熟稳定,经过多方面验证。Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话互联网。此次设计所使用的数据库是MySQL,具有可伸缩性和可用性,企业级数据库功能以及易于安装部署和使用的特点。而是用的开发工具是MyEclipse。这是一个十分优秀的用于开发Java的Eclipse插件集合,功能强大,支持也十分广泛,尤其对各种开源产品的支持十分不错。因此通过物力人力来分析,学籍管理系统在技术上是完全可行的。随着计算机技术发展到了一个新的时期,网络技术在十几年的发展过程中已日臻完善,而基于WEB的数据库技术也已经十分成熟。在语言方面ASP,PHP,Java也用事实证明了其强大的功能,还有微软最引以为豪的.NET 技术,更显示了在基于网络的应用中的强劲优势。至此,一种基于网络的、管理方便的、反应迅速的、具有交互性的学生管理信息系统应运而生了。
新式的学生管理系统采用了最新的数据库系统结构:B/S结构。这种基于B/S结构的学生管理信息系统在应用中显示了明显的优势。
数据库结构的规划是应用程序设计中一个非常重要的环节。学生学籍管理系统要处理与表现的数据量较多,若使用传统的方式来完成任务,可能会事倍功半,甚至有些任务还无法完成;学生学籍系统的设计开发,需要一套完善的数据库管理系统[3]。对于数据库系统的选用,如果所建立的是私人的Intranet,则可以使用Access等桌面型数据库,但是像学生学籍系统这样需储存大量的数据和用户的系统设计,则需使用较大型的数据库,例如:SQL Server、Oracle、Informix、DB2、Sybase等。本文的设计则应用到MySQL。
4.1经济可行性分析
经济可行性分析中最重要的内容之一是成本--效益分析。计算机发展到今天,价格低,功能强大。本系统的开发可以代替人工进行许多繁杂的劳动,节省资源,减少人工开支,提高学生管理工作的效率,节省资金。同时还能具有较高的安全性。同时本系统所消耗资源小,学校的电脑都能够满足,使教学质量更上一个台阶。开发及后期维护费用几乎可忽略不计,由于操作简单,实用性强,不需要进行高费用的专业培训。因此本系统可属于低成本,高效益的结合体,在经济上是可行的。
4.2运行可行性
本系统界面大方,操作方便,无需专业指导,就可轻易上手。无论是系统管理人员还是教师,均能进行操作,营运环境要求底。
面对系统设计还应该以“标准型、安全性、高效性、保密性、可维护性”为基准,在着眼于当前实用的基础上,为将来系统的扩展,升级留有余地。软件的开发应能在较长的时间内满足学校的发展需要。
标准型要系统的编写与运行必须符合标准,既可以保证系统正常运行,又可以保证在此标准上,系统的每项功能运行良好。
可靠性指学籍信息至关重要,因此所编写的系统务必稳定可靠,从而避免或减少不必要的数据损失,防止对教学管理造成不便。
安全性是指控制使用者的用户权限,通过限制其权限,达到系统的安全要求,从而保证使用者无法操作与其无关的数据。
高效性是校学生信息量较大 ,因此系统对信息的处理能力和响应能力都应该是快捷有效。
可维护性是采用结构化模块设计,便于开发与维护,有利于系统的不断更新
第二篇:[解]实训报告参照格式模版
青岛大学软件技术学院
基于c++的推箱子游戏
实训报告
姓 名: 严凡杰
专 业: 数字媒体
班 级: 09级4班
指导教师: 解新峰
20xx年7 月18日
目 录
1 实训目的 .................................................................. 1
2 实训安排 .................................................................. 1
2.1 实训时间 ............................................................ 1
2.2 实训进度 ............................................................ 1
3 实训内容 .................................................................. 2
3.1 游戏策划 ............................................................ 2
3.2 总体设计: .......................................................... 2
3.3 关键算法 ............................................................ 4
4 实训遇到的问题及其分析和解决 ............................................. 12
4.1 .................................................................... 12
4.2 .................................................................... 12
5 实训总结 ................................................................. 13
1 实训目的
实训是课程教学中的一项重要内容,是完成教学计划达到教学目标的重要环节,是一门专业基础课或专业课教学计划中综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践能力、为毕业设计及毕业后从事专业技术工作打下基础,提高学生全面素质具有重要的意义。
通过进行实训了解了游戏策划案的编写流程,更好的巩固了平时的理论学习,同时也为以后的工作打下基础,在工作中能够更快的熟练操作。通过使用c语言编写游戏程序,对于编程语言和技术应用能够更加熟练的掌握,对编程语言、技术应用和综合动手能力的锻炼和提高具有重要意义。同时实训弥补了平时学习中缺少实践的缺陷,使得平时理论知识的学习通过实训得到巩固。这次实训是我们进入社会的一次预演,是将书本中的知识应用到实践中的一次检验。
2 实训安排
2.1 实训时间
20xx年7月9号——20xx年7月20号,共两周(周一到周五),十天时间。
2.2 实训进度
07-09前:布置实训内容、要求等具体工作;
07-09到07-10:完成交互式游戏策划案的编写;
07-11到07-16:完成代码的设计和编写、调试;
07-16到07-18:完成实训报告的撰写;
07-19:提交实训代码(电子版)和报告(电子版和打印版)。
1
3 实训内容
3.1 游戏策划
本游戏一共4关,由易到难,每一关都有初化、按键处理、重置及退出功能。
(1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。
(2)按键处理包括移动小瓢虫和移动箱子,通过移动上下左右键来控制小瓢虫的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
(3)每一关都可以重置,按空格键可以重置当前关。
(4) 按Esc键可以在任何时候退出游戏。
3.2 总体设计:
3.2.1系统模块图
本设计包括5个模块,分别是初始化模块、图画模块、移动箱子模块、移动小瓢虫模块和功能控制模块。各个模块的功能描述如下。
(1)初始化模块
该模块包括屏幕初始化和游戏每一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
(2)图画模块
该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小瓢虫和画目的地。
(3)移动箱子模块
该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
(4)移动小人模块
该模块用于控制小人移动,从而推动箱子到目的地。
(5)功能控制模块
该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
系统功能模块图,如图1.1所示。
2
图 1.1推箱子系统功能模块图
3.2.2 逻辑结构设计
逻辑结构设计主要是描述系统中各实体之间的关系,具体如图1.2所示:
图 1.2 推箱子系统E-R图
3
3.3 关键算法
3.3.1 人物设置:即在特定的坐标将人物画出。
在ghouse数组中特定的坐标点用printman函数画出小人:
void printman(int x,int y)
{
gotoxy(y,x);
_AL=02;_CX=01;_AH=0xa;
geninterrupt(0x10);
}
printman(2+4,4+10);
3.3.2 在特定的坐标点画出箱子,并写下‘b’。
在ghouse数组中特定的三个坐标设置三个箱子并由printbox函数给箱子写下'b': /* 在特定的坐标上画箱子并用数组记录状态的函数 */
void printbox(int x,int y)
{
putchxy(y-1,x-1,10,WHITE,BLACK); /*设置箱子,样式10,前景色 白色,背景色 黑色*/
ghouse[x][y]='b';
}
printbox(3+4,6+10); /*在特定的坐标点写下箱子*/
printbox(3+4,7+10);
printbox(4+4,7+10);
3.3.3 墙壁设置,在ghouse数组中画出墙壁并写下‘w’。
在ghouse数组中画出墙壁,并用printwall函数写下'w':
(通过for循环实现)
/* 在特定的坐标上画墙壁并用数组记录状态的函数 */
void printwall(int x,int y)
{
putchxy(y-1,x-1,219,MAGENTA,BLACK);
/*x,y,219 样式参数,MAGENTA 前景色,BLACK 背景色(x,y初始值为1,所以减1)*/ ghouse[x][y]='w';
}
for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/ printwall(x+4,y+10);
for(y=5,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=9,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=1,x=3;x<=8;x++)
printwall(x+4,y+10);
for(x=3,y=3;x<=5;x++)
4
printwall(x+4,y+10);
for(x=5,y=8;x<=9;x++)
printwall(x+4,y+10);
for(x=7,y=4;x<=9;x++)
printwall(x+4,y+10);
for(x=9,y=5;y<=7;y++)
printwall(x+4,y+10);
for(x=8,y=2;y<=3;y++)
printwall(x+4,y+10);
printwall(5+4,4+10);
printwall(5+4,7+10);
printwall(3+4,2+10);
3.3.4 目的地的设置:通过特定的坐标画出目的地,并写下‘m’,并用链表与ghouse数组记录目的地信息,用链表记录目的地在ghouse数字组中位置(下标)。
目的地:3个,在ghouse函数中在特定的三个坐标点画出目的地,并用printwhither1函数写下'm'并记录记录'm':如//目的地的坐标是由链表记录的,6个值表示坐标,由三个节点的链表来记录
/* 在特定的坐标上画目的地并用数组记录状态的函数 */
winer *qw;
putchxy(y-1,x-1,'*',YELLOW,BLACK);
ghouse[x][y]='m';
if(*win==NULL) /*刚输入时*win==null,if语句执行,将第一个目的地存入第一节点*/
{
*win=*pw=qw=(winer* )malloc(sizeof(winer));
(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* -> 结构体成员符*/
}
else /*存入信息后执行else语句,将链表进行连接*/
{
qw=(winer* )malloc(sizeof(winer));
qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;
}
3.3.5 关卡设置:初始化箱子、目的地、墙壁、小人:通过for循环与printman,printbox,printwhiter1,printwall函数的调用进行初始化:(其他三关同理)
/* 第一关的图象初始化 */
winer *inithouse1()
5
{
int x,y;
winer *win=NULL,*pw;
gotoxy(8,2);
printf("Level No.1");/*在指定地点显示关卡*/
for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/ printwall(x+4,y+10);
for(y=5,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=9,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=1,x=3;x<=8;x++)
printwall(x+4,y+10);
for(x=3,y=3;x<=5;x++)
printwall(x+4,y+10);
for(x=5,y=8;x<=9;x++)
printwall(x+4,y+10);
for(x=7,y=4;x<=9;x++)
printwall(x+4,y+10);
for(x=9,y=5;y<=7;y++)
printwall(x+4,y+10);
for(x=8,y=2;y<=3;y++)
printwall(x+4,y+10);
printwall(5+4,4+10);
printwall(5+4,7+10);
printwall(3+4,2+10);
printbox(3+4,6+10); /*在特定的坐标点画箱子,并写下'b'*/
printbox(3+4,7+10);
printbox(4+4,7+10);
printwhither1(4+4,2+10,&win,&pw); /* 在特定的坐标上画目的地,写下'm'并用数组记录状态 */
printwhither1(5+4,2+10,&win,&pw);
printwhither1(6+4,2+10,&win,&pw);
printman(2+4,8+10); /* 在特定的坐标上画人*/
return win;
}
3.3.6 箱子的下一个位置的情况:在特定的坐标上画箱子的目的地上并用数组记录状态函数。
(1)下一个位置是目的地,空地:当下一个位置为目的地时写下‘i’,当下一个位置为空地时写下‘b’,
并擦去原位置的状态(将原位置ghouse数字==0)
/* 移动在空地上的箱子到空地上 */
movebox(int x,int y,char a)
6
{switch(a)
{
case 'u':ghouse[x-1][y]=0;printf(" ");
printbox(x-2,y);printman(x-1,y);
ghouse[x-2][y]='b';break;
case 'd':ghouse[x+1][y]=0;printf(" ");
printbox(x+2,y);printman(x+1,y);
ghouse[x+2][y]='b';break;
case 'l':ghouse[x][y-1]=0;printf(" ");
printbox(x,y-2);printman(x,y-1);
ghouse[x][y-2]='b';break;
case 'r':ghouse[x][y+1]=0;printf(" ");
printbox(x,y+2);printman(x,y+1);
ghouse[x][y+2]='b';break;
default: break;
}
}
(2)下一个位置是箱子:如果上面是箱子则有b标记,两个b相撞则不能移动
(3)下一个位置是箱子或墙壁:b与b,b与w相碰则不能移动
case 'u':if(!judge(x-1,y)) {gotoxy(y,x);break;} /*(1)人的上面是墙*/ else if(judge(x-1,y)==1||judge(x-1,y)==3) /*(2) 人的上面是空地或是目的地*/ {if(judge(x,y)==3) /*人的上面是目的地*/
{ printwhither(x,y);printman(x-1,y);break;}
else
{printf(" ");printman(x-1,y);break;} /*人的上面是空地*/
}
else if(judge(x-1,y)==2) /*人的上面是箱子*/
{ if(judge(x-2,y)==1) /*箱子上面是空地*/
{movebox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else if(judge(x-2,y)==3) /*箱子上面是目的地*/
{ moveboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else gotoxy(y,x);
break;
}
else if(judge(x-1,y)==4) /*人的上面是箱子在目的地*/
{ if(judge(x-2,y)==1) /*箱子上面是空地*/
{moveinbox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
}
else if(judge(x-2,y)==3) /*箱子上面是目的地*/
{ moveinboxin(x,y,'u');
7
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
}
else gotoxy(y,x); /*else 情况则包括箱子的下一个状态是箱子或箱子的下一个状态是障碍物(箱子或墙壁)*/
break;
}
3.3.7 按下空格键后,回到本关开头的函数。
(1)当按下空格键时返回一个i的值。
(2)调用初始化函数,初始化数组和屏幕。
(3)调用关卡函数如inithouse()进行重新开始。
/* 按下空格键后,回到本关开头的函数 */
void reset(int i)
{switch(i)
{
case 0: init();
inithouse1();break;
case 1: init();
inithouse2();break;
case 2: init();
inithouse3();break;
case 3: init();
inithouse4();break;
default:break;
}
}
3.3.8 主函数设计:
(1)首先定义了一些变量和指针,然后初始化数组、屏幕和第一关
main()
{int key,x,y,s,i=0;
winer *win,*pw;
_AL=3;_AH=0;
geninterrupt(0x10);
init(); /* 初始化函数,初始化数组和屏幕 */
win=inithouse1(); /*设置第一关 win指针接收inithouse1返回的图像*/
(2)设计一个大的do,while循环条件:重点:是本游戏的主要部分
do{
_AH=3;
geninterrupt(0x10);
x=_DH+1;y=_DL+1;
while(bioskey(1)==0);
key=bioskey(0); /*bioskey 从键盘上返回数值*/
switch(key)
{
8
case 0x4800:move(x,y,'u');break; /* 按下向上键后 */
case 0x5000:move(x,y,'d');break; /* 按下向下键后 */
case 0x4b00:move(x,y,'l');break; /* 按下向左键后 */
case 0x4d00:move(x,y,'r');break; /* 按下向右键后 */
case 0x3920:reset(i);break; /* 按下空格键后 */
default:break;
}
s=0; /**switch 每执行一次就触发一次判断**/
pw=win;
while(pw)
{
if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地) 能和i(箱子在目的地)进行转换*/
pw=pw->p;
}
if(s==0) /* 过关 */
{
free(win);
gotoxy(25,2);
printf("Congratulate! You have passed Level %d!",i+1);
getch();
i++;
switch(i) /*调出关卡*/
{
case 1: init();
win=inithouse2();break;
case 2: init();
win=inithouse3();break;
case 3: init();
win=inithouse4();break;
case 4: gotoxy(8,14);
printf("Great! You have passed all the levels! Press any key to quit!");
key=0x011b;getch();break;
default: break;
}
}
}while(key!=0x011b);
_AL=3;
_AH=0;
geninterrupt(0x10);
}
(3)do循环首先设计了一个while死循环,接收键盘信息,在进行switch循环将得到的键盘码进行操作(输入的键盘码在case语句中时)
while(bioskey(1)==0);
key=bioskey(0); /*bioskey 从键盘上返回数值*/
9
switch(key)
{
case 0x4800:move(x,y,'u');break; /* 按下向上键后 */
case 0x5000:move(x,y,'d');break; /* 按下向下键后 */
case 0x4b00:move(x,y,'l');break; /* 按下向左键后 */
case 0x4d00:move(x,y,'r');break; /* 按下向右键后 */
case 0x3920:reset(i);break; /* 按下空格键后 */
default:break;
}
(4)接下来又有一个while循环,作用:触发判断和判断是否过关。
原理:目的地只有两个时刻:‘m’,‘i‘
当有‘m‘时进行s++,当没有m时,从而执行if(s==0)语句进行判断过关 过关之后进行i++,执行switch语句选关或执行语句
s=0; /**switch 每执行一次就触发一次判断**/
pw=win;
while(pw)
{
if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地) 能和i(箱子在目的地)进行转换*/
pw=pw->p;
}
if(s==0) /* 过关 */
{
free(win);
gotoxy(25,2);
printf("Congratulate! You have passed Level %d!",i+1);
getch();
i++;
switch(i) /*调出关卡*/
{
case 1: init();
win=inithouse2();break;
case 2: init();
win=inithouse3();break;
case 3: init();
win=inithouse4();break;
case 4: gotoxy(8,14);
printf("Great! You have passed all the levels! Press any key to quit!");
key=0x011b;getch();break;
default: break;
}
}
3.3.9链表的作用:在特定的坐标上画目的地并用数组记录状态的函数。 /* 在特定的坐标上画目的地并用数组记录状态的函数 */
10
winer *qw;
putchxy(y-1,x-1,'*',YELLOW,BLACK);
ghouse[x][y]='m';
if(*win==NULL) /*刚输入时*win==null,if语句执行,将第一个目的地存入第一节点*/ {
*win=*pw=qw=(winer* )malloc(sizeof(winer));
(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* -> 结构体成员符*/
}
else /*存入信息后执行else语句,将链表进行连接*/
{
qw=(winer* )malloc(sizeof(winer));
qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;
}
}
3.3.10 judge判断特定坐标上的状态,根据ghouse得到的状态返回特定的值。
/*记录3坐标点,从而在ghouse中进行访问,switch中才会返回出w、b、i、m相对应的值*/
/* 判断特定的坐标上的状态 */
int judge(int x,int y)
{int i;
switch(ghouse[x][y])
{
case 0: i=1;break;
case 'w': i=0;break;
case 'b': i=2;break;
case 'i': i=4;break;
case 'm': i=3;break;
default: break;
}
return i;
}
3.3.11 如何触发判断与如何判断过关
(1)如何触发判断,只要有移动就触发
有M变为I时:如
s=0;
pw=win;
while(pw)
{
if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地) 能和i(箱子在目的地)进行转换*/
11
pw=pw->p;
}
解析:通过链表对其处理,当有'm'时,s++,从而知道有多少个‘m’
(2)判断过关:当所有M变为I时,即S==0过关
s=0;
pw=win;
while(pw)
{
if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地) 能和i(箱子在目的地)进行转换*/
pw=pw->p;
}
if(s==0) /* 过关条件 */
{
free(win);
gotoxy(25,2);
printf("Congratulate! You have passed Level %d!",i+1);
getch();
3.3.12 如何与键盘结合:通过while,bioskey,switch的结合接收键盘信息和对操作的处理:
while(bioskey(1)==0);
key=bioskey(0); /*bioskey 从键盘上返回数值*/
switch(key)
{
case 0x4800:move(x,y,'u');break; /* 按下向上键后 */
case 0x5000:move(x,y,'d');break; /* 按下向下键后 */
case 0x4b00:move(x,y,'l');break; /* 按下向左键后 */
case 0x4d00:move(x,y,'r');break; /* 按下向右键后 */
case 0x3920:reset(i);break; /* 按下空格键后 */
default:break;
4 实训遇到的问题及其分析和解决
4.1
4.2
12
5 实训总结
通过这次实习,在程序编写设计方面感觉自己有一定的收获。实训只要是为了我们今后的工作及业务能力的提高起到了促进作用,增强了我们今后的竞争力,为我们能在以后立足增添了一块基石。这次学习丰富了我在这方面的知识,使我们在将来从事设计更好的去面对这些问题。使我向更深的层析迈进,但我也认识到,要想做好这方面的工作单靠这些天的实训室不行的,还需要我在平时的学习工作中一点一点的积累,不断丰富自己的经验才行。我面前的路还很漫长的,需要不断地努力和奋斗才能真正地走好。我坚信通过这一段时间的实训,所获得的实践经验对我终身受益,为实现自我的理想和光明的前程增加了更多信心。
在这次的实训中也存在一些问题,对于许多知识的掌握不够,运用也不熟练许多知识没能很好地掌握运用,在今后的学习中要加强实际操作做到理论与实践相结合。
13