推箱子 论文.docx
《推箱子 论文.docx》由会员分享,可在线阅读,更多相关《推箱子 论文.docx(23页珍藏版)》请在冰豆网上搜索。
推箱子论文
山东交通学院
C语言课程设计
推箱子游戏
院(系)别信息工程系
班级信息093
学号090810311
姓名赵兵兵
指导教师张劲松
时间2010-4-6—2010-4-1
课程设计任务书
题目推箱子游戏
系(部)信息工程系
专业计算机科学与技术
班级信息093
学生姓名xxx
学号090810311
4月6日至4月10日共1周
指导教师(签字)
系主任(签字)
2010年4月12日
一、设计内容及要求
【规则】本游戏的目的就是把所有的箱子都推到目标位置上。
箱子只能推动而不能拉动。
一次只能推动一个箱子。
二、设计原始资料
经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。
在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道!
三、设计完成后提交的文件和图表
1.计算说明书部分
程序设计分析
总体来说,这次推箱子游戏软件遵循的依旧是从上到下,逐步细化的编程思想。
我也是在设想好大体轮廓后,从最基础的功能开始,不断地调试、补充、检查直到最后达到预定目的。
这样的设计不仅仅可以使自己不至于太过急躁,而且还可以使自己的思路清晰,便于对程序整体性把握,使自己对编程过程的每一步都很清晰明了。
给自己的修改与添加留有了足够的扩展空间,这样的设计可以使编程者不至于在反复重读程序上浪费太多时间,而且每一步都有具体而明确的目标。
我想这对我以后的编程工作会有很大的影响,而这也正是我认为本次课程设计最大的收获。
2.图纸部分:
程序流程图
是
否
是
否
是
否
是
否
四、进程安排
第一天:
初步分析程序,并对程序需要用到的函数及工具进行分析;
第二天:
分析程序各个模块及功能并编出大体轮廓;
第三天:
初步完善程序功能及模块,分析各种情况;
第四天:
进一步分析完善程序、补充功能,修复漏洞;
第五天:
最后检查程序,准备答辩。
五、主要参考资料
1.《C程序设计(第三版)》,谭浩强编,清华大学出版社
2.《TurboC2.0实用大全》,常玉龙等编写,北京航空航天大学出版社
3.《C游戏编程从入门到精通》,浦滨著,北京希望电子出版社
4.《C函数实用手册》,张曜郭立山吴天著,冶金工业出版社
成绩评定表
口试(答辩)成绩
报告成绩
总评成绩
摘要
ちょうど1週間では、訓練学校の学生の手-能力に、我々はC言語のカリキュラムデザインを開催します。
教師と生徒の助けを借り、私は最終的にゲーム倉庫番を終えた。
カリキュラムは、私たちだけに、プログラミングの経験を持っていないが、我々は協力の重要性を理解する。
お気軽に学期が本当にで継続的な改善の上昇を行い、試運転徐々に私のプログラムを改善します。
自分のプログラミングに同じ時間も深い洞察力で、常に改善され、魂を作成します。
わずか1週間だけ、実際に私たちのプラットフォームを自分たちの知識を適用する指定されたが。
そして、我々の最愛のプログラムの熱意に影響を与えた。
私は以上の教科書はいくつかのプログラミングの知識とスキルをお持ち得ているこの1週間で展開します。
私は勉強したいこれはバーの定数の拡大で完了するはずです。
关键字:
カリキュラムデザイン、C言語、ゲーム倉庫番
目录
前言9
1推箱子游戏软件预览10
1.1推箱子游戏软件发展之路10
1.2程序结构流程图10
1.3程序总体模块分析11
2推箱子游戏软件函数分析11
2.1程序中的函数组成及其功能11
2.2各函数实现原理11
3程序各界面截图及说明12
3.1开始界面12
3.2a、b或c对应界面及计时和限时功能12
3.3选d后进入界面14
4程序相关源代码及相应注释14
4.1输出函数14
4.2移动函数(仅以向左代表)16
4.2.1当输入d时16
4.2.2向左移动16
4.3设置背景函数18
4.4主函数20
致 谢22
参考文献23
前言
随着科技的不断发展,世界对计算机的依赖逐渐加深。
而编程作为指导计算机工作的的一门学科也正在逐步被发展完善。
作为信息技术的重要部分,编程无疑是学习计算机科学路途中的的重要组成部分。
而作为一个编程初学者,说实在话这是编程生涯的第一次课程设计,因此难免会有许多不尽如人意的地方,希望各位读者能够以宽阔的胸怀给予谅解。
在课程设计之初选课题时,我和我的组友为了给自己一个挑战而选择了推箱子游戏软件开发。
本来按我们的能力编一个游戏软件其实是有一定难度的,但最终我们通过自己一个星期的努力,终于将它调试通过并初步完善,心中真的很高心。
因为我们学习是调试环境多是在VC6.0下,所以我们放弃了WinTC下的编程,这其实也为我们下一步的C++课程的学习做好铺垫。
要说程序中有令自己遗憾的地方那就应该说没能用到图形驱动函数,在此希望读者能够谅解。
在此谨向那些在我编程过程中为我提供帮助的老师和同学表示真挚的感谢和敬意。
1推箱子游戏软件预览
推箱子游戏软件发展之路
在刚接到这个程序时我的要求还仅仅只是要求能够推着箱子到达目的地,其他功能还没敢考虑。
可现在重新回顾才发现原来随着不断地调试与补充,最终使程序向丰满和功能完善发展。
由刚开始的移动问题到后来的推箱子问题再到后来到目的地后变化,进而达到限时和获胜提示。
这之间有太多的努力与学习,直到答辩完成才发现原来在无形之间自己已经获得了太多太多。
我想这也正是一个正常编程员的成长史。
所以在本文之初想用这几段文字与大家一块分享自己的成功喜悦及经验,希望能对大家能有一定帮助……
程序结构流程图
程序总体模块分析
本程序总体大致可分为三大模块,即读入、判断调整、输出。
(1)读入:
即设置读入操作把使用者的输入操作符读入程序,并定义变量储存起来为下一步的判断做好准备;
(2)判断调整:
这一操作为下一步的调整二维数组内容提供依据,通过大量的判断语句对所有可能出现的情况提供相对应的唯一操作,使用户能顺利使用软件并起到规范化输入的目的——当输入不明字符时不作处理。
判断结束后,执行相应操作改变数组内容从而改变输出内容,使用户顺利进行下一步操作。
(3)输出:
通过刷屏后重新输出从而使背景得以改变,进而等待用户下一步的输入操作。
2推箱子游戏软件函数分析
程序中的函数组成及其功能
(1)输出函数(show函数):
输出转义背景;
(2)移动函数(move):
改变二维数组内部数据并判断结束与否;
(3)设置背景函数(map):
设置游戏场景提供基础游戏数据;
(4)其他系统函数:
略。
各函数实现原理
(1)移动函数:
移动函数又可分为上、下、左、右四种移动方式。
在移动的时候还会遇到许多情况,如遇到墙不能移动、不能同时推动两个箱子、进入目的地后需要改变图标、离开目的地后要还原图标等问题。
在可操作情况下设置相应操作,在不可操作情况下设置空执行从而不进行任何操作(也起到规范化输入作用)。
(2)输出函数:
通过for语句套用从而达到输出二维数组的效果,另外通过if语句判断转义进而实现输出更加人性化的背景,从而达到更高的可用性。
(3)设置背景函数:
通过二维数组初始化对游戏背景进行设置,并在其内部设计移动函数调用从而达到每一关都是一个独立的个体,可以单独实现计时、限时、刷屏等功能,另外还可以输出相应的提示界面。
从而为下一步添加场景提供了宽阔的空间。
(4)计时、限时、刷屏和调色函数:
提供了更加人性化的游戏界面,提高了使用者的游戏兴趣。
使dos界面不再仅是黑白的、毫无生气的操作窗口。
3程序各界面截图及说明
开始界面
通过按abcd四个键来选择是进入特定游戏还是退出。
a、b或c对应界面及计时和限时功能
第一层游戏界面,按方向键移动游戏结束,下部有提示单个共用时数,
星号(代人)去推箱子;提高游戏乐趣。
同时有提示限制时间30秒。
第二层游戏界面,按方向键移动游戏结束,下部有提示单个共用时
星号(代人)去推箱子;数,提高游戏乐趣。
同时有提示限制时间30秒。
第三层游戏界面,按方向键移动游戏结束,下部有提示单个共用时
星号(代人)去推箱子;数,提高游戏乐趣。
同时有提示限制时间30秒。
提示游戏已超时按回车键回到主界面重新选择游戏。
选d后进入界面
回到主界面后继续按d,结束总游戏并计算游戏过程
总共用时。
4程序相关源代码及相应注释
输出函数
voidshow(charb[9][9])
{
printf("\t\t\t\t***************************\n");
printf("\t\t\t\t推箱子游戏");
printf("\n\t\t\t\t***************************\n");
printf("\t\t\t\t人:
★墙:
■\n\t\t\t\t箱子:
◎目的地:
□\n\t\t\t\t按d键退出游戏\n\t\t\t\t限时30秒!
");
printf("\n\t\t\t\t***************************\n");
for(inti=0;i<9;i++)//使用循环将地图转换输出
{
printf("\t\t\t\t");
for(intk=0;k<9;k++)
{
if(b[i][k]=='#')
{
printf("■");
}
else
{
if(b[i][k]==3)
{
printf("□");
}
else
{
if(b[i][k]==5)
{
printf("◎");
}
else
{
if(b[i][k]==1)
{
printf("★");
}
else
{
if(b[i][k]=='!
')
{
printf("⊙");
}
else
{
printf("%c",b[i][k]);
}
}
}
}
}
}
printf("\n");
}
printf("\t\t\t\t***************************\n");
}
移动函数(仅以向左代表)
当输入d时
voidmove(charc[9][9],int*x,int*y,intX,intY,intA,intB,intN,intM,char*t)
{
*t=getch();
if(*t=='d')//遇到d返回
{
}
向左移动
if(*t==75)
{
if(c[*x][*y-1]=='#'||c[*x][*y-1]==5&&c[*x][*y-2]==5||c[*x][*y-1]==5&&
c[*x][*y-2]=='!
')//遇到墙或推两个箱子
{
}
else
{
if(c[*x][*y-1]=='!
')//把箱子推出目的地
{
if(c[*x][*y-2]!
=0)
{
}
else
{
c[*x][*y]=0;
*y-=1;
c[*x][*y]=1;
c[*x][*y-1]=5;
}
}
else
{
if(c[*x][*y-1]==5&&c[*x][*y-2]!
='#')//推箱子
{
if(c[*x][*y]==c[X][Y]||c[*x][*y]==c[A][B]
||c[*x][*y]==c[N][M])//推着箱子离开目的地
{
c[*x][*y]=3;
*y-=1;
c[*x][*y]=1;
c[*x][*y-1]=5;
}
else
{
c[*x][*y]=0;
*y-=1;
c[*x][*y]=1;
c[*x][*y-1]=5;
}
}
else
{
if(c[*x][*y-1]==5&&c[*x][*y-2]=='#')//推不动箱子
{
}
else
{
if(c[*x][*y-1]==c[X][Y]||c[*x][*y-1]==c[A][B]
||c[*x][*y-1]==c[N][M)//进到目的地
{
c[*x][*y]=0;
*y-=1;
c[*x][*y]=1;
}
else
{
if(c[*x][*y]==c[X][Y]||c[*x][*y]==c[A][B]
||c[*x][*y]==c[N][M])//离开目的地
{
c[*x][*y]=3;
*y-=1;
c[*x][*y]=1;
}
else//走到空地
{
c[*x][*y]=0;
*y-=1;
c[*x][*y]=1;
}
}
}
}
}
}
if(c[X][Y]==5||c[A][B]==5||c[N][M]==5)//箱子推到目的地
{
c[*x][*y-1]='!
';
}
}
设置背景函数
voidmap1()
{
time_tp,q,o;
time(&p);
inti=4,j=4,m=6,n=2,t=1,k=3;
system("cls");//刷屏
system("color1E");
intx=1,y=7;
charz,a[9][9]=
{/*为背景设置初始资料*/
{'#','#','#','#','#','#','#','#','#'},
{'#','#','#',3,0,0,0,1,'#'},
{'#','#',0,0,0,'#',0,'#','#'},
{'#',0,0,'#',0,0,0,0,'#'},
{'#',0,5,0,3,5,5,0,'#'},
{'#','#','#','#',0,0,'#','#','#'},
{'#','#',3,0,0,0,'#','#','#'},
{'#','#','#','#','#','#','#','#','#'},
{'#','#','#','#','#','#','#','#','#'}
};
show(a);//调用输出函数
loop:
move(a,&x,&y,i,j,m,n,t,k,&z);
if(a[i][j]=='!
'&&a[m][n]=='!
'&&a[t][k]=='!
')
{
system("cls");//刷屏
show(a);
printf("\t\t\t\tYOUAREWIN!
\n");
time(&q);
printf("\t\t\t\t\t用时%.3d秒\n",q-p);
printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t");
getch();
}
else
{
time(&o);
if(z=='d')
{
return;
}
if(o-p>30)
{
loop1:
system("cls");//刷屏
printf("\t\t\t\t时间已过请重新回车选关!
");
intg=getch();
if(g==13)//判断是否为回车符
{
return;
}
else
{
gotoloop1;
}
}
system("cls");//刷屏
show(a);//调用输出函数
gotoloop;
}
}
主函数
voidmain(intargc,char*argv[])
{
time_ta,b;
time(&a);
system("color4E");
loop1:
{
system("cls");//刷屏
printf("\n\n\n\n\n\n\t\t\t\t欢迎进入推箱子游戏\n\n\t\t\t\t请按abc选择游戏\n\n\t\t\t\t按d键结束");
intt=getch();
if(t=='d')
{
printf("\n\t\t\t");
}
else
{
if(t=='a')
{
map1();
gotoloop1;
}
if(t=='b')
{
map2();
gotoloop1;
}
if(t=='c')
{
map3();
gotoloop1;
}
else
{
printf("\n\n\t\t\t\t请重新输入:
");
gotoloop1;
}
}
}
time(&b);
printf("\n\n\n\n\t\t\t\t游戏总共用时%.3d秒\n\t\t\t",b-a);
getch();//等待读取回车符以结束程序
}
致谢
在此报告结尾之际,谨感谢张老师及各位同学的帮助,让我能够在实践中学到书本上没有的知识。
也感谢学校提供给我们这次宝贵的实践机会,让我们可以在实践中寻找经验与能力。
怀念与老师和同学在一起的每一刻,期待下一次的合作早日到来!
参考文献
1.《C程序设计(第三版)》,谭浩强编,清华大学出版社
2.《TurboC2.0实用大全》,常玉龙等编写,北京航空航天大学出版社
3.《C游戏编程从入门到精通》,浦滨著,北京希望电子出版社
4.《C函数实用手册》,张曜郭立山吴天著,冶金工业出版社