C语言课程设计推箱子.docx
《C语言课程设计推箱子.docx》由会员分享,可在线阅读,更多相关《C语言课程设计推箱子.docx(41页珍藏版)》请在冰豆网上搜索。
C语言课程设计推箱子
山东交通学院
C语言课程设计
推箱子游戏
院(系)别信息工程系
班级信息093
学号*********
姓名陈新龙
指导教师******
时间2010-04-06—2010-04-10
课程设计任务书
题目推箱子
系(部)信息工程系
专业计算机科学与技术
班级信息093班
学生姓名陈新龙
学号*********
04月06日至04月10日共1周
指导教师(签字)
系主任(签字)
2010年04月11日
一、设计内容及要求:
(1)箱子只能推动而不能拉动。
一次只能推动一个箱子。
(2)在一个狭小的仓库中,要求把木箱放到指定的位置,
稍不小心就会出现箱子无法移动或者通道被堵住的情况。
(3)本游戏的目的就是把所有的箱子都推到目标位置上。
(4)此游戏目的是在训练你的逻辑思考能力。
二、设计原始资料:
本游戏的目的就是把所有的箱子都推到目标位置上。
箱子只能推动而不能拉动。
一次只能推动一个箱子。
经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。
在一个狭小的仓库中,要求把木箱放到指定的位置,
稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道~!
三、设计完成后提交的文件和图表
1.计算说明书部分
假设数字0代表空地,数字1代表墙壁,数字2代表非游戏的填充内容(非必须内容),可是地图看起来规则,数字3代表目的地,数字4代表箱子,数字6代表人。
那么人移动到空地上时数字值的变化为:
6+0=6;
人移到目的地时其位置的数值变化为:
6+3=9;
箱子移动到空地时数值的变化为:
4+0=4;
箱子移动到目的地时数值的变化为:
4+3=7;
再就是每一次的移动都必须根据实际情况,来改动原位置和移动位置的数值,还原出地图原样模型。
2.图纸部分:
程序流程图
否
否
是是
是是
否否
否
否
是是
是
否
四、进程安排
第一天:
分析问题,找出大体的设计思路。
第二天:
构造出程序大体框架,即各种功能模块的组合。
第三天:
分别写出个功能模块程序的源代码。
第四天:
讲个功能模块加入主程序中,并实现所有的程序基本功能。
第五天:
优化程序中的不足之处,优化显示界面,添加辅助功能模块增加程序的趣味性。
使程序软件更加适宜用户的操作和娱乐需要。
第六天:
准备程序答辩。
五、主要参考资料
[1]谭浩强,C程序设计(第三版)。
北京:
清华大学出版社,2005(2007重印)
[2]马安鹏.VisualC++程序设计导学。
北京:
清华大学出版社,2002
[3]H.M.Deitel,P.J.Deitel.SmallC++HowtoProgram.2006.
[4]RichardC.Leinecker,TomArcher.VisualC++6宝典.张艳,张谦译.北京:
电子工业出版社,1999
[5]BeckZaratian.MicrosoftVisualVisualC++6.0程序员指南.希望图书创作室译.北京:
北京希望电脑公司出品,1998
成绩评定表
口试(答辩)成绩
报告成绩
总评成绩
摘要
私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に1週間手配して、私達にVisualC++の課程の設計の実習を行わせます.
このファイルの詳しい説明はVisualC++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは箱を押して遊戯することです。
つきましてはこのソフトウェアの機能は、ユーザーは字の符を輸入する。
字の符“a”は向左走を代表して、字の符“s”は代表して下で歩いて、字の符“d”は向右走を代表して、字の符“w”は向上して行くことを代表して、人を制御することは箱を行き先を押すことができてすぐ勝利した。
ソフトウェアの目的は人を鍛錬する能力を思惟することです。
以下は課程仕様を通過して、順序ソフトウェアからの説明が提示することを操作して、手順は説明することを調節して、総括した方面を開発して、この手順を詳説する製造した過程和作は用いる、諸般のが執行されることができる操縦。
关键字:
箱が遊戯を押す,VC++6.0,源手順
前言
随着计算机技术的发展,可视编程技术占有了越来越重要的作用。
VisualC++6.0是一种功能强大行之有效的可视化编程工具。
因此此软件是在VisualC++6.0环境下编写的。
对于我们,随着学习的深入,已经大体掌握了VisualC++6.0环境下的程序开发。
为了将我们的编程能力提升到一个更高的水平,深化面向对象的编程思维和解决问题的能力,值此课程设计周期间,进行基于VisualC++6.0环境的软件开发,先以推箱子游戏作为开始,对VisualC++6.0环境和C语言的模块编程设计进行回忆和熟悉,有利于促进面向对象程序设计思想的理解,使得在此基础上的下一个软件的开发进行的更加顺利。
本文档详细叙述了基于VisualC++6.0环境下的推箱子游戏软件的设计过程以及程序源代码。
本文档从概要设计,详细设计,参考源程序代码以及显示程序运行的截屏等方面详尽的介绍了软件开发过程。
此次推箱子游戏软件的开发目的是使我们用最基础的C语言程序设计的方式来思考和解决问题的能力,并且可以掌握二维数组的使用、循环控制的使用、地图的设计和使用以及C语言语法。
本文档的安排如下:
第一章主要介绍了对面向对象C++语言以及VisualC++6.0编程环境。
第二章主要的介绍说明了推箱子游戏软件的编程思想和详细设计。
第三章主要对推箱子游戏软件进行调试,运行程序并截图,显示运行界面和结果。
第四章主要介绍了软件开发过程中遇到的一些问题,对该软件进行的一个总结。
程序在设计的过程中遇到的问题已及时更正,但由于编者的能力和水平有限,推箱子游戏软件和文档中不免会出现一些不期待的错误,望文档读者能够理解和体谅,并欢迎提醒和纠正,在此表示感谢以及敬意。
1课程设计概述
推箱子游戏软件功能概述
在一个狭小的仓库中,把木箱放到指定的位置,通过控制人的走向来推箱子移动,箱子只能推动不能拉动,一次只能推动一个箱子。
稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道。
通过此游戏可以锻炼一个人的逻辑思维能力。
VisualC++6.0概述
VisualC++是微软公司的重要产品之一,是一种功能强大行之有效的可视化编程工具。
它提供了MFC类库,使用户可以方便的开发自己想实现的功能。
VisualC++6.0的主要特点:
(1)自动化和宏功能。
(2)可以灵活地定制工具栏和菜单。
(3)可以直接运行和调试程序,还可以使用宏语言来自动操作调试器。
(4)支持Internet连接。
(5)一个新的便捷的项目系统可以允许一个工作区内包含多个不同的项目类型。
(6)在工作区内可以包含多个并列的工程文件。
(7)可以在对话框中使用WizardBar将程序同可视化元素联系起来。
(8)FindinFile命令支持两个独立的输出窗格,可以保存上一次搜索的结果。
这些新特性可以更好地利用VisualC++开发工具进行Windows应用程序开发。
1推箱子游戏软件总体设计
推箱子游戏软件总体设计思想
推箱子游戏软件的功能是锻炼人的逻辑思维能力。
推箱子游戏软件的功能模块有:
(1)提供菜单界面,方便用户对程序个功能进行选择,选择要实现的功能按相应的键进入该功能。
(2)地图的生成,用二维整型数组来构成地图,其中数字代表特殊的符号。
(3)移动,人或人和箱的移动,接受用户输入的一个字符,控制人的走向,并且可以在允许的情况下推动箱子。
(4)时间的统计,可以看整个程序(相当于游戏)运行时所用的时间。
(5)清屏功能,使用了清屏函数,当在游戏中时可以直接返回主菜单,
(6)利用了辅助色彩函数,使游戏界面更加好看,美观。
在源程序中声明并定义了voiddraw_map(intmap[10][12])//地图函数,voidmove(intmap[10][12])//移动函数
使用了:
#include//标准输入输出头文件
#include//system函数的头文件
#include//getch函数的头文件
#include"time.h"//调用时间函数的头文件
多种头文件。
程序中还应用了全局变量:
charle;//控制关数的全局变量
charinput;//接收按键字符
程序分为多个小模块,通过调用实现各种功能,增强了程序的可建设性。
总体设计流程图
图2-1-2 总体设计流程
2推箱子游戏软件详细设计
两个主要问题
设计中的两个主要需解决的问题是:
怎样生成地图、怎样实现人或人和箱子的移动。
3.1.1地图的生成
设计中用二维整型数组中的数字元素表示不同的物体,比如0代表空地,1代表墙,2代表非游戏的填充内容(非必须内容),可以使地图规则,3代表目的地,4代表箱子,6代表人。
然后用一个switch语句给每个数字赋予不同的符号,在输出二维数组,生成地图。
3.1.2人或人和箱子的移动
设计中要想使人移动,首先要找到人的起始位置,然后才能开始移动。
人向四个方向移动的原理是相同的,我们可以先研究一个方向的移动,找到人的位置后,以人向上走为例,因为向上走嘛(可以通过数组下标表示)。
(1)要判断人前面(上一行),是否为空地,是空地则可以移动,移动后判断并改变人员原位置的数值元素和空地原位置的数值元素;否则不移动。
(2)如果人前面是目的地,人也是可以移动的,同样判断人原位置数值元素,并改变人员位置的数值元素和前一位置的数值元素。
(3)如果人前是在空地上的箱子。
如果箱子前面又是空地,则可以移动,改变箱子前位置的数值元素,还是判断原位置的数值元素,然后改之;如果箱子前为目的地,和上面说的一样移动和改数值元素,只是多了计分这一步。
(4)如果人前是已经进入目的地的箱子。
如果箱子前又是空地,则可以移动箱子,但是要减分,改变空地位置的数值元素,判断人和箱子原地的数值元素,并改之;如果箱子前是另一目的地,方法同上,只是不减分。
用分数控制箱子是否已全在目的地。
(5)每一次的移动,必须要清屏,然后再显示一次地图,这样便可以实现人或人和箱子的移动。
3程序测试
菜单界面
图3-1-1 菜单界面
如上图3-1-1所示,该程序为用户提供菜单界面,用户可以对程序的各种功能进行选择,方便用户使用。
选择1、2、3、q并按键进行操作,来实现不同的功能。
友好的界面为用户提供优质的服务。
图3-1-2 菜单选择1时的界面
如上图3-1-2所示,该程序为用户提供说明,包括各种符号说明和游戏方法说明。
图3-1—3 菜单选择2时的界面
如上图3-1—3所示,该程序为用户提供说明,包括各种符号说明和游戏方法说明。
图3-2 菜单选择3时的界面
如上图3-2所示,该功能实现游戏的结束。
游戏中的界面
图3-3 在第一关中的游戏界面
如上图所示,通过按键的操作,该功能实现人的移动。
图3—4在第一关中的游戏界面
如上图3—4所示,通过按键的操作,该功能实现人推箱子的移动。
图3—5在第一关游戏结束的界面
如上图3—5所示,通过按键的操作,该功能实现人把箱子推到了目的地,并重新清屏输出界面。
结束后还会有提示,问是否玩下一关。
图3—6在第二关游戏中的界面
如上图3—6所示,通过按键的操作,该功能实现人把箱子推到了目的地,并重新清屏输出界面。
图3—7在游戏中按q键的界面
如上图3—7所示,通过按键的操作,无论是在刚开始游戏,还是在游戏了一段时间后,只要按q键,都会返回菜单界面。
由于第二关有点难,暂时没有通关,故我改了一下地图,来看一下通关的效果,只有在玩完第一关时,再玩第二关胜利时才会出现此画面。
如图3—8所示:
图3—8在游戏通关时的界面
如果刚开始接选择了第二关,并通关了会出现:
恭喜您直接通关了字样,如图3—9:
图3—9在游戏通关时的界面
4课程设计总结
为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期一周的VisualC++课程设计实习,并安排了指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。
在此次推箱子游戏程序开发过程中,有很多东西值得我们思考并总结。
开发过程大体可分为以下几个步骤:
(1)思考总体设计方案:
总体结构和模块外部设计,功能分配。
思考要实现整个程序大体需要的几个模块和其中用到的VisualC++语言基本操作符、语句等。
(2)画出总体设计方案流程图:
用流程图的形式展现你的基本编程思想。
(3)流程图具体化:
即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。
(4)编辑程序代码:
这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(5)代码的调试:
在VisualC++6.0环境下输入代码并进行调试和正确运行。
在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(6)最后修饰:
程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
通过这次课程设计,使我们更加熟悉的掌握了VisualC++语言的运用。
帮助我们熟悉了更多VisualC++语言的功能,提高了我们的动手能力,学到了许多解决实际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。
我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。
致 谢
最后,在这里郑重的感谢张老师的帮助,让我得到了许多意想不到的收获。
也感谢学校提供给我们这次宝贵的实践机会,让我们可以动手动脑,大大提高了个人的能力和素质。
参考文献
[1]马安鹏.VisualC++程序设计导学。
北京:
清华大学出版社,2002
[2]电子书籍.VisualC++技术内幕(第四版).网址:
[3]BeckZaratian.MicrosoftVisualVisualC++6.0程序员指南.希望图书创作室译.北京:
北京希望电脑公司出品,1998
[4]RichardC.Leinecker,TomArcher.VisualC++6宝典.张艳,张谦译.北京:
电子工业出版社,1999
[5]李强,贾云霞.VisualC++项目开发实践.北京:
中国铁道出版社,2004
[6]郑莉,董渊,张瑞丰.C++语言程序设计.2003.
[7]H.M.Deitel,P.J.Deitel.SmallC++HowtoProgram.2006.
[8]谭浩强,C程序设计(第三版)。
北京:
清华大学出版社,2005(2007重印)
5附录(程序源代码)
#include//标准输入输出头文件
#include//system函数的头文件
#include//getch函数的头文件
#include"time.h"//调用时间函数的头文件
inti,j;
charle;//控制关数的全局变量
charinput;//接收按键字符
/////////////////////////////////////////////////////////////////////////////////
intmain(intargc,char*argv[])//这是添加的计算时间的函数,不要也可以,没事试着玩,
{//注意:
这是main(),下面不能再出现main()了
time_tAtime,Btime;
time(&Atime);
//////////////////////////////主函数////////////////////////////////////////
//voidmain()(无用了)
{
voiddraw_map(intmap[10][12]);//声明画图函数(游戏地图)
voidmove(intmap[10][12]);//声明移动函数
/*下面定义一个二维数组(来组成地图),其中的元素是不同图像的ID号,在后面的函数中将讲解不同数字分别代表的图像元素:
0代表空地,1代表墙壁,2代表非游戏内容的空白框,3代表目的地,4代表箱子,6代表人*/
system("colorE5");//控制界面颜色,第一个字符是背景,第二个字符是字体
intmap2[10][12]={
{2,2,2,2,2,1,1,1,1,1,2,2},
{1,1,1,1,2,1,0,0,0,1,1,2},
{1,0,0,1,1,1,0,1,0,0,1,2},
{1,0,4,3,3,3,3,3,1,0,1,1},
{1,0,0,1,1,3,3,3,4,0,0,1},
{1,0,0,0,0,4,1,1,4,1,0,1},
{1,0,4,1,4,0,0,0,4,0,0,1},
{1,1,0,6,0,1,1,1,4,1,0,1},
{2,1,1,1,1,1,2,1,0,0,0,1},
{2,2,2,2,2,2,2,1,1,1,1,1}
};
intmap1[10][12]={
{1,1,1,1,1,1,1,1,1,1,2,2},
{1,0,0,0,0,0,0,0,0,1,2,2},
{1,0,0,4,0,0,0,0,1,1,2,2},
{1,1,1,1,1,1,0,0,1,1,2,2},
{1,0,0,0,0,0,0,0,0,1,2,2},
{1,1,0,0,0,0,0,0,0,1,2,2},
{1,0,6,1,1,1,1,1,1,1,2,2},
{1,0,0,0,0,0,0,3,0,1,1,1},
{1,1,1,1,0,0,0,0,0,1,2,1},
{2,2,2,2,1,1,1,1,1,2,2,2}
};
intmap[10][12];
loop:
//设置菜单标签
system("cls");
printf("\n\n\n\n\n\n\n\n\n\t\t\t欢迎玩*【推箱子游戏】*\n\t\t\t请选则关数【总
共两关】:
<1或2>\n\t\t\t\t按'3'不进入游戏");
printf("\n\t\t\t要回到主菜单时按'q'键");
le=getch();//用getch()函数无需回车确认地获取用户输入,用于选关。
if(le=='1')//选择生成地图1
for(i=0;i<10;i++)
for(j=0;j<12;j++)
map[i][j]=map1[i][j];
if(le=='2')//选择生成地图2
for(i=0;i<10;i++)
for(j=0;j<12;j++)
map[i][j]=map2[i][j];
if(le=='3')//不进入游戏界面
printf("\n\n\n\n\t\t\t无此关卡,游戏结束\n");
else
{
move(map);//调用移动函数
if(input=='q')//判断按键
{
gotoloop;//回主菜单选项
}
printf("\n\t\t\tO(∩_∩)O哈哈~恭喜你,过关了!
!
\n");//过关提示
if(le=='2')//直接选第二关时的结果
printf("\n\t\t\t你好聪明哦\n\t\t\t(*^__^*)嘻嘻……恭喜你,直接通关了!
!
\n");//通关提示
if(le=='1')//在第一关的情况下在玩第二关,如刚开始就玩第二关,则不执行此语句
{
printf("\n是否继续玩下一关(y/n)?
:
");
if(getch()=='y')
{
for(i=0;i<10;i++)
for(j=0;j<12;j++)
map[i][j]=map2[i][j];
le='2';//用于判断记分结果属于哪一关,以便结束
system("color47");//控制界面颜色
move(map);//调用移动函数
if(input=='q')//判断按键
{
gotoloop;//回主菜单选项
}
printf("\n\t\t\t你好聪明哦\n\n\t\t\t(*^__^*)嘻嘻……恭喜你,通关了!
!
\n");//过关提示
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////time(&Btime);
printf("Theprogramrun%ds\n",Btime-Atime);//计算时间
return0;
}
//////////////////////////////////地图函数//////////////////////////////////
voiddraw_map(intmap[10][12])//定义地图函数
{
for(i=0;i<10;i++)
{
printf("\t\t\t");//将画面定格在中间位置
for(j=0;j<12;j++)
{
switch(map[i][j])
{
case0:
printf("□");//数字0代表道路
break;
case1:
printf("●");//数字1代表墙壁
break;
case2:
printf("○");//数字2是游戏边框的空白部分
break;
case3:
printf("×");//数字3代表目的地
break;
case4:
printf("♀");//数字4代表箱子