2024年6月5日发(作者:)

山东交通学院

C语言课程设计

推箱子游戏

院(系)别 信息工程系

班 级 信息093

学 号 *********

姓 名 贺可晓

指导教师 ******

时 间 2011-08-28—2011-09-12

课 程 设 计 任 务 书

题 目 推箱子

系 (部) 信息工程系

专 业 电气工程及其自动化

班 级 电气102班

学生姓名 贺可晓

学 号 *********

08 月 28 日至 09 月 2 日 共 1 周

指导教师(签字)

系 主 任(签字)

2011 09 02

一、设计内容及要求:

(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或2或3 或q

输入1 输入2

是 是

输出地图1

输入按键

输出地图2

输入按键

是 是

input=q

Input=q

否 否

推箱子移动

推箱子移动

箱子都到

目的地

箱子都到

目的地

是 是

第一关结束

在输入按键

游戏通关

Input=y

结束

四、进程安排

第一天:分析问题,找出大体的设计思路。

第二天:构造出程序大体框架,即各种功能模块的组合。

第三天:分别写出个功能模块程序的源代码。

第四天:讲个功能模块加入主程序中,并实现所有的程序基本功能。

第五天:优化程序中的不足之处,优化显示界面,添加辅助功能模块增加程序

的趣味性。使程序软件更加适宜用户的操作和娱乐需要。

第六天:准备程序答辩。

五、主要参考资料

[1]谭浩强,C程序设计(第三版)。北京:清华大学出版社,2005(2007重印)

[2]马安鹏.Visual C++程序设计导学。北京:清华大学出版社,2002

[3] ,. Small C++ How to Program.2006.

[4]Richard ker,Tom Archer. Visual C++ 6 宝典.张艳,张谦译.北京:

电子工业出版社,1999

[5] Beck oft Visual Visual C++ 6.0程序员指南.希望图书

创作室译.北京:北京希望电脑公司出品,1998

成 绩 评 定 表

口试(答辩)成绩

报告成绩

总评成绩

摘要

私達の実践の能力を高めるため、学んだ知識を運用することができて行って更

に創造して、学校は特に1週間手配して、私達にVisual C++の課程の設計の実習

を行わせます.

このファイルの詳しい説明はVisual C++6.0環境の下で、1つのソフトウェア

の過程を設計して、このソフトウェアは箱を押して遊戯することです。

つきましてはこのソフトウェアの機能は、ユーザーは字の符を輸入する。字の

符“a”は向左走を代表して、字の符“s”は代表して下で歩いて、字の符“d”は

向右走を代表して、字の符“w”は向上して行くことを代表して、人を制御するこ

とは箱を行き先を押すことができてすぐ勝利した。ソフトウェアの目的は人を鍛錬

する能力を思惟することです。

以下は課程仕様を通過して、順序ソフトウェアからの説明が提示することを操

作して、手順は説明することを調節して、総括した方面を開発して、この手順を詳

説する製造した過程和作は用いる、諸般のが執行されることができる操縦。

关键字:箱が遊戯を押す,VC++6.0, 源手順

目 录

前 言 ................................................................. 1

1 课程设计概述 ....................................................... 2

1.1

1.2

2

2.1

2.2

3

3.1

推箱子游戏软件功能概述 ....................................... 2

Visual C++6.0概述 ........................................... 2

推箱子游戏软件总体设计思想 ................................... 2

总体设计流程图 ............................................... 4

两个主要问题 ................................................. 5

3.1.1 地图的生成 .............................................. 5

3.1.2 人或人和箱子的移动 ...................................... 5

4

程序测试 ............................................ 错误!未定义书签。

4.1

4.2

5

菜单界面 ..................................... 错误!未定义书签。

游戏中的界面 ................................. 错误!未定义书签。

推箱子游戏软件总体设计 .............................................. 2

推箱子游戏软件详细设计 .............................................. 5

课程设计总结 ........................................................ 6

致 谢 ................................................................. 6

参考文献 ............................................................... 7

6

附录(程序源代码) .................................................. 8

山东交通学院课程设计报告

前 言

随着计算机技术的发展,可视编程技术占有了越来越重要的作用。Visual

C++6.0 是一种功能强大行之有效的可视化编程工具。因此此软件是在Visual

C++6.0环境下编写的。对于我们,随着学习的深入,已经大体掌握了Visual C++6.0

环境下的程序开发。为了将我们的编程能力提升到一个更高的水平,深化面向对象

的编程思维和解决问题的能力,值此课程设计周期间,进行基于Visual C++6.0环

境的软件开发,先以推箱子游戏作为开始,对Visual C++6.0环境和C语言的模块

编程设计进行回忆和熟悉,有利于促进面向对象程序设计思想的理解,使得在此基

础上的下一个软件的开发进行的更加顺利。

本文档详细叙述了基于Visual C++6.0环境下的推箱子游戏软件的设计过程以

及程序源代码。

本文档从概要设计,详细设计,参考源程序代码以及显示程序运行的截屏等方

面详尽的介绍了软件开发过程。

此次推箱子游戏软件的开发目的是使我们用最基础的C语言程序设计的方式来

思考和解决问题的能力,并且可以掌握二维数组的使用、循环控制的使用、地图的

设计和使用以及C语言语法。

本文档的安排如下:

第一章 主要介绍了对面向对象C++语言以及Visual C++6.0编程环境。

第二章 主要的介绍说明了推箱子游戏软件的编程思想和详细设计。

第三章 主要对推箱子游戏软件进行调试,运行程序并截图,显示运行界面

和结果。

第四章 主要介绍了软件开发过程中遇到的一些问题,对该软件进行的一个

总结。

程序在设计的过程中遇到的问题已及时更正,但由于编者的能力和水平有限,

推箱子游戏软件和文档中不免会出现一些不期待的错误,望文档读者能够理解和体

谅,并欢迎提醒和纠正,在此表示感谢以及敬意。

1

班级:信息093 姓名:陈新龙 学号:090810313

1 课程设计概述

1.1 推箱子游戏软件功能概述

在一个狭小的仓库中,把木箱放到指定的位置,通过控制人的走向来推箱子移动,

箱子只能推动不能拉动,一次只能推动一个箱子。

稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有

限的空间和通道。

通过此游戏可以锻炼一个人的逻辑思维能力。

1.2 Visual C++6.0概述

Visual C++是微软公司的重要产品之一, 是一种功能强大行之有效的可视化编

程工具。它提供了MFC类库,使用户可以方便的开发自己想实现的功能。Visual C++6.0

的主要特点:

(1)自动化和宏功能。

(2)可以灵活地定制工具栏和菜单。

(3)可以直接运行和调试程序,还可以使用宏语言来自动操作调试器。

(4)支持Internet连接。

(5)一个新的便捷的项目系统可以允许一个工作区内包含多个不同的项目类型。

(6)在工作区内可以包含多个并列的工程文件。

(7)可以在对话框中使用WizardBar将程序同可视化元素联系起来。

(8)Find in File命令支持两个独立的输出窗格,可以保存上一次搜索的结果。

这些新特性可以更好地利用Visual C++开发工具进行Windows应用程序开发。

2 推箱子游戏软件总体设计

2.1 推箱子游戏软件总体设计思想

推箱子游戏软件的功能是锻炼人的逻辑思维能力。

推箱子游戏软件的功能模块有:

(1)提供菜单界面,方便用户对程序个功能进行选择,选择要实现的功能按相

应的键进入该功能。

2

山东交通学院课程设计报告

(2)地图的生成,用二维整型数组来构成地图,其中数字代表特殊的符号。

(3)移动,人或人和箱的移动,接受用户输入的一个字符,控制人的走向,并

且可以在允许的情况下推动箱子。

(4)时间的统计,可以看整个程序(相当于游戏)运行时所用的时间。

(5)清屏功能,使用了清屏函数,当在游戏中时可以直接返回主菜单,

(6)利用了辅助色彩函数,使游戏界面更加好看,美观。

在源程序中声明并定义了void draw_map(int map[10][12]) //地图函数,

void move(int map[10][12]) //移动函数

使用了:#include //标准输入输出头文件

#include //system函数的头文件

#include //getch函数的头文件

#include "time.h" //调用时间函数的头文件

多种头文件。

程序中还应用了全局变量:char le; //控制关数的全局变量

char input; //接收按键字符

程序分为多个小模块,通过调用实现各种功能,增强了程序的可建设性。

3

班级:信息093 姓名:陈新龙 学号:090810313

2.2 总体设计流程图

程序开

菜单界面

退

1

2

q

3

1,2关游戏胜利

图2-1-2 总体设计流程

4

山东交通学院课程设计报告

3 推箱子游戏软件详细设计

3.1 两个主要问题

设计中的两个主要需解决的问题是:怎样生成地图、怎样实现人或人和箱子的移

动。

3.1.1 地图的生成

设计中用二维整型数组中的数字元素表示不同的物体,比如0代表空地,1代表

墙,2代表非游戏的填充内容(非必须内容),可以使地图规则,3代表目的地,4代

表箱子,6代表人。然后用一个switch语句给每个数字赋予不同的符号,在输出二

维数组,生成地图。

3.1.2 人或人和箱子的移动

设计中要想使人移动,首先要找到人的起始位置,然后才能开始移动。人向四个

方向移动的原理是相同的,我们可以先研究一个方向的移动,找到人的位置后,以人

向上走为例,因为向上走嘛(可以通过 数组下标表示)。

(1)要判断人前面(上一行),是否为空地,是空地则可以移动,移动后判断并

改变人员原位置的数值元素和空地原位置的数值元素;否则不移动。

(2)如果人前面是目的地,人也是可以移动的,同样判断人原位置数值元素,

并改变人员位置的数值元素和前一位置的数值元素。

(3)如果人前是在空地上的箱子。如果箱子前面又是空地,则可以移动,改变

箱子前位置的数值元素,还是判断原位置的数值元素,然后改之;如果箱子前为目的

地,和上面说的一样移动和改数值元素,只是多了计分这一步。

(4)如果人前是已经进入目的地的箱子。如果箱子前又是空地,则可以移动箱

子,但是要减分,改变空地位置的数值元素,判断人和箱子原地的数值元素,并改之;

如果箱子前是另一目的地,方法同上,只是不减分。用分数控制箱子是否已全在目的

地。

(5)每一次的移动,必须要清屏,然后再显示一次地图,这样便可以实现人或

人和箱子的移动。

5

山东交通学院课程设计报告

4 课程设计总结

为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,

学校特安排我们进行为期一周的Visual C++课程设计实习,并安排了指导老师帮助

辅导,让我们在规范化、严谨化、实用化上面有了很大进展。

在此次推箱子游戏程序开发过程中,有很多东西值得我们思考并总结。

开发过程大体可分为以下几个步骤:

(1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整

个程序大体需要的几个模块和其中用到的Visual C++语言基本操作符、语句等。

(2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。

(3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流

程图的形式展现.并想好实现的关键代码。

(4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环

节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功

能,达到预期效果也将是一项繁复的工作。

(5)代码的调试:在Visual C++6.0环境下输入代码并进行调试和正确运行。

在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程

序。

(6)最后修饰:程序可以正确运行之后,再不影响程序功能的情况下,运用各

种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。

通过这次课程设计,使我们更加熟悉的掌握了Visual C++语言的运用。帮助我

们熟悉了更多Visual C++语言的功能,提高了我们的动手能力,学到了许多解决实

际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编

程也更有兴趣。我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能

还没开始就退缩,要勇于拼搏,敢于创新。

致 谢

最后,在这里郑重的感谢张老师的帮助,让我得到了许多意想不到的收获。也感

谢学校提供给我们这次宝贵的实践机会,让我们可以动手动脑,大大提高了个人的能

力和素质。

6

参考文献

[1] 马安鹏.Visual C++程序设计导学。北京:清华大学出版社,2002

[2] 电子书籍. Visual C++技术内幕(第四版).网址:

[3] Beck oft Visual Visual C++ 6.0程序员指南.希望图书

创作室译.北京:北京希望电脑公司出品,1998

[4]Richard ker,Tom Archer. Visual C++ 6 宝典.张艳,张谦译.北京:

电子工业出版社,1999

[5] 李强,贾云霞. Visual C++项目开发实践.北京:中国铁道出版社,2004

[6] 郑莉,董渊,张瑞丰.C++语言程序设计.2003.

[7] ,. Small C++ How to Program.2006.

[8]谭浩强,C程序设计(第三版)。北京:清华大学出版社,2005(2007重印)

5 附录(程序源代码)

#include //标准输入输出头文件

#include //system函数的头文件

#include //getch函数的头文件

#include "time.h" //调用时

int map1(int a[9][10]);

char move(char t,int map[9][10])

{int i,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 'w':

{ if(map[x-1][y]==1)//如果人面前时路

{map[x-1][y]=4;

if(map[x][y]==4) map[x][y]=1;

else map[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;

else

if(map[x-2][y]==0

{printf("a");}

|| map[x-2][y]==3 ||

else map[x][y]=2;}

map[x-2][y]==5)//人前是箱子 箱子前面是墙 箱子 已在空位上的箱子

else if(map[x-2][y]==1)// 人前是箱子 箱子

{map[x-1][y]=4;map[x-2][y]=3;

前面是路

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;};}

{printf("a");}

{map[x-1][y]=6;

else if(map[x-1][y]==0) //人前是墙

else if(map[x-1][y]==2)

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;}

else if(map[x-1][y]==5)//人前是已在空位的箱子

{if(map[x-2][y]==2)//人前是已在空位是的箱子 箱子前是

{map[x-1][y]=6;map[x-2][y]=5;

if(map[x][y]==4) map[x][y]=1;

else if(map[x-2][y]==0 || map[x-2][y]==3 ||

一个空位

else map[x][y]=2;}

map[x-2][y]==5)//人前是已在空位是的箱子 箱子前是墙 箱子 已在空位上

的箱子

case 'd':

{printf("a");}

else if(map[x-2][y]==1)//人前是已在空位上

{map[x-1][y]=6;map[x-2][y]=3;

if(map[x][y]==4) map[x][y]=1;

的箱子 箱子前是路

else map[x][y]=2;};};

};break;

{ if(map[x][y+1]==1)//如果人面前时路

{map[x][y+1]=4;

if(map[x][y]==4) map[x][y]=1;

else map[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;

else map[x][y]=2;}

else

if(map[x][y+2]==0

{printf("a");}

|| map[x][y+2]==3 ||

map[x][y+2]==5)//人前是箱子 箱子前面是墙 箱子 已在空位上的箱子

else if(map[x][y+2]==1)// 人前是箱子 箱子

{map[x][y+1]=4;map[x][y+2]=3;

前面是路

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;};}

{printf("a");}

{map[x][y+1]=6;

else if(map[x][y+1]==0) //人前是墙

else if(map[x][y+1]==2)

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;}

else if(map[x][y+1]==5)//人前是已在空位的箱子

{if(map[x][y+2]==2)//人前是已在空位是的箱子 箱子前是

{map[x][y+1]=6;map[x][y+2]=5;

if(map[x][y]==4) map[x][y]=1;

else if(map[x][y+2]==0 || map[x][y+2]==3 ||

一个空位

else map[x][y]=2;}

map[x][y+2]==5)//人前是已在空位是的箱子 箱子前是墙 箱子 已在空位上

的箱子

{printf("a");}

else if(map[x][y+2]==1)//人前是已在空位上

{map[x][y+1]=6;map[x][y+2]=3;

if(map[x][y]==4) map[x][y]=1;

的箱子 箱子前是路

else map[x][y]=2;};};

};break;

case 's':

{ if(map[x+1][y]==1)//如果人面前时路

{map[x+1][y]=4;

if(map[x][y]==4) map[x][y]=1;

else map[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;

else

if(map[x+2][y]==0

{printf("a");}

|| map[x+2][y]==3 ||

else map[x][y]=2;}

map[x+2][y]==5)//人前是箱子 箱子前面是墙 箱子 已在空位上的箱子

else if(map[x+2][y]==1)// 人前是箱子 箱子

{map[x+1][y]=4;map[x+2][y]=3;

前面是路

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;};}

{printf("a");}

{map[x+1][y]=6;

else if(map[x+1][y]==0) //人前是墙

else if(map[x+1][y]==2)

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;}

else if(map[x+1][y]==5)//人前是已在空位的箱子

{if(map[x+2][y]==2)//人前是已在空位是的箱子 箱子前是

{map[x+1][y]=6;map[x+2][y]=5;

if(map[x][y]==4) map[x][y]=1;

else if(map[x+2][y]==0 || map[x+2][y]==3 ||

一个空位

else map[x][y]=2;}

map[x+2][y]==5)//人前是已在空位是的箱子 箱子前是墙 箱子 已在空位上

的箱子

{printf("a");}

else if(map[x+2][y]==1)//人前是已在空位上

{map[x+1][y]=6;map[x+2][y]=3;

if(map[x][y]==4) map[x][y]=1;

的箱子 箱子前是路

else map[x][y]=2;};};

};break;

{ if(map[x][y-1]==1)//如果人面前时路

{map[x][y-1]=4;

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;}

else

if(map[x][y-1]==3)//人面前是箱子

case 'a':

{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;

else

if(map[x][y-2]==0

{printf("a");}

|| map[x][y-2]==3 ||

else map[x][y]=2;}

map[x][y-2]==5)//人前是箱子 箱子前面是墙 箱子 已在空位上的箱子

else if(map[x][y-2]==1)// 人前是箱子 箱子

{map[x][y-1]=4;map[x][y-2]=3;

前面是路

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;};}

{printf("a");}

{map[x][y-1]=6;

else if(map[x][y-1]==0) //人前是墙

else if(map[x][y-1]==2)

if(map[x][y]==4) map[x][y]=1;

else map[x][y]=2;}

else if(map[x][y-1]==5)//人前是已在空位的箱子

{if(map[x][y-2]==2)//人前是已在空位是的箱子 箱子前是

一个空位

{map[x][y-1]=6;map[x][y-2]=5;

if(map[x][y]==4) map[x][y]=1;

else if(map[x][y-2]==0 || map[x][y-2]==3 ||

else map[x][y]=2;}

map[x][y-2]==5)//人前是已在空位是的箱子 箱子前是墙 箱子 已在空位上

的箱子

return (map[9][10]);

}

int map1(int a[9][10])

{int i,j;

static int count=0;

system("cls");

printf("nnttt 欢迎玩*【推箱子游戏】*^-^*n □:代表墙 ×:代表

路 ○:代表空位 ●:代表箱子n ♀:代表人 ☆:代表箱子已在空位上n w:

向上n s:向下n a:向左n a:向右n");

for(i=0;i<9;i++)

{printf("a");}

else if(map[x][y-2]==1)//人前是已在空位上

{map[x][y-1]=6;map[x][y-2]=3;

if(map[x][y]==4) map[x][y]=1;

的箱子 箱子前是路

else map[x][y]=2;};};

};break;}

map1(map);

{printf("ntttt");

for(j=0;j<10;j++)

{switch(a[i][j])

{case 0:

printf("□");break;//"□"代表墙

case 1:

}

}

printf("ntttt步数:%d",count++);

printf("ntttt");

return (a[9][10]);

}

int main()

{char c;

printf("×");break;//"×"代表路

printf("○");break;//"○"代表空位

printf("●");break;//"●"代表箱子

printf("♀");break;//"♀"代表人

case 5:

printf("☆");break;//"☆"代表箱子已在空位上

case 6:

printf("♀");break;}

case 2:

case 3:

case 4:

int map[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("color E4");

map1(map);

loop:

c=getch();

if(c=='w' || c=='a' || c=='s' || c=='d')

{ move(c,map);goto loop;}

}