迷宫 C语言课程设计

  • 格式:doc
  • 大小:97.00 KB
  • 文档页数:17

经济与管理学院

《C高级语言程序设计》

课程设计报告

(2013/2014学年 第一学期)

学生姓名:

专业班级:

学生学号:

指导教师:

2013年 12 月 23 日

《迷宫》的设计与实现

目录

第一章 课程设计目的和要求.................................1

1.1 目的...............................................1

1.2 要求...............................................1

第二章 课程设计任务内容...................................1

2.1 游戏简介..........................................2 2.2 设计流程...........................................2

第三章 详细设计说明.......................................3

3.1 函数功能说明.......................................3

3.2 参数说明...........................................3

3.3 函数流程图.........................................4

第四章 软件测试方案.......................................7

第五章 软件使用说明......................................12

第六章 课程设计心得与体会................................13

附录一 :参考文献........................................10

附录二 :程序清单........................................11

1 第一章 课程设计的目的与要求

1.1目的

通过本课程设计熟悉《C高级语言程序设计》的程序设计方法以及对“数据结构”的掌握和运用,还有堆栈,文件和指针、变量等初级编程语言的熟练运用,将这些知识进一步的掌握和运用到实践当中。

1)综合运用C高级语言课程和其他选修课程的知识,提高分析和解决实际问题的的能力,进一步巩固、加深和拓宽所学的知识;进一步加强结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解。

2)掌握程序设计中的常用算法和C语言的编程技巧和上机调试程序的方法。

3)在实践过程中,提高如何综合运用所学知识解决实际问题的能力.

1.2功能要求

在本次设计中,主要实现以下系统系统功能菜单,主要有11项功能菜单,依次为:

1)打开迷宫文件;

2)保存迷宫文件;

3)设置迷宫系统参数和数据结构;

4)运行迷宫路径搜索;

5)停止迷宫路径搜索;

6)帮助菜单;

7)设置迷宫入口位置(红旗);

8)设置迷宫出口位置(蓝旗);

9)设置迷宫中的障碍物,再次单击取消;

10)消除迷宫中的障碍物;

11)保存迷宫中的障碍物设置;

第二章 课程设计任务内容

2.1游戏简介

本报告主要是运用C++语言,编写一个小型的游戏—迷宫(一人完成)。迷宫的结构布局可自定义设置,骑士从迷宫入口走进迷宫,迷宫中设置很多墙壁,对前进方

2 向形成了多处障碍,骑士需要在迷宫中寻找通路以到达出口。

2.2 设计流程

本次设计将迷宫的结构设计布局设计成由起点(红旗,深色),终点(蓝旗,灰色),围墙(最外一圈),障碍(黑色)和可通过点(空白处,表示可通过)这五部分组成,其中,迷宫起点,终点和障碍物可由玩家自定义设置。

在搜索迷宫时,从起点出发,若遇到围墙或障碍则表示不能通过。只有当下一个路径是可通过的时候,才能继续往下搜索,否则尝试下一个方向。本系统主要使用堆栈的算法,实现了路径试探查询和最快路径查询这两种路径查询方法,包括了四方向和八方向两种路径探寻方向。

为了搜索一条通往终点的路径,玩家从起点开始出发,对途中经过的每一个位置的四个方向进行探索,如果有一个方向可通,既往那个方向前进一步,然后搜索新位置的每个方向,直到搜索到终点为止,若一个位置的四个方向均不通,则返回这个位置的上一个方向,搜索上一个位置的下一个方向的路径。

堆栈算法在迷宫的求解过程主要采用回溯法,即在一定的约束条件下试探地搜索前进若前进中受阻(碰上围墙)或障碍或是已经走过的路......则返回并向下一个方向进行新的搜索。

1)运用堆栈进行搜索时,按照一个既定的方向顺序进行搜索,每搜索到一个可通过点,即将该点的位置压入堆栈,直到探索到终点位置时结束搜索。

2)如果在搜索中发现该方向不通,既尝试下一个方向。

3)如果所有的方向都不通,则表示这个位置是个不可通过点,可以为该点设置一个“脚印”标志,然后将该位置出栈,返回到上一个位置进行它的下一个方向的搜索。

4)最终当堆栈为空时(连起点也出栈了),就表明该迷宫不能出去。当在探索过程中发现了终点,就表明探索到了一个出路。

在此次设计中,主要解决以下几个问题。

1)怎么样表示迷宫的数据结构;

2)怎么样试探方向;

3)复习栈的知识,解决栈的设计问题;

4)如何防止重复到达某点以避免死循环;

第三章 详细设计说明

3 3.1 函数功能说明

本设计中主要调用getNext_stackValidCell()函数实现回溯法搜索路径。

原理:对当前点(nCol,nRow)的nextDirection这个方向进行搜索,如果这个方向没有路径,则继续搜索下一个方向(nextDirection++)

返回值:如果找到终点,则函数返回2,如果找到一个方向的可通点,则返回这个可通过点(nCol,nRow)和从原来那个点到现在这个可通过点的方向(nextDirection).

3.2参数说明

3.2.1 枚举

如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来变量的值只能在列举的范围内。

声明枚举类型的一般形式为

enum 枚举类型名{枚举常量列表}

1)表示m_pMazeDate[y][x]的值的具体意义

enum

{MAZE_NORMAL=-1,

MAZE_SELECTED=-2,

MAZE_START=-3,

MAZE_END=-4,

MAZE_WALL=-5,

MAZE_STONE=-6,

MAZE_FOOTMARK=-7,

MAZE_PATH=0,

MAZE_PATH_TOP=1,

MAZE_PATH_RIGHTTOP=2,

MAZE_PATH_RIGHT=3,

MAZE_PATH_RIGHTDOWN=4,

MAZE_PATH_BOTTOM=5,

MAZE_PATH_LEFTBOTTOM=6,

4 MAZE_PATH_LEFT=7,

MAZE_PATH_LEFTTOP=8};

2)八个用来搜索方向

enum

{MAZE_TOP=1,

MAZE_RIGHTTOP=2,

MAZE_RIGHT=3,

MAZE_RIGHTDOWN=4,

MAZE_BOTTOM=5,

MAZE_LEFTBOTTOM=6,

MAZE_LEFT=7,

MAZE_LEFTTOP=8};

3.2.2 宏

可以用#define命令将一个指定的标识符(即宏名)来代表一个字符串。定义宏的作用一般是用一个短的名字代表一个长的字符串。它的一般形式为

#define 标识符 字符串

#define WM_SETTIG_UPDATE 10001 //更新迷宫

#define WM_DEFINE_MAZE 10002 //定义迷宫

3.2.3 逻辑型常量 bool

逻辑型变量要用类型标识符bool来定义,它的值只能是true(为1)和false(为0)之一,由于逻辑型变量用bool来定义,又称为布尔变量。

BOOL m_bShowProcess; //是4方向迷宫还是8方向迷宫

BOOL m_iProcessSpeed; //是否显示搜索过程,如果显示,在搜索过程中将向

视图类发送数据

3.3 函数流程图

5

!m_stackMaze.empty()?

nCurD<=0?

if(this->m_b4Directionon?

nRet==1 ?

oldCurPoint!=this->m-ptStart? (nRet==2?

oldCurPoint!=this->m_ptStart?

oldCurPoint!=this->m-ptStart?

m_bShowProcess?

this->GetCellType(pCur.y,pCu

x=CMaze::MAZEr._START?

this->m_iProcessSpeed!=0?

m_bShowProcess

\

Cpoint pCur=m_stackMaze.top()

nCurD=this->GetCellType(pCur.y,pCur.x)

nCurD+=2 nCurd++

Cpoint oldCurPoint=pCur;

nRet=this->getNextValidCell(pCur.y,pCur.x,nCurD)

this->SetMazeCellType(oldCurPoint.y,oldCurPoint.x,Cmaze::MAZE_PATH+nCurD)

this->m_stackMaze.push(pCur);

ASSERT(FLASE)

this->SetMazeCellType(pCur.y,pCur.x,CMaze::MAZE_PATH) ::SendMessage(m_hViewWnd,WM_MAZEPATH_PROCESS,WPARAM(&pCur),nCurD