推箱子游戏
院(系)别信息科学与电气工程学院班学姓级电气115号1108152528名董雪指导教师王成时间2012-09-3—2012-09-7课程设计任务书题目推箱子
信息科学与电气工程学院电气工程及其自动化电气115班董雪110812528系(部)专班
业级
学生姓名学
号
09月03日至09月07日共1周
指导教师(签字)系主任(签字)
年
一、设计内容及要求:
月日
(1)箱子只能推动而不能拉动。一次只能推动一个箱子。(2)在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况。(3)本游戏的目的就是把所有的箱子都推到目标位置上。(4)此游戏目的是在训练你的逻辑思考能力。
二、设计原始资料:
本游戏的目的就是把所有的箱子都推到目标位置上。箱子只能推动而不能拉动。一次只能推动一个箱子。
经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道!
三、设计完成后提交的文件
1.计算说明书部分
假设数字0代表墙壁,数字1代表路,数字2代表空位,可使地图看起来规则,数字3代表箱子,数字4代表人。
那么人移动到路上时数字值的变化为:4;人移到空位上时其位置的数值变化为:4+2=6;箱子移动到路上时数值的变化为:3;箱子移动到空位上时数值的变化为:3+2=5;
再就是每一次的移动都必须根据实际情况,来改动原位置和移动位置的数值,还原出地图原样模型。
四、进程安排
第一天:分析问题,找出大体的设计思路。
第二天:构造出程序大体框架,即各种功能模块的组合。第三天:分别写出个功能模块程序的源代码。
第四天:讲个功能模块加入主程序中,并实现所有的程序基本功能。
第五天:优化程序中的不足之处,优化显示界面,添加辅助功能模块增加程序
的趣味性。使程序软件更加适宜用户的操作和娱乐需要,准备程序答辩。
五、主要参考资料
[1]谭浩强,C程序设计(第三版)。北京:清华大学出版社,2005(2011重印)[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
言..................................................................................................错误!未定义书签。课程设计概述................................................................................................................91.1
推箱子游戏软件功能概述...............................................................................9
1.2VisualC++6.0概述...........................................................................................9
2推箱子游戏软件总体设计.............................................................................................92.12.2
推箱子游戏软件总体设计思想.......................................................................9总体设计流程图.............................................................................................11两个主要问题.................................................................................................123.1.13.1.2
地图的生成............................................................................................12人或人和箱子的移动............................................................................12
3推箱子游戏软件详细设计...........................................................................................123.1
45致6
程序测试………………………………………………………………………………6课程设计总结...............................................................................................................14谢..................................................................................................................................15附录(程序源代码)...................................................................................................16
参考文献..............................................................................................错误!未定义书签。
前言随着计算机技术的发展,可视编程技术占有了越来越重要的作用。VisualC++6.0是一种功能强大行之有效的可视化编程工具。因此此软件是在VisualC++6.0环境下编写的。
对于我们,随着学习的深入,已经大体掌握了VisualC++6.0环境下的程序开发。为了将我们的编程能力提升到一个更高的水平,深化面向对象的编程思维和解决问题的能力,值此课程设计周期间,进行基于VisualC++6.0环境的软件开发,先以推箱子游戏作为开始,对VisualC++6.0环境和C语言的模块编程设计进行回忆和熟悉,有利于促进面向对象程序设计思想的理解,使得在此基础上的下一个软件的开发进行的更加顺利。
本文档详细叙述了基于VisualC++6.0环境下的推箱子游戏软件的设计过程以及程序源代码。
本文档从概要设计,详细设计,参考源程序代码以及显示程序运行的截屏等方面详尽的介绍了软件开发过程。
此次推箱子游戏软件的开发目的是使我们用最基础的C语言程序设计的方式来思考和解决问题的能力,并且可以掌握二维数组的使用、循环控制的使用、地图的设计和使用以及C语言语法。
本文档的安排如下:第一章主要介绍了VisualC++6.0编程环境。第二章主要的介绍说明了推箱子游戏软件的编程思想和详细设计。第三章主要对推箱子游戏软件进行调试,运行程序并截图,显示运行界面和结果。第四章主要介绍了软件开发过程中遇到的一些问题,对该软件进行的一个总结。程序在设计的过程中遇到的问题已及时更正,但由于编者的能力和水平有限,推箱子游戏软件和文档中不免会出现一些不期待的错误,望文档读者能够理解和体谅,并欢迎提醒和纠正,在此表示感谢以及敬意。
摘要私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に1週間手配して、私達にVisualC++の課程の設計の実習を行わせます.
このファイルの詳しい説明はVisualC++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは箱を押して遊戯することです。
つきましてはこのソフトウェアの機能は、ユーザーは字の符を輸入する。字の符“a”は向左走を代表して、字の符“s”は代表して下で歩いて、字の符“d”は向右走を代表して、字の符“w”は向上して行くことを代表して、人を制御することは箱を行き先を押すことができてすぐ勝利した。ソフトウェアの目的は人を鍛錬する能力を思惟することです。
以下は課程仕様を通過して、順序ソフトウェアからの説明が提示することを操作して、手順は説明することを調節して、総括した方面を開発して、この手順を詳説する製造した過程和作は用いる、諸般のが執行されることができる操縦。
关键字:箱が遊戯を押す,VC++6.0,
源手順
1课程设计概述1.1推箱子游戏软件功能概述
在一个狭小的仓库中,把木箱放到指定的位置,通过控制人的走向来推箱子移动,箱子只能推动不能拉动,一次只能推动一个箱子。
稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道。
通过此游戏可以锻炼一个人的逻辑思维能力。
1.2VisualC++6.0概述
VisualC++是微软公司的重要产品之一,是一种功能强大行之有效的可视化编程工具。它提供了MFC类库,使用户可以方便的开发自己想实现的功能。VisualC++6.0的主要特点:
(1)自动化和宏功能。
(2)可以灵活地定制工具栏和菜单。
(3)可以直接运行和调试程序,还可以使用宏语言来自动操作调试器。(4)支持Internet连接。(5)一个新的便捷的项目系统可以允许一个工作区内包含多个不同的项目类型。(6)在工作区内可以包含多个并列的工程文件。
(7)可以在对话框中使用WizardBar将程序同可视化元素联系起来。
(8)FindinFile命令支持两个独立的输出窗格,可以保存上一次搜索的结果。这些新特性可以更好地利用VisualC++开发工具进行Windows应用程序开发。
2推箱子游戏软件总体设计2.1推箱子游戏软件总体设计思想
推箱子游戏软件的功能是锻炼人的逻辑思维能力。推箱子游戏软件的功能模块有:
(1)提供菜单界面,方便用户对程序个功能进行选择,选择要实现的功能按相应的键进入该功能。
(2)地图的生成,用二维整型数组来构成地图,其中数字代表特殊的符号。(3)移动,人或人和箱的移动,接受用户输入的一个字符,控制人的走向,并且可以在允许的情况下推动箱子。
(4)清屏功能,使用了清屏函数,当在游戏中时可以直接返回主菜单,(5)利用了辅助色彩函数,使游戏界面更加好看,美观。
在源程序中声明并定义了
voiddraw_map(intmap[10][12])//地图函数,voidmove(intmap[10][12])//移动函数使用了:
#include 程序中还应用了:printf(“\\a”);//发出警报声Static(intcount);//统计步数程序分为多个小模块,通过调用实现各种功能,增强了程序的可建设性。 2.2总体设计流程图 程序开始 菜单界面友好界面请选关数清屏返回菜单界面 退出界面欢迎玩【推箱子游】1或2关 进行游戏 每次按键都会执行清屏功能 按q键控制 按3键 1,2关游戏胜利 程序结束图2-1-2总体设计流程 3推箱子游戏软件详细设计3.1两个主要问题 设计中的两个主要需解决的问题是:怎样生成地图、怎样实现人或人和箱子的移动。3.1.1 地图的生成 设计中用二维整型数组中的数字元素表示不同的物体,比如0代表空地,1代表墙,2代表非游戏的填充内容(非必须内容),可以使地图规则,3代表目的地,4代表箱子,6代表人。然后用一个switch语句给每个数字赋予不同的符号,在输出二维数组,生成地图。3.1.2 人或人和箱子的移动 设计中要想使人移动,首先要找到人的起始位置,然后才能开始移动。人向四个方向移动的原理是相同的,我们可以先研究一个方向的移动,找到人的位置后,以人向上走为例,因为向上走嘛(可以通过数组下标表示)。 (1)要判断人前面(上一行),是否为空地,是空地则可以移动,移动后判断并改变人员原位置的数值元素和空地原位置的数值元素;否则不移动。 (2)如果人前面是目的地,人也是可以移动的,同样判断人原位置数值元素,并改变人员位置的数值元素和前一位置的数值元素。 (3)如果人前是在空地上的箱子。如果箱子前面又是空地,则可以移动,改变箱子前位置的数值元素,还是判断原位置的数值元素,然后改之;如果箱子前为目的地,和上面说的一样移动和改数值元素,只是多了计分这一步。 (4)如果人前是已经进入目的地的箱子。如果箱子前又是空地,则可以移动箱子,但是要减分,改变空地位置的数值元素,判断人和箱子原地的数值元素,并改之;如果箱子前是另一目的地,方法同上,只是不减分。用分数控制箱子是否已全在目的地。 (5)每一次的移动,必须要清屏,然后再显示一次地图,这样便可以实现人或人和箱子的移动 4程序测试开始游戏的友好界面 游戏界面 5课程设计总结5.1设计体会为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期一周的VisualC++课程设计实习,并安排了指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。 在此次推箱子游戏程序开发过程中,有很多东西值得我们思考并总结。开发过程大体可分为以下几个步骤: (1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整个程序大体需要的几个模块和其中用到的VisualC++语言基本操作符、语句等。 (2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。 (3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。 (4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。 (5)代码的调试:在VisualC++6.0环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。 (6)最后修饰:程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。 C语言是一门计算机基础语言,通过上一学期的学习,对于它的一些特点和算法有了一定程度的了解,并能够做一些中等的题目,但并没有完全掌握。这1周的课程设计正是让我们巩固以前的知识并在此基础上能够有所突破。 这次做的是推箱子,对于我来说有一定困难,因为我的C语言基础并不是很过硬,所以在开始我的程序并没有太大的进展,除了一个框架外并无其他任何功能,每天别人在绞尽脑汁想如何做程序的时候,我都会看着自己写的框架发呆,或者做一些与课程无关的事情,开始过的蛮无聊,蛮郁闷的,心情也不是很好。不过我一直在看课本,重温一下基础知识。最后几天我通过同学的帮助以及通过在网上查资料,终于设计出了比较理想的程序。虽然程序有的是COPY的,外形也不如别人的美观,可其中包含了我的心血以及我的理解。C语言是一门较难的语言,我感觉学的蛮累的,尤其是这1周的课程设计,我更体会到了这一点,虽然我们是在同一条起跑线上学习的,可每个人的能力都是不同的,有人掌握的好,也有人掌握的不是很好。而我属于中等,因此,在做设计的时候,单单靠我自己的能力是不行的,需要靠大家的帮忙,需要运用集体的智慧,需要大家团结合作。所以,通过1个礼拜的努力和同学的帮忙,我终于做出了比较传统的推箱子游戏,在此过程中,我体会到了失败后的失落,同时也体会到了成功后的喜悦,也许在以后的学习生活中我会更加体会到这一点。 5.2今后的改进意见此次程序设计,我们还有许多不足。我们用的是比较简单的语句。比如说for语句,switch语句,函数的定义与调用等。没有考虑到多关玩法,比如设计如何选关等。使此游戏失去了一定的可玩性、有趣性。同时与现在成熟的推箱子游戏相比,我们设计的界面比较单一,不够形象。所以我们还有很大的提升空间,今后我会继续学习如何应用c语言,做出更好的程序设计。 致谢最后,在这里郑重的感谢老师和同学的帮助,让我得到了许多意想不到的收获。也感谢学校提供给我们这次宝贵的实践机会,让我们可以动手动脑,大大提高了个人的能力和素质。 参考文献[1]马安鹏.VisualC++程序设计导学。北京:清华大学出版社,2002 [2]电子书籍.VisualC++技术内幕(第四版).网址:http://www.5xsoft.com [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重印) 6附录(程序源代码)#include charmove(chart,intmap[9][10]){inti,j,x,y; system(\"CLS\");for(i=0;i<9;i++){for(j=0;j<10;j++) if(map[i][j]==4||map[i][j]==6){x=i,y=j;};}switch(t){case'8': { if(map[x-1][y]==1)//如果人面前时路 {map[x-1][y]=4; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x-1][y]==3)//人面前是箱子{if(map[x-2][y]==2)//人前箱子 箱子前面是空位 {map[x-1][y]=4;map[x-2][y]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x-2][y]==0 map[x-2][y]==5)//人前是箱子 箱子前面是墙{printf(\"\\a\");} elseif(map[x-2][y]==1)//人前是箱子箱子 前面是路 {map[x-1][y]=4;map[x-2][y]=3; if(map[x][y]==4)map[x][y]=1; || map[x-2][y]==3 || 箱子已在空位上的箱子 //清屏 //查找当前人位置//标准输入输出头文件//system函数的头文件//getch函数的头文件 elsemap[x][y]=2;};} else if(map[x-1][y]==0)//人前是墙 {printf(\"\\a\");}elseif(map[x-1][y]==2){map[x-1][y]=6; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else 一个空位 {map[x-1][y]=6;map[x-2][y]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} elseif(map[x-2][y]==0||map[x-2][y]==3|| map[x-2][y]==5)//人前是已在空位是的箱子箱子前是墙的箱子 {printf(\"\\a\");} elseif(map[x-2][y]==1)//人前是已在空位上 的箱子 箱子前是路 {map[x-1][y]=6;map[x-2][y]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};}; };break; case'6': { if(map[x][y+1]==1)//如果人面前时路 {map[x][y+1]=4; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x][y+1]==3)//人面前是箱子{if(map[x][y+2]==2)//人前箱子 箱子前面是空位 {map[x][y+1]=4;map[x][y+2]=5; if(map[x][y]==4)map[x][y]=1; 箱子 已在空位上 if(map[x-1][y]==5)//人前是已在空位的箱子 箱子前是 {if(map[x-2][y]==2)//人前是已在空位是的箱子 elsemap[x][y]=2;} else if(map[x][y+2]==0 map[x][y+2]==5)//人前是箱子 箱子前面是墙{printf(\"\\a\");} elseif(map[x][y+2]==1)//人前是箱子箱子 前面是路 {map[x][y+1]=4;map[x][y+2]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};} else if(map[x][y+1]==0)//人前是墙 {printf(\"\\a\");}elseif(map[x][y+1]==2){map[x][y+1]=6; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else 一个空位 {map[x][y+1]=6;map[x][y+2]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} elseif(map[x][y+2]==0||map[x][y+2]==3|| map[x][y+2]==5)//人前是已在空位是的箱子箱子前是墙的箱子 {printf(\"\\a\");} elseif(map[x][y+2]==1)//人前是已在空位上 的箱子 箱子前是路 {map[x][y+1]=6;map[x][y+2]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};}; };break; case'2': 箱子 已在空位上 if(map[x][y+1]==5)//人前是已在空位的箱子 箱子前是 {if(map[x][y+2]==2)//人前是已在空位是的箱子 || map[x][y+2]==3 || 箱子已在空位上的箱子 {if(map[x+1][y]==1)//如果人面前时路 {map[x+1][y]=4; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x+1][y]==3)//人面前是箱子{if(map[x+2][y]==2)//人前箱子 箱子前面是空位 {map[x+1][y]=4;map[x+2][y]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x+2][y]==0 || map[x+2][y]==3 || map[x+2][y]==5)//人前是箱子箱子前面是墙箱子已在空位上的箱子 {printf(\"\\a\");} elseif(map[x+2][y]==1)//人前是箱子箱子 前面是路 {map[x+1][y]=4;map[x+2][y]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};} else if(map[x+1][y]==0)//人前是墙 {printf(\"\\a\");}elseif(map[x+1][y]==2){map[x+1][y]=6; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else 一个空位 {map[x+1][y]=6;map[x+2][y]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} elseif(map[x+2][y]==0||map[x+2][y]==3|| map[x+2][y]==5)//人前是已在空位是的箱子箱子前是墙的箱子 {printf(\"\\a\");} 箱子 已在空位上 if(map[x+1][y]==5)//人前是已在空位的箱子 箱子前是 {if(map[x+2][y]==2)//人前是已在空位是的箱子 elseif(map[x+2][y]==1)//人前是已在空位上 的箱子 箱子前是路 {map[x+1][y]=6;map[x+2][y]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};}; };break; case'4': { if(map[x][y-1]==1)//如果人面前时路 {map[x][y-1]=4; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x][y-1]==3)//人面前是箱子{if(map[x][y-2]==2)//人前箱子 箱子前面是空位 {map[x][y-1]=4;map[x][y-2]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x][y-2]==0 map[x][y-2]==5)//人前是箱子 箱子前面是墙{printf(\"\\a\");} elseif(map[x][y-2]==1)//人前是箱子箱子 前面是路 {map[x][y-1]=4;map[x][y-2]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};} else if(map[x][y-1]==0)//人前是墙 {printf(\"\\a\");}elseif(map[x][y-1]==2){map[x][y-1]=6; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} else if(map[x][y-1]==5)//人前是已在空位的箱子 箱子前是 {if(map[x][y-2]==2)//人前是已在空位是的箱子 || map[x][y-2]==3 || 箱子已在空位上的箱子 一个空位 {map[x][y-1]=6;map[x][y-2]=5; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;} elseif(map[x][y-2]==0||map[x][y-2]==3|| map[x][y-2]==5)//人前是已在空位是的箱子箱子前是墙的箱子 {printf(\"\\a\");} elseif(map[x][y-2]==1)//人前是已在空位上 的箱子 箱子前是路 {map[x][y-1]=6;map[x][y-2]=3; if(map[x][y]==4)map[x][y]=1; elsemap[x][y]=2;};}; };break;} map1(map); 箱子 已在空位上 return(map[9][10]); } intmap1(inta[9][10]){inti,j; staticintcount=0;system(\"cls\");printf(\"\\n\\n\\\表空位\\n\\\\n\\\\\ 欢迎选玩*【推箱子游戏】O(∩_∩)O~~~ □:代表墙 ×:代表路 ○:代4:向左 ♀:代表人 ※:代表箱子已在空位上 \\n\\n\\\\\游戏规则:\\n\\ ●:代表箱子 8:向上移动\\n\\\\\2:向下移动\\n\\\\\ 移动\\n\\\\\for(i=0;i<9;i++) 6:向右移动\\n\\\\\\"); \"); {printf(\"\\n\\\\ {switch(a[i][j]){case0: for(j=0;j<10;j++) printf(\"□\");break;//\"□\"代表墙case1: printf(\"×\");break;//\"×\"代表路case2: printf(\"○\");break;//\"○\"代表空位case3: printf(\"●\");break;//\"●\"代表箱子case4: printf(\"♀\");break;//\"♀\"代表人case5: printf(\"※\");break;//\"※\"代表箱子已在空位上case6: printf(\"♀\");break;} }} printf(\"\\n\\\\步数:%d\printf(\"\\n\\\\\");return(a[9][10]);} intmain(){charc; intmap[9][10]={{0,0,0,0,0,0,0,0,0,0},{0,0,0,1,1,2,1,0,0,0},{0,1,3,2,3,3,3,1,1,0},{0,1,0,1,0,2,1,0,1,0}, {0,1,4,2,1,2,1,0,1,0},{0,0,0,0,1,3,1,1,1,0},{0,0,0,0,3,2,0,0,0,0},{0,0,0,0,1,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};system(\"colorE9\");map1(map);while(1){c=getch(); if(c=='8'||c=='6'{move(c,map);}}} c=='2'c=='4')|||| 因篇幅问题不能全部显示,请点此查看更多更全内容